Skip to content

Commit 4263a72

Browse files
authored
Feat/237 zero downtime deploy (#255)
* refactor: continuous-deployment.yml에서 continuous-deployment-prod.yml 파일 이름 변경 * refactor: 개발 환경 continuous deployment 워크플로우 수정 * refactor: 운영 환경 continuous deployment 워크플로우 수정 * fix: s3 cp pipelone에서 prod property에서 dev property로 수정 Updated deployment workflow to use development configuration. * fix: EC2_HOST_DEV를 EC2_HOST로 수정
1 parent bbd97af commit 4263a72

2 files changed

Lines changed: 98 additions & 158 deletions

File tree

.github/workflows/continuous-deployment-dev.yml

Lines changed: 36 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,16 @@ permissions:
99
contents: read
1010

1111
env:
12-
AWS_REGION: ${{ secrets.AWS_REGION }}
13-
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
14-
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
15-
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
16-
EC2_HOST: ${{ secrets.EC2_HOST_DEV }}
17-
EC2_SSH_KEY: ${{ secrets.EC2_SSH_KEY }}
12+
AWS_REGION: ap-northeast-2
13+
S3_BUCKET_NAME: ject-bucket
14+
CODE_DEPLOY_APPLICATION_NAME: ject-apply-deployer
15+
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: actions-deployer
1816

1917
jobs:
20-
build-and-deploy:
18+
build-deploy:
2119
runs-on: ubuntu-latest
22-
2320
steps:
24-
- name: Checkout code
25-
uses: actions/checkout@v4
26-
27-
- name: Set up JDK 21
28-
uses: actions/setup-java@v4
29-
with:
30-
java-version: '21'
31-
distribution: 'temurin'
21+
- uses: actions/checkout@v4
3222

3323
- name: Cache Gradle packages
3424
uses: actions/cache@v4
@@ -40,67 +30,42 @@ jobs:
4030
restore-keys: |
4131
${{ runner.os }}-gradle-
4232
43-
- name: Grant execute permission for gradlew
44-
run: chmod +x gradlew
33+
- name: Set up JDK 21
34+
uses: actions/setup-java@v4
35+
with:
36+
java-version: '21'
37+
distribution: 'corretto'
4538

46-
- name: Copy the configuration file in S3
39+
- name: AWS credential 설정
40+
uses: aws-actions/configure-aws-credentials@v4
41+
with:
42+
aws-region: ${{ env.AWS_REGION }}
43+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
44+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
45+
46+
- name: S3에서 설정파일 복사
4747
run: |
4848
aws s3 cp s3://ject-bucket/properties/application-dev.yml \
4949
./src/main/resources/application-dev.yml
5050
51-
- name: Build with Gradle
52-
run: ./gradlew clean build -x test
53-
54-
- name: Configure AWS credentials
55-
uses: aws-actions/configure-aws-credentials@v4
56-
with:
57-
aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
58-
aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
59-
aws-region: ${{ env.AWS_REGION }}
51+
- name: gradle 실행 권한 부여
52+
run: chmod +x ./gradlew
6053

61-
- name: Login to Amazon ECR
62-
id: login-ecr
63-
uses: aws-actions/amazon-ecr-login@v2
54+
- name: gradle 빌드
55+
run: ./gradlew clean build -x test --no-daemon
6456

65-
- name: Build, tag, and push image to Amazon ECR
66-
id: build-image
67-
env:
68-
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
69-
IMAGE_TAG: ${{ github.sha }}
57+
- name: Upload to AWS S3
7058
run: |
71-
72-
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
73-
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
74-
75-
docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest
76-
docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
77-
78-
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
79-
80-
# - name: Copy deployment script to EC2
81-
# uses: appleboy/scp-action@v0.1.7
82-
# with:
83-
# host: ${{ env.EC2_HOST }}
84-
# username: ec2-user
85-
# key: ${{ env.EC2_SSH_KEY }}
86-
# source: "deploy.sh"
87-
# target: "/home/ec2-user/app/"
59+
aws deploy push \
60+
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
61+
--ignore-hidden-files \
62+
--s3-location s3://$S3_BUCKET_NAME/apps/$GITHUB_SHA.zip \
63+
--source .
8864
89-
- name: Blue-Green Deploy to EC2
90-
uses: appleboy/ssh-action@v1.0.3
91-
env:
92-
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
93-
ECR_REPOSITORY: ${{ env.ECR_REPOSITORY }}
94-
IMAGE_TAG: ${{ github.sha }}
95-
with:
96-
host: ${{ env.EC2_HOST }}
97-
username: ec2-user
98-
key: ${{ env.EC2_SSH_KEY }}
99-
envs: ECR_REGISTRY,ECR_REPOSITORY,IMAGE_TAG
100-
script: |
101-
cd /home/ec2-user/app
102-
chmod +x deploy.sh
103-
export ECR_REGISTRY=$ECR_REGISTRY
104-
export ECR_REPOSITORY=$ECR_REPOSITORY
105-
export IMAGE_TAG=$IMAGE_TAG
106-
./deploy.sh deploy
65+
- name: Deploy to AWS EC2 from S3
66+
run: |
67+
aws deploy create-deployment \
68+
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
69+
--deployment-config-name CodeDeployDefault.AllAtOnce \
70+
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
71+
--s3-location bucket=$S3_BUCKET_NAME,key=apps/$GITHUB_SHA.zip,bundleType=zip
Lines changed: 62 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: continuous deployment
1+
name: continuous deployment (prod)
22

33
on:
44
push:
@@ -9,17 +9,26 @@ permissions:
99
contents: read
1010

1111
env:
12-
AWS_REGION: ap-northeast-2
13-
# ECR_REPOSITORY: jecthome/was-repo
14-
S3_BUCKET_NAME: ject-bucket
15-
CODE_DEPLOY_APPLICATION_NAME: ject-apply-deployer
16-
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: actions-deployer
12+
AWS_REGION: ${{ secrets.AWS_REGION }}
13+
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
14+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
15+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
16+
EC2_HOST: ${{ secrets.EC2_HOST }}
17+
EC2_SSH_KEY: ${{ secrets.EC2_SSH_KEY }}
1718

1819
jobs:
19-
build-deploy:
20+
build-and-deploy:
2021
runs-on: ubuntu-latest
22+
2123
steps:
22-
- uses: actions/checkout@v4
24+
- name: Checkout code
25+
uses: actions/checkout@v4
26+
27+
- name: Set up JDK 21
28+
uses: actions/setup-java@v4
29+
with:
30+
java-version: '21'
31+
distribution: 'temurin'
2332

2433
- name: Cache Gradle packages
2534
uses: actions/cache@v4
@@ -31,92 +40,58 @@ jobs:
3140
restore-keys: |
3241
${{ runner.os }}-gradle-
3342
34-
- name: Set up JDK 21
35-
uses: actions/setup-java@v4
36-
with:
37-
java-version: '21'
38-
distribution: 'corretto'
39-
40-
- name: AWS credential 설정
41-
uses: aws-actions/configure-aws-credentials@v4
42-
with:
43-
aws-region: ${{ env.AWS_REGION }}
44-
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
45-
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
46-
47-
# - name: ECR 로그인
48-
# id: login-ecr
49-
# uses: aws-actions/amazon-ecr-login@v2
43+
- name: Grant execute permission for gradlew
44+
run: chmod +x gradlew
5045

51-
- name: S3에서 설정파일 복사
46+
- name: Copy the configuration file in S3
5247
run: |
5348
aws s3 cp s3://ject-bucket/properties/application-prod.yml \
5449
./src/main/resources/application-prod.yml
5550
56-
- name: gradle 실행 권한 부여
57-
run: chmod +x ./gradlew
51+
- name: Build with Gradle
52+
run: ./gradlew clean build -x test
5853

59-
- name: gradle 빌드
60-
run: ./gradlew clean build -x test --no-daemon
54+
- name: Configure AWS credentials
55+
uses: aws-actions/configure-aws-credentials@v4
56+
with:
57+
aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
58+
aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
59+
aws-region: ${{ env.AWS_REGION }}
6160

62-
- name: Upload to AWS S3
63-
run: |
64-
aws deploy push \
65-
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
66-
--ignore-hidden-files \
67-
--s3-location s3://$S3_BUCKET_NAME/apps/$GITHUB_SHA.zip \
68-
--source .
61+
- name: Login to Amazon ECR
62+
id: login-ecr
63+
uses: aws-actions/amazon-ecr-login@v2
6964

70-
- name: Deploy to AWS EC2 from S3
65+
- name: Build, tag, and push image to Amazon ECR
66+
id: build-image
67+
env:
68+
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
69+
IMAGE_TAG: ${{ github.sha }}
7170
run: |
72-
aws deploy create-deployment \
73-
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
74-
--deployment-config-name CodeDeployDefault.AllAtOnce \
75-
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
76-
--s3-location bucket=$S3_BUCKET_NAME,key=apps/$GITHUB_SHA.zip,bundleType=zip
71+
72+
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
73+
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
74+
75+
docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest
76+
docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
77+
78+
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
7779

78-
# - name: Docker 이미지 빌드 및 ECR 배포
79-
# id: build-image
80-
# env:
81-
# ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
82-
# IMAGE_TAG: latest
83-
# run: |
84-
# docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
85-
# docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
86-
# echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
87-
#
88-
# - name: EC2로 파일 복사 (compose-prod.yaml 및 nginx.conf 포함)
89-
# uses: appleboy/scp-action@master
90-
# with:
91-
# host: ${{ secrets.EC2_IP }}
92-
# username: ${{ secrets.EC2_USERNAME }}
93-
# key: ${{ secrets.EC2_SSH_KEY }}
94-
# source: './compose-prod.yml,./nginx.conf'
95-
# target: '/home/ubuntu'
96-
#
97-
# - name: EC2에서 Docker Compose를 통한 애플리케이션 실행
98-
# uses: appleboy/ssh-action@master
99-
# with:
100-
# host: ${{ secrets.EC2_IP }}
101-
# username: ${{ secrets.EC2_USERNAME }}
102-
# key: ${{ secrets.EC2_SSH_KEY }}
103-
# script: |
104-
# export AWS_REGION=${{ env.AWS_REGION }}
105-
# export ECR_URI=${{ secrets.ECR_URI }}
106-
# export ECR_REPOSITORY=${{ env.ECR_REPOSITORY }}
107-
#
108-
# # .env 파일 생성 및 ECR_IMAGE 변수 추가
109-
# touch /home/ubuntu/.env
110-
# echo ECR_IMAGE=${{ steps.build-image.outputs.image }} >> /home/ubuntu/.env
111-
#
112-
# # ECR 레지스트리에 로그인
113-
# aws ecr get-login-password --region $AWS_REGION | sudo docker login --username AWS --password-stdin $ECR_URI/$ECR_REPOSITORY
114-
#
115-
# # 기존 컨테이너 다운
116-
# sudo docker compose -f ~/compose-prod.yml down
117-
#
118-
# # 최신 이미지 Pull
119-
# sudo docker compose -f ~/compose-prod.yml pull
120-
#
121-
# # 컨테이너 실행
122-
# sudo docker compose -f ~/compose-prod.yml up -d
80+
- name: Blue-Green Deploy to EC2
81+
uses: appleboy/ssh-action@v1.0.3
82+
env:
83+
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
84+
ECR_REPOSITORY: ${{ env.ECR_REPOSITORY }}
85+
IMAGE_TAG: ${{ github.sha }}
86+
with:
87+
host: ${{ env.EC2_HOST }}
88+
username: ec2-user
89+
key: ${{ env.EC2_SSH_KEY }}
90+
envs: ECR_REGISTRY,ECR_REPOSITORY,IMAGE_TAG
91+
script: |
92+
cd /home/ec2-user/app
93+
chmod +x deploy.sh
94+
export ECR_REGISTRY=$ECR_REGISTRY
95+
export ECR_REPOSITORY=$ECR_REPOSITORY
96+
export IMAGE_TAG=$IMAGE_TAG
97+
./deploy.sh deploy

0 commit comments

Comments
 (0)