์ด์ ๊ธ์์ GitHub Actions๋ฅผ CI์ ์ฉ๋๋ก ์ฌ์ฉํ๊ณ , ์ฝ๋์ ์๋ ๋ฐฐํฌ๋ฅผ ์ํ AWS CodeDeploy๋ฅผ ๊ตฌํํด๋ณด๊ฒ ๋ค.
GitHub Actions๋ฅผ ์ฌ์ฉํด์ CI๋ฅผ ๊ตฌ์ถํ๊ณ , AWS CodeDeploy๋ก CD๋ฅผ ๊ตฌ์ถํด ์คํ๋ง ํ๋ก์ ํธ๋ฅผ ์๋ ๋ฐฐํฌํ ๊ฒ์ด๋ค.
๊ฐ๋จ ์์ฝ
- GitHub์ pushํ๋ฉด GitHub Actions๊ฐ ์๋์ผ๋ก ์คํ ๐ gradlew build ๋ช ๋ น์ด๋ก ๋น๋ํ์ฌ ์คํํ ์ ์๋ jar ํ์ผ ์์ฑ
- ๋ฐฐํฌ์ ํ์ํ jar ํ์ผ๊ณผ shell script ํ์ผ์ ์์ถํด์ zip ํ์ผ์ AWS S3๋ก ์ ๋ก๋
- EC2์ ์ค์น๋์ด ์๋ CodeDeploy Agent๊ฐ S3์ ์ ๋ก๋๋ zip ํ์ผ์ ๊ฐ์ ธ์์ ๋ฐฐํฌ
- CodeDeploy Agent๋ S3์์ zip ํ์ผ์ ๋ด๋ ค๋ฐ๊ณ , appspec.yml์ ์ฝ์ด์ ์ค์ ๋ ์คํฌ๋ฆฝํธ ํ์ผ์ ์คํ์ํค๋ฉด์ ๋ฐฐํฌ
๐ 'GitHub Actions ์ค์ '์ ๋จผ์ ์์ฑํ์ง๋ง, 'S3 ๋ฒํท ์์ฑ'ํ๋ ๊ฒ์ ๋จผ์ ํด์ผ ํ๋ค !
1. GitHub Actions ์ค์
๋ฐฐํฌํ๊ณ ์ ํ๋ ํ๋ก์ ํธ์์ workflow์ ์์ฑํ๊ณ GitHub Actions ์ค์ ์ ํ๋ค.
name: github-action-workflow
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
workflow_dispatch:
env:
S3_BUCKET_NAME: soogoori-bucket
AWS_REGION: ap-northeast-2
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Github checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Build with Gradle
run: ./gradlew build
- name: Make zip file
run: zip -r ./$GITHUB_SHA.zip .
shell: bash
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip
๋ณ์๋ก ์์๋ ์ก์ธ์ค ํค ๊ฐ์ ์ ์ฅํ๋ค. (์ก์ธ์ค ํค ๋ฐ๊ธ์ 2. S3 ๋ฒํท ์์ฑ ๋ฐ IAM ์ค์ - '์ก์ธ์ค ํค ๋ฐ๊ธ'์์ ํ์ธํ ์ ์๋ค)
GitHub Actions ํญ์์๋ build ์ฑ๊ณตํ๊ณ , AWS S3์์๋ zip ํ์ผ์ด ์ ๋ก๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
2. S3 ๋ฒํท ์์ฑ ๋ฐ IAM ์ค์
โจ S3 ์ฌ์ฉ ๋ชฉ์ : AWS ์ ์ฅ์๋ก, gradle ๋น๋ ๊ฒฐ๊ณผ (jar)ํ์ผ ์ ๋ก๋
1๏ธโฃ S3 ์ ์, ๋ฒํท ์์ฑ
'๋ชจ๋ ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ'์ ํด์ ํ๋ค.
ํด๋น ์ค์ ์ผ๋ก ์ธํด์ URL์ ์ ๋ ฅํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ ์ ์๊ฒ ๋๋ค.
2๏ธโฃ ์ ์ฑ ์ค์
๋ฒํท ์ ์ฑ โ ํธ์ง์ ๋ค์ด๊ฐ๋ฉด
๋ค์๊ณผ ๊ฐ์ ์ฐฝ์ด ๋์ค๊ณ , ์ ์ฑ ์์ฑ๊ธฐ์ ๋ค์ด๊ฐ์ ์ ์ฑ ์ค์ ์ ํด์ผํ๋ค.
Amazon Resource Name(ARN)์๋ ๋ณต์ฌํด์จ ๋ฒํท ARN/* ํ์์ผ๋ก ์ ๋ ฅํ๋ค.
Add Statement์ ํด๋ฆญํ๋ฉด ์์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
Generate Policy๋ฅผ ๋๋ฅด๋ฉด ์์ ๊ฐ์ด Json ํํ์ ๋ฐ์ดํฐ๊ฐ ๋์จ๋ค.
์ด๋ฅผ ๋ณต์ฌํด์
๋ถ์ฌ๋ฃ๊ณ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฅํ๋ค.
3๏ธโฃ IAM ์ค์
IAM์ Identity and Access Management์ ์ฝ์๋ก AWS์ ๊ฐ ๊ฐ์ฒด(์ฌ์ฉ์, ์๋น์ค)์ ๊ถํ์ ์ฃผ๋ ์๋น์ค์ด๋ค.
CodeDeploy์์ S3๋ก์ ์ ๊ทผ ๊ถํ์ ์ด์ด์ฃผ๊ธฐ ์ํ ์ค์ ์ ํ๋ ๊ฒ์ด๋ค.
์ฌ์ฉ์๋ฅผ ์์ฑํ๊ณ , ๊ถํ ์ค์ ์์ ์ง์ ์ ์ฑ ์ฐ๊ฒฐ์ ์ ํํด 'AmazonS3FullAccess'์ 'AWSCodeDeployFullAccess'๋ฅผ ์ ํํ๋ค.
๋ด์ฉ์ ํ์ธ ํ ์ฌ์ฉ์ ์์ฑ ๋ฒํผ์ ๋๋ฅธ๋ค.
4๏ธโฃ ์ก์ธ์ค ํค ๋ฐ๊ธ
์์ฑ๋ ์ฌ์ฉ์๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์ ์๊ฒฉ ์ฆ๋ช ํญ์์ ์ก์ธ์ค ํค ๋ง๋ค๊ธฐ ๋ฒํผ์ ๋๋ฅธ๋ค.
์ก์ธ์ค ํค ๋ง๋ค๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด ํค๊ฐ ์์ฑ๋๋ค.
๋ฐ๊ธ๋ ์ก์ธ์ค ํค์ ๋น๋ฐ ์ก์ธ์ค ํค๋ฅผ ๋ฐ๋ก ์ ์ฅํ๊ณ ์๋ฃํ๋ค.
3. CodeDeploy ์์ฑ
S3์ ์ ๋ก๋๋ ํ์ผ์ CodeDeploy์๊ฒ ์ ๋ฌํ๊ณ , CodeDeploy๊ฐ build๋ ํ์ผ์ ์ฐพ์์ ๋ฐฐํฌํ ์ ์๊ฒ ๋๋ค.
์ด ๋ช ๋ น์ GitHub Actions์ ๋ช ์ํด์ผํ๋ค.
๋จผ์ CodeDeploy๋ฅผ ์์ฑํ๊ธฐ ์ ์ IAM ์ญํ ์ ์์ฑํด๋ณด์.
๐น IAM ์ญํ ์์ฑ
๐น CodeDeploy Agent ์ค์น
๋ฐฐํฌํ๊ณ ์ ํ๋ ์๋ฒ์ ์ ์ํด CodeDeploy Agent๋ฅผ ์ค์นํ๋ค.
EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํด ์ฐ๊ฒฐํ๊ณ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค.
$ sudo yum update
$ sudo yum install ruby
$ sudo yum install wget
$ cd /home/ec2-user
$ wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto
์ค์น๋ฅผ ํ ํ sudo service codedeploy-agent status๋ฅผ ์ ๋ ฅํ๋ฉด CodeDeploy agent์ ์ํ๋ฅผ ํ์ธํ ์ ์๋ค.
๐น CodeDeploy Agent ๊ตฌ์ฑ - CodeDeploy ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ
AWS CodeDeploy โ ์ ํ๋ฆฌ์ผ์ด์ โ ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ์ ํด๋ฆญํด ์๋ก์ด CodeDeploy๋ฅผ ์์ฑํ๋ค.
๋ฐฐํฌ ๊ทธ๋ฃน๋ ์์ฑํ๋ค.
์์์ ์์ฑํ IAM ์ญํ ์ ์ ์ํด์ ARN์ ๋ณต์ฌํ๊ณ
์๋น์ค ์ญํ ์ ๋ ฅ์ ์ ๋ ฅํ๋ค.
ํ๊ฒฝ ๊ตฌ์ฑ์์ ํ๊ทธ ๊ทธ๋ฃน์ ํค/๊ฐ์ผ๋ก ๊ตฌ์ฑ๋์ด์๋ค.
ํค๋ Name์ผ๋ก ์ค์ ํ๊ณ , ๊ฐ์ ์ถ์ฒํ๋ ์ด๋ฆ์ผ๋ก ๋ฃ์ด์ค๋ค.
ํ๊ทธ ๊ฐ์ ์ฐธ์กฐํด์ ์ด๋ค ์ธ์คํด์ค์ ๋ฐฐํฌํ ๊ฒ์ธ์ง ์ ํ๋ฏ๋ก ๊ผญ ์ง์ ํด์ผํ๋ค !
๋ก๋๋ฐธ๋ฐ์๋ ์ฌ์ฉํ์ง ์์ ๊ฒ์ด๋ฏ๋ก ๋นํ์ฑํํ๊ณ ๋ฐฐํฌ ๊ทธ๋ฃน ์์ฑ์ ํด๋ฆญํ๋ค.
๋ง์ฝ ์๋ฒ๊ฐ ์ฌ๋ฌ ๋๋ผ๋ฉด ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์ค์ ํด์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ด๋ค ์ฅ๋น๋ก ์ฐ๊ฒฐํ ์ง ๊ฒฐ์ ํ๋ค.
4. ์คํฌ๋ฆฝํธ ์ถ๊ฐ
๊ฐ ๋ฐฐํฌ ๋จ๊ณ์์ ์ด๋ค ์คํฌ๋ฆฝํธ ํ์ผ์ ์คํํ ๊ฒ์ธ์ง ์ค์ ํ๋ appspec.yml ํ์ผ์ ์์ฑํ ๊ฒ์ด๊ณ ,
์๋ฒ์์ ์คํ๋ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ํ์ผ์ธ scripts/deploy.sh๋ ์์ฑํ ๊ฒ์ด๋ค.
๐ธ appspec.yml
๐ CodeDeploy๊ฐ ์ฐธ์กฐํ ํ์ผ์ด๋ค.
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/action # ๋ฐฐํฌ ์ ์ฐธ์กฐํ ๋ฃจํธ = ๋ชฉ์ ์ง ๋ฃจํธ
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ec2-user
group: ec2-user
hooks:
ApplicationStart:
- location: scripts/deploy.sh # application ์์ํ ๋ ์ด ํ์ผ์ ์คํ
timeout: 60
runas: ec2-user
๐ธ scripts/deploy.sh
#!/bin/bash
BUILD_JAR=$(ls /home/ec2-user/action/build/libs/*SNAPSHOT.jar) # ํน์ ํ์ผ ์ฐพ๊ธฐ
JAR_NAME=$(basename $BUILD_JAR) # ์๋ณธ ํ์ผ ๋ช
echo "## build file name : $JAR_NAME" >> /home/ec2-user/action/spring-deploy.log # ์ถ์ถํ ํ์ผ๋ช
์ ๋ก๊ทธ ํ์ผ์ ์ถ๊ฐ
# ์ถ๋ ฅ๋ ๋ฉ์์ง๋ฅผ ๋ก๊ทธ ํ์ผ์ ์ถ๊ฐํ๊ณ ๋น๋๋ JAR ํ์ผ์ ์ง์ ๋ ๋๋ ํ ๋ฆฌ๋ก ๋ณต์ฌ
echo "## copy build file" >> /home/ec2-user/action/spring-deploy.log
DEPLOY_PATH=/home/ec2-user/action/
cp $BUILD_JAR $DEPLOY_PATH
# ์คํ ์ค์ธ Java ํ๋ก์ธ์ค์ PID ์ฐพ๊ธฐ
echo "## current pid" >> /home/ec2-user/action/spring-deploy.log
CURRENT_PID=$(ps -ef | grep "java" | awk 'NR==1 {print $2}')
# ํ์ฌ ์คํ ์ค์ธ Java ํ๋ก์ธ์ค ์ข
๋ฃ
if [ -z $CURRENT_PID ]
then
echo "## ํ์ฌ ๊ตฌ๋์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ผ๋ฏ๋ก ์ข
๋ฃํ์ง ์์ต๋๋ค." >> /home/ec2-user/action/spring-deploy.log
else
echo "## kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
# ์๋ก์ด JAR ํ์ผ ์คํํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ๋ ์์
์ํ
DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "## deploy JAR file" >> /home/ec2-user/action/spring-deploy.log
nohup java -jar $DEPLOY_JAR >> /home/ec2-user/action/spring-deploy.log 2> /home/ec2-user/action/spring-deploy_err.log &
deploy.sh ํ์ผ์ ์์ฑ ํ ์คํ ๊ถํ์ ๋ถ์ฌํ์ฌ ์๋ฒ์์ ๋ฌธ์ ์์ด ์คํ๋ ์ ์๋๋ก ํ๋ค.
git update-index --chmod=+x deploy.sh
๐ธ gradle.yml
name: github-action-workflow
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
workflow_dispatch:
env:
S3_BUCKET_NAME: soogoori-bucket
AWS_REGION: ap-northeast-2
CODEDEPLOY_NAME: github-actions
CODEDEPLOY_GROUP: soogoori-github-actions-group
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Github checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Build with Gradle
run: ./gradlew build -x test
- name: Make zip file
run: zip -r ./$GITHUB_SHA.zip .
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip
- name: Code Deploy
run: aws deploy create-deployment --application-name $CODEDEPLOY_NAME --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name $CODEDEPLOY_GROUP --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip
GitHub Actions์์ ์ถ๊ฐํ gradle.yml ํ์ผ์๋ CodeDeploy ๋ฐฐํฌ์ ํ์ํ ๋ฐ์ดํฐ์ step์ ์ถ๊ฐํ๋ค.
์์ ๊ฐ์ ํ์ผ๋ค์ ์์ ๋ฐ ์ถ๊ฐํ์ฌ git ์ ์ฅ์์ pushํ๋ฉด workflow๊ฐ ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
CodeDeploy์์ ๋ฐฐํฌ๊ฐ ์ ์์ ์ผ๋ก ๋๋์ง ํ์ธํด ๋ณธ ๊ฒฐ๊ณผ ์คํจ๊ฐ ๋ด๋ค.
tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log
๋ก๊ทธ๋ฅผ ํ์ธํด๋ณด๋ IAM ๊ด๋ จํด์ ์ค๋ฅ๊ฐ ๋ ๊ฒ ๊ฐ๋ค.
โจ EC2 ์๋ฒ IAM ์ญํ ์์
CodeDeploy์์ ๋ฐฐํฌ ์์ ์ EC2 ์๋ฒ๋ก ์ ๊ทผํด ๋ฐฐํฌ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ EC2 ์๋ฒ IAM ์ญํ ์๋ CodeDeploy ์ ๊ทผ ๊ถํ ๊ด๋ จ๋ ์ค์ ์ด ํ์ํ๋ค.
๊ถํ ์ ์ฑ ์ถ๊ฐ๋ฅผ ํด์ค๋ค.
AmazonEC2RoleforAWSCodeDeploy
AWSCodeDeployFullAccess
AWSCodeDeployRole
์ญํ ์ด๋ฆ์ ์์ฑํ๊ณ ,
๊ถํ ์ ์ฑ ์์ฝ ๋ชฉ๋ก์ ํ์ธํ ํ ์ญํ ์์ฑ ๋ฒํผ์ ํด๋ฆญํ๋ค.
์ญํ ์์ฑ ํ ๋ค์ EC2 ์ธ์คํด์ค์ ๋์์์ IAM ์ญํ ์ ์ ๋ฐ์ดํธํ๋ค.
๊ทธ๋ฌ๋ฉด ์ ์์ ์ผ๋ก CodeDeploy์์ EC2 ์๋ฒ์ ์ ๊ทผํ๊ณ ๋ฐฐํฌํ ์ ์๋ ๊ถํ์ ์ ์ฉํ ์ ์๋ค.
์ ์์ ํ CodeDeploy Agent๋ฅผ ๋ค์ ์คํ์ํค๋ฉด ๋๋ค.
sudo service codedeploy-agent restart
'DevOps > โ๏ธ CI&CD' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[โ๏ธ CI/CD] CI/CD์ GitHub Actions ํ์ฉ๋ฒ (1) | 2024.04.19 |
---|---|
[โ๏ธ CI/CD] Jenkins๋ฅผ ์ด์ฉํด ๋ฐฐํฌํ๊ธฐ 2 - ๋ค๋ฅธ ์๋ฒ (0) | 2024.01.26 |
[โ๏ธ CI/CD] Jenkins๋ฅผ ์ด์ฉํด ๋ฐฐํฌํ๊ธฐ 1 - ๋ก์ปฌ ์๋ฒ (1) | 2024.01.24 |
[โ๏ธ CI/CD] CI/CD์ Jenkins (1) | 2024.01.23 |