[ํฐ๋] ํฐ๋ GitHub Actions๋ก CICD ๊ตฌ์ถํ๊ธฐ(2)
์๋
ํ์ธ์ ํฐํ์ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ๊น์ ์ ์
๋๋ค :)
์ ๋ ์ค๋ CI/CD๋ฅผ ๊ตฌ์ถํ๋ ๋จ๊ณ์์ CodeDeploy Agent ์ค์น ๊ณผ์ , ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ์์ฑ, ๋ฐฐํฌ ๋์ ์ถ๊ฐ์ ๋ํ ๋ด์ฉ์ ์ค๋ช ํด๋ณด๋ ค ํฉ๋๋ค.
์ด์ ๊ธ์์ ์ด์ด์ง๋ ๋ด์ฉ์ ๋๋ค.
๐ฉ๐ป CodeDeploy Agent ์ค์น
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฐจ๋ก๋๋ก ์ ๋ ฅํฉ๋๋ค.
*์ค์น ๋ฐฉ๋ฒ์ ubuntu ๊ธฐ์ค์ ๋๋ค.
# apt ์
๋ฐ์ดํธ
sudo apt-get update && sudo apt-get upgrade
# JDK 11 ์ค์น
sudo apt-get install openjdk-11-jdk
# Ruby ์ค์น (3.xx ๋ฒ์ ์ค์น๋จ)
sudo apt install ruby-full
# wget ๋ชจ๋ ์ค์น
sudo apt install wget
cd /home/ubuntu
# codedeploy ํ์ผ ๋ค์ด๋ก๋
sudo wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ฐจ๋ก๋๋ก ์ํํ๋ค๋ฉด, ๋ค์ด๋ก๋ ๋ฐ์ ๋๋ ํ ๋ฆฌ์ installํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฐจ๋ก๋๋ก ์ ๋ ฅํด ์ค์ ๋ฐ ์ฌ์ฉ ๊ฐ๋ฅํ codedeploy ๋ฒ์ ์ ํ์ธํฉ๋๋ค.
# ๊ถํ ์ค์
sudo chmod +x ./install
# ์ถ๋ ฅ์ ์์ ๋ก๊ทธํ์ผ์ ์
sudo ./install auto > /tmp/logfile
# aws cli ์ค์น
sudo apt-get install awscli
# ์์ธ ๋ฆฌ์ ์์ ์ฌ์ฉ ๊ฐ๋ฅํ codedeploy ๋ฒ์ ํ์ธ
sudo aws s3 ls s3://aws-codedeploy-ap-northeast-2/releases/ | grep '\.deb$'
์ ๋ช ๋ น์ด๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฒ์ ์ ํ์ธ ํ ์ ์์ต๋๋ค. ํฐ๋์ 1.3.2 ๋ฒ์ ์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
sudo ./install auto -v releases/codedeploy-agent_1.3.2-1902_all.deb > /tmp/logfile
# ์๋น์ค๊ฐ ์คํ์ค์ธ์ง ํ์ธ
sudo service codedeploy-agent status
sudo service codedeploy-agent-status ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด ๋ค์๊ณผ ๊ฐ์ด codedeploy-agent service๊ฐ Active๋ ์ํ์์ ํ์ธํฉ๋๋ค.
๐ฉ๐ป CodeDeploy ์์ฑ
AWS์์ CodeDeploy ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
1. CodeDeploy๋ฅผ ์ํ IAM ์ญํ ์์ฑ
“๋ค๋ฅธ AWS ์๋น์ค์ ์ฌ์ฉ ์ฌ๋ก → CodeDeploy”๋ฅผ ํด๋ฆญํ๋ฉด CodeDeploy์ ๋ชจ๋ ๊ถํ์ด ๋ณด์ฌ๋ ์ํ๊ฐ ๋ฉ๋๋ค.
2. CodeDeploy ์ดํ๋ฆฌ์ผ์ด์ ์์ฑ
AWS์ฝ์์์ CodeDeploy๋ฅผ ๊ฒ์ํ์ฌ ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ฑํฉ๋๋ค.
์ดํ๋ฆฌ์ผ์ด์ ์ด๋ฆ์ ์ง์ ํ๊ณ , EC2/์จํ๋ ๋ฏธ์ค๋ฅผ ์ ํํด ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ฑํฉ๋๋ค.
3. ๋ฐฐํฌ ๊ทธ๋ฃน ์์ฑ
์์ฑ๋ CodeDeploy ์ดํ๋ฆฌ์ผ์ด์ ์ ํด๋ฆญํ๊ณ ๋ฐฐํฌ ๊ทธ๋ฃน์ ์์ฑํฉ๋๋ค.
๋ฐฐํฌ ๊ทธ๋ฃน๋ช ์ ์ง์ ํ๊ณ , ์๋น์ค ์ญํ ์๋ ๋ฐฉ๊ธ ๋ง๋ค์๋ IAM ์ญํ ๊ณผ ์ฐ๊ฒฐํฉ๋๋ค.
๋ฐฐํฌ ๊ตฌ์ฑ์ ์ดํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ๋ฅผ ์ด๋ป๊ฒ ์ํํ ์ง์ ๋ํ ์ ํ์ ๋๋ค. AllAtOnce๋ ํ๋ฒ์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ๋ฐฐํฌํ๋ค๋ ๋ป์ ๋๋ค.
๐ฉ๐ป deploy.yml ์์
deploy.yml์ ๋ฐฐํฌ ๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
name: Build and Deploy Spring Boot to AWS EC2
on:
push:
branches: [ main ]
# ์ถ๊ฐ
env:
PROJECT_NAME: tikkle-server
BUCKET_NAME: github-actions-s3-bucket-ec2
CODE_DEPLOY_APP_NAME: codedeploy-app
DEPLOYMENT_GROUP_NAME: codedeploy-deployment-group
# ---------------------
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Java JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Setup MySQL
uses: samin/mysql-action@v1
with:
character set server: 'utf8'
mysql database: 'rds'
mysql user: ${{user}}
mysql password: ${{password}}
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
- name: Make application-prod.properties
if: contains(github.ref, 'main') # branch๊ฐ main ์ผ ๋
run: |
cd ./src/main/resources
touch ./application-prod.properties
echo "${{ secrets.APPLICATION }}" > ./application-prod.properties
shell: bash
- name: Build with Gradle
run: ./gradlew build -x test
shell: bash
# ์ถ๊ฐ
- name: Make Zip File
run: zip -qq -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: ap-northeast-2
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
- name: Code Deploy
run: aws deploy create-deployment --application-name $CODE_DEPLOY_APP_NAME --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name $DEPLOYMENT_GROUP_NAME --s3-location bucket=$BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip
# ---------------------
1) env: deploy.yml ํ์ผ์ ์ฌ์ฉ๋๋ ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.
- PROJECT_NAME: ํ๋ก์ ํธ ์ด๋ฆ์ ์ค์ ํฉ๋๋ค. ์ด ๋ณ์๋ S3 ๊ฒฝ๋ก ์ค์ ์ ์ฌ์ฉ์๋๋ค.
- BUCKET_NAME: ์์ ์์ฑํ S3 ๋ฒํท ์ด๋ฆ์ ๋ฃ์ด์ค๋๋ค.
- CODE_DEPLOY_APP_NAME: CodeDeploy ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ฆ์ ๋ฃ์ด์ค๋๋ค.
- DEPLOYMENT_GROUP_NAME: CodeDeploy ๋ฐฐํฌ ๊ทธ๋ฃน ์ด๋ฆ์ ๋ฃ์ด์ค๋๋ค.
2) jobs - steps์ ๋ค์๊ณผ ๊ฐ์ ๋์์ ์ถ๊ฐํฉ๋๋ค.
- Make Zip File : zipํ์ผ์ ์์ฑํฉ๋๋ค.
- Configure AWS Credentials : AWS_SECRET_ACCESS_KEY์ ํตํด AWS ๊ณ์ ์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ์ป์ต๋๋ค.
- Upload to S3 : S3 ๋ฒํท์ zipํ์ผ์ ์ ๋ก๋ํฉ๋๋ค.
- Code Deploy : CodeDeploy์ ๋ฐฐํฌ ์์ฒญ์ ๋ ๋ฆฝ๋๋ค.
๐ฉ๐ป appspec.yml ์์ฑ
ํ๋ก์ ํธ ์ต์๋จ ๊ฒฝ๋ก์ appspec.ymlํ์ผ์ ์์ฑํฉ๋๋ค. ์ด ํ์ผ์ ๋ฐฐํฌ ์, CodeDeploy๊ฐ ์ฐธ์กฐํ๋ ํ์ผ์ ๋๋ค.
ymlํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/tikkle
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: root
group: root
hooks:
AfterInstall:
- location: scripts/deploy.sh
timeout: 60
runas: root
- version: appspec.ymlํ์ผ ๋ฒ์ ์ ์ ์ํฉ๋๋ค.
- files:
- ๋ฐฐํฌํ ํ์ผ ๋ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ์ ์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์์ ๊ฐ์ ธ์ “/home/ubuntu/tikkle” ๋๋ ํ ๋ฆฌ๋ก ๋ณต์ฌํฉ๋๋ค.
- permissions:
- ์ดํ๋ฆฌ์ผ์ด์ ํ์ผ์ ๋ํ ๊ถํ์ ์ค์ ํฉ๋๋ค. “/home/ubuntu/tikkle” ๋๋ ํ ๋ฆฌ์ ๊ทธ๋ฃน๊ณผ ์์ ์๋ฅผ root๋ก ์ค์ ํฉ๋๋ค.
- hooks:
- AfterInstall: ์ฌ๋ฌ ๋ฐฐํฌ ๋จ๊ณ ์ค AfterInstall ๋จ๊ณ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํฉ๋๋ค
- ๋ฐฐํฌ ๋จ๊ณ์์ ์คํํ ํ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํฉ๋๋ค. ๋ฐฐํฌ ํ ์คํํ ์คํฌ๋ฆฝํธ์ธ deploy.sh ํ์ผ์ ์ง์ ํ๊ณ , ์คํฌ๋ฆฝํธ ์คํ ์๊ฐ์ 60์ด๋ก ์ค์ ํฉ๋๋ค.
๐ฉ๐ป scripts/deploy.sh ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ์์ฑ
ํ๋ก์ ํธ ์ต์๋จ์ scripts/deploy.sh ํ์ผ์ ์์ฑํฉ๋๋ค.
์ด ์คํฌ๋ฆฝํธ๋ ์ด์ ์ ์คํ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ์ค๋จํ๊ณ , ์ต์ ๋ฒ์ ์ Jarํ์ผ์ ์คํํ๋ ์์ ์ ์ํํฉ๋๋ค.
#!/usr/bin/env bash
REPOSITORY=/home/ubuntu/tikkle
cd $REPOSITORY
echo "> Build ํ์ผ ๋ณต์ฌ"
cp ./build/libs/*.jar $REPOSITORY/
echo "> ํ์ฌ ๊ตฌ๋์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
pid ํ์ธ"
CURRENT_PID=$(pgrep -fl tikkle)
echo "$CURRENT_PID"
if [ -z $CURRENT_PID ]
then
echo "> ์ข
๋ฃํ ๊ฒ ์์."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> ์ ์ดํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
echo "> $JAR_NAME์ ์คํ๊ถํ ์ถ๊ฐ"
chmod +x $JAR_NAME
echo ">$JAR_NAME ์คํ"
nohup java -jar $JAR_NAME > /dev/null 2> /dev/null < /dev/null &
๐ฉ๐ป ๊ฒฐ๊ณผ
cicd๋ฅผ ํ๊ธฐ ์ํ ์ค๋น๋ ๋ค ๋ง์ณค์ต๋๋ค. ๋ฉ์ธ ๋ธ๋์น๋ก ํธ์ํด ์ ์ ์๋ํ๋์ง ํ์ธํด ๋ด ๋๋ค.
๐ฉ๐ป ๋ง์น๋ฉฐ
๋๋์ด CI/CD ๊ตฌ์ถ์ ๋ํ ๋ด์ฉ์ด ๋๋ฌ์ต๋๋ค!
์๋ ๋ฐฐํฌ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ถํ๋๋ฐ ๊ธด ์๊ฐ์ด ๊ฑธ๋ ธ์ง๋ง, ํ ๋ฒ ๊ตฌ์ถํด ๋์ผ๋ฉด ๋ฐฐํฌ ๊ณผ์ ์ ์ค์ผ ์ ์์ผ๋ ๊ตฌ์ถํด ๋ณด๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค!
๋ค์์๋ ํฐ๋์ด ์ด๋ป๊ฒ ์๊ตฌ์ฌํญ์ ๋ถ์ํ๊ณ ํ ์ด๋ธ์ ์ค๊ณํ๋์ง์ ๋ํ ๋ด์ฉ์ผ๋ก ์ฐพ์๋ต๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค๐
๐ฉ Contact : uuuuujeong00000@naver.com
๐ฒ SNS : https://www.instagram.com/may_u_j__
'๐ฉโ๐ป TECH' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TECH] Kotlin Coroutine์ ์จ์ผํ๋ ์ด์ (0) | 2023.09.22 |
---|---|
[TECH] ๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ๋ฐฉ์นจ๊ณผ ๋ง 14์ธ ๋ฏธ๋ง์ ๊ฐ์ธ์ ๋ณด ์์ง ํญ๋ชฉ (0) | 2023.09.14 |
[TECH] Android Studio๋ก ๋ค์ํ ๊ธฐ๊ธฐ ํ๋ฉด์ ๋์ํ๊ธฐ II (์ค์ ์ผ์ฑ ์๋ฎฌ ์ฌ์ฉ๋ฒ) (3) | 2023.08.29 |
[TECH] Retrofit2 Multipart์ฌ์ฉํ๊ธฐ (0) | 2023.08.23 |
[TECH] GitHub Actions๋ก CI/CD ๊ตฌ์ถํ๊ธฐ(1) (0) | 2023.08.15 |