04 SpringBoot Docker CICD
04 SpringBoot Docker CICD
1. SpringBoot + ECR + GitHub Actions
1. 전체적인 흐름
2. EC2에 도커설치
1
2
3
4
5
6
7
8
9
10
11
sudo apt-get update && \
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo apt-key fingerprint 0EBFCD88 && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && \
sudo apt-get install -y docker-ce && \
sudo usermod -aG docker ubuntu && \
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
3. GitHub Actions용 사용자등록
1. note
- GitHub Actions가 ECR에 접근을 해야하기때문에 별도 사용자 등록이 필요함
2. 등록(기사용중인 권한이 있으면 그대로 사용)
4. ECR 생성
- 기존 패턴 동일(특이사항X)
4. EC2 - ECR
1. EC2의 ECR 인증 (공식 사이트 제공)
1
2
# 이 프로그램을 사용하라고 권장됨
sudo apt install amazon-ecr-credential-helper
2. config.json 생성(기준파일)
~경로에서.docker라는 폴더 만들고,config.json생성1 2 3
{ "credsStore": "ecr-login" }
3. IAM 에서 역할부여
- config.json이 있으면, iam에서 특정 역할을 부여해둘 경우 ECR접근이 가능하게됨(공식사이트 제공)
- 부여 방법
5. 깃허브액션 설정
1. deploy.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
name: Deploy To EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Github Repository 파일 불러오기
uses: actions/checkout@v4
- name: JDK 21버전 설치
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21
- name: application.yml 파일 만들기
run: echo "$" > ./src/main/resources/application.yml
- name: 테스트 및 빌드하기
run: |
chmod +x ./gradlew
./gradlew clean build
- name: AWS Resource에 접근할 수 있게 AWS credentials 설정
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ap-northeast-2
aws-access-key-id: $
aws-secret-access-key: $
- name: ECR에 로그인하기
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Docker 이미지 생성
run: docker build -t study-server .
- name: Docker 이미지에 Tag 붙이기
run: docker tag study-server $/study-server:latest
# 로그인(ECR에 로그인하기)하면 결과값이 나오는데 steps.login-ecr의 outputs.registry 값!
- name: ECR에 Docker 이미지 Push하기
run: docker push $/study-server:latest
- name: SSH로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
with:
host: $
username: $
key: $
script_stop: true
script: |
# 기존 서버가 있다면 정지
docker stop study-server || true
# 기존 서버 서버 삭제
docker rm study-server || true
# 신규 서버 데이터 Pull
docker pull $/study-server:latest
# 신규 서버 run
docker run -d --name study-server -p 8080:8080 $/study-server:latest
2. SpringBoot + ECR + S3 + CodeDeploy + GitHub Actions
1. 전체 흐름

- 개발자가 푸쉬를 하면,
- Github Actions에서 캐치를 해서,
- ECR에 접근해서 이미지 빌드 및 저장
- codeDeploy 사용에 필요한 (appspec.yml, scripts) 파일 압축
- 압축 파일 S3에 업로드(도커를 사용하기 때문에 빌드파일 압축안해도됨)
- github Actions에서 CodeDeploy 작업 요청
- codeDeploy는 S3에서 파일을 받아서
- EC2에서 도커에서 기존 파일 지우고 새로받아서 컨테이너 띄우도록 요청함
2. 깃허브 액션 파일
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
name: Deploy To EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Github Repository 파일 불러오기
uses: actions/checkout@v4
- name: JDK 17버전 설치
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: application.yml 파일 만들기
run: echo "$" > ./src/main/resources/application.yml
- name: 테스트 및 빌드하기
run: ./gradlew clean build
- name: AWS Resource에 접근할 수 있게 AWS credentials 설정
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ap-northeast-2
aws-access-key-id: $
aws-secret-access-key: $
- name: ECR에 로그인하기
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Docker 이미지 생성
run: docker build -t study-server .
- name: Docker 이미지에 Tag 붙이기
run: docker tag study-server $/study-server:latest
- name: ECR에 Docker 이미지 Push하기
run: docker push $/study-server:latest
- name: 압축하기
run: tar -czvf $GITHUB_SHA.tar.gz appspec.yml scripts
- name: S3에 프로젝트 폴더 업로드하기
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.tar.gz s3://study-server-bucket/$GITHUB_SHA.tar.gz
- name: Code Deploy를 활용해 EC2에 프로젝트 코드 배포
run: aws deploy create-deployment
--application-name study-server
--deployment-config-name CodeDeployDefault.AllAtOnce
--deployment-group-name Production
--s3-location bucket=study-server,bundleType=tgz,key=$GITHUB_SHA.tar.gz
3. appspec.yml(변동X)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: 0.0
os: linux
files:
# CodeDeploy가 S3로부터 가져온 파일 중 destination으로 이동시킬 대상을 지정한다.
# / 이라고 지정하면 S3로부터 가져온 전체 파일을 뜻한다.
- source: /
# CodeDeploy가 S3로부터 가져온 파일을 EC2의 어떤 경로에 저장할 지 지정한다.
destination: /home/ubuntu/study-server
permissions:
- object: /
owner: ubuntu
group: ubuntu
hooks:
ApplicationStart:
- location: scripts/start-server.sh
timeout: 60
runas: ubuntu
4. start.sh
1
2
3
4
5
6
7
8
#!/bin/bash
echo "--------------- 서버 배포 시작 -----------------"
docker stop study-server || true # 도커 기존작업 정지
docker rm study-server || true # 삭제
docker pull {ECR Repository 주소}/study-server:latest #ECR에서 URL 확인하고 최신버전을 pull
docker run -d --name study-server -p 8080:8080 {ECR Repository 주소}/study-server:lates # 실행!
echo "--------------- 서버 배포 끝 -----------------"
This post is licensed under CC BY 4.0 by the author.



