๐ ๋ฐฐํฌ ํ๋ฆ
๐ง GitHub Actions๋
Github๊ฐ ๊ณต์์ ์ผ๋ก ์ ๊ณตํ๋ ๋น๋, ํ ์คํธ ๋ฐ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ ์๋ํํ ์ ์๋ CI/CD ํ๋ซํผ
GitHub Actions ์ฌ์ฉ ์ repository์์ ์ด๋ฒคํธ(PR ํน์ push)๊ฐ ๋ฐ์ํ ๋ ํน์ ์์ ์ ์คํํด ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ ์ ์๋ค.
- CI/CD ์ํฌํ๋ก์ฐ
push, PR(Pull Request) ์์ฑ, Issue ๋ฑ์ ์ด๋ฒคํธ์ ๋ํด ์ง์ ๋ ์์ ์ ์คํํ์ฌ ์ง์์ ์ผ๋ก ํตํฉํ๊ณ ๋ฐฐํฌํ๋ค.
์ด๋ฅผ ํตํด ๋น๋, ํ ์คํธ, ์ฝ๋ ๋ฆฌ๋ทฐ, ๋ฐฐํฌ ๋ฑ์ ๊ณผ์ ์ ์๋ํํ ์ ์๋ค. - ํ
์คํธ ์๋ํ
์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ํ ์คํธํ์ฌ ํ์ง ๊ด๋ฆฌ๋ฅผ ๊ฐํํ๊ณ , ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ๋ฐ ๋ถ์ํ์ฌ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ค. - ์ํฌํ๋ก์ฐ ์๋ํ
ํ๋ก์ ํธ ๊ด๋ฆฌ, ๋ฒ์ ๊ด๋ฆฌ, ์๋ฆผ ๋ฐ ํต์ง, ๋ฌธ์ ์์ฑ ๋ฑ๊ณผ ๊ฐ์ ์์ ์ ์๋ํํ์ฌ ํจ์จ์ฑ์ ํฅ์์ํจ๋ค.
GitHub Actions๋ YAML ๊ธฐ๋ฐ์ workflow ํ์ผ์ ํตํด ์์ ๋จ๊ณ, ํ๊ฒฝ ๋ณ์, ํธ๋ฆฌ๊ฑฐ ์กฐ๊ฑด ๋ฑ์ ์ค์ ํ ์ ์์ผ๋ฉฐ, ํ์ํ ๋๊ตฌ ๋ฐ ์๋น์ค์์ ํตํฉ์ ์ง์ํ๋ค.
๐ง Code Deploy๋
AWS๊ฐ ์ ๊ณตํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ์๋ํ ์๋น์ค
Code Deploy์ ๊ดํ ์ ๋ณด์ ์ค์ ์ ํด๋น ๋งํฌ๋ฅผ ์ฐธ์กฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๐ ์ฌ์ ์ค๋น
1. Pulbic Repository์ฌ์ผ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๋ค.
2. AWS CLI์ Code Deploy Agent๊ฐ EC2์ ์ค์น๋์ด ์์ด์ผ ํ๋ค.
3. S3 ๋ฒํท์ด ์์ฑ๋์ด ์์ด์ผ ํ๋ค.
๐ฑ EC2์ AWS CLI ์ค์น (โ๏ธUbuntu ๊ธฐ์คโ๏ธ)
1. AWS CLI๋ฅผ ์ค์นํ ๋ ํ์ํ ํจํค์ง ์ค์น
$ sudo apt install curl unzip
2. curl์ ํตํด awscliv2.zip ํ์ผ์ ๋ค์ด๋ฐ์ ์์ถ ํ๊ธฐ
# awscliv2.zip ํ์ผ ๋ค์ด
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
# ์์ถ ํ๊ธฐ
$ unzip awscliv2.zip
3. AWS CLI ์ค์น๋ฅผ ์ํ ์คํฌ๋ฆฝํธ ์คํ
$ sudo ./aws/install
You can now run: /usr/local/bin/aws --version
$ aws --version
aws-cli/2.13.0 Python/3.11.4 Linux/5.19.0-1026-aws exe/x86_64.ubuntu.22 prompt/off
4. ์๋ฃ~
๐ฑ EC2์ AWS Code Deploy ์ค์น (โ๏ธUbuntu ๊ธฐ์คโ๏ธ)
๋์ ๊ฒฝ์ฐ ์ฐ๋ถํฌ๋ผ ๊ณต์ ๋ฌธ์์ ์ฌ์ฉ ์ค๋ช ์๋ฅผ ์ฐธ๊ณ ํด EC2์ Code Deploy๋ฅผ ์ค์นํด ์ฃผ์๋ค.
$ sudo apt update
$ sudo apt install ruby-full
$ sudo apt install wget
$ cd /home/ubuntu
$ wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto
โ๏ธ ๋ฆฌ์์ค ์ค์
1๏ธโฃ Github Actions ์์ฑ
ํ๋ก์ ํธ ๋ ํฌ์งํ ๋ฆฌ -> โถ๏ธ Actions๋ก ์ด๋ํด workflow ์ค์ ํ๋ค.
set up a workflow yourself ๋ฅผ ํด๋ฆญํ๋ฉด ๋น yml ์ค์ ํ์ผ๋ก workflow๋ฅผ ์ค์ ํ ์ ์๊ณ
Suggested for this repository์์ ์ถ์ฒ workflow ๊ตฌ์ฑ์ ์ ํํ ์ ์๋ค.
2๏ธโฃ Github Action ์ค์ ํ์ผ(Workflow) ๋ง๋ค๊ธฐ
์ฐ์ Java with Gradle์ workflow ๊ตฌ์ฑ์ ํด๋ฆญํ๋๋ ์๋ workflow๊ฐ ์ถ์ฒ๋์๋ค.
name: Java CI with Gradle
on:
push:
branches: [ "develop" ]
pull_request:
branches: [ "develop" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
arguments: build
โ๏ธGitHub Secret ๋ฑ๋ก
GitHub Secret์ API ํค๋ passsword ๊ฐ์ ๋ณด์ ์ด์๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํด ์ฃผ๋ ์ญํ ์ ํ๋ค.
secrets์ ์ํ๋ ๊ฐ ์ ๋ ฅ ์ actions์ workflow๊ฐ ์คํ๋ ๋ ํด๋น secrets์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ ๋์ ์ผ๋ก secrets์ ๋ฐ์ดํฐ๋ฅผ ์ทจํฉํด .env ํ์ผ์ ์์ฑํ๋ค.
GitHub Actions์ ํ๋ก์ ํธ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ AWS์ S3 ๋ฒํท์ ์ ์กํ๋ workflow๋ฅผ ์คํํ๋ ๊ณผ์ ์์ AWS์ Access Key์ Secret Key๊ฐ ํ์ํ์ง๋ง ์ด๋ฅผ ๊ณต๊ฐํ ๊ฒฝ์ฐ ๋ณด์ ์ด์๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ GitHub Secret ์ ๋ฑ๋กํด ๋ณด์์ด ํ์ํ ๊ฐ๋ค์ ์ ์ฅํ์ฌ ์ฌ์ฉํ๋ค.
ํ๋ก์ ํธ ๋ ํฌ์งํ ๋ฆฌ > Settings > Secrets and variables > Actions ๋ก ์ด๋ํด New repository secret์ ํด๋ฆญํ๋ค.
Access key๋ฅผ ๋ฐ๊ธ๋ฐ๋ ๊ณผ์ ์ ํด๋น ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
Name์๋ AWS_ACCESS_KEY์, Secret์๋ ๊ฐ์ ์ ๋ ฅํด ์ ์ฅํ๋ฉด workflow์์ ${{secrets.AWS_ACCESS_KEY}} ํํ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ workflow ํ์ผ์ AWS Access Key์ Secret Access Key๋ฅผ ์ถ๊ฐํด AWS ๊ถํ์ ํ์ธํ๋ค.
# Access Key์ Secret Key๋ฅผ ํตํด ๊ถํ์ ํ์ธํ๋ค.
- name: AWS Configure credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
aws-region: ap-northeast-2
โ๏ธ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ค์ env๋ก ์ง์
env:
PROJECT_NAME: ํ๋ก์ ํธ ์ด๋ฆ
S3_BUCKET_NAME: Amazon S3 Bucket ์ด๋ฆ
CODE_DEPLOY_APPLICATION_NAME: Amazon Code Deploy ์ดํ๋ฆฌ์ผ์ด์
์ด๋ฆ
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: Code Deploy ๊ทธ๋ฃน ์ด๋ฆ
โ๏ธ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ S3 ๋ฒํท์ ์ ์ก
- ์ฐ์ gradlew ํ์ผ์ ์คํ ๊ถํ์ ์ถ๊ฐํด ์ค ํ Gradle์ ์ฌ์ฉํด ์ปจํธ๋กค๋ฌ ํ ์คํธ๋ฅผ ์คํํ๋ค.
(๋์ ๊ฒฝ์ฐ API ๋ฌธ์๋ก REST Docs๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ปจํธ๋กค๋ฌ ํ ์คํธ๊ฐ ์คํ๋์ด์ผ API ๋ฌธ์๊ฐ ์์ฑ๋๋ค.)
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Controller Test with Gradle
run: ./gradlew test --tests "{์ปจํธ๋กค๋ฌ ํ
์คํธ ๊ฒฝ๋ก}"
- Gradle์ ์ฌ์ฉํด ํ ์คํธ๋ฅผ ์ ์ธํ๊ณ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ ํ ํ๋ก์ ํธ ํ์ผ์ ์์ถํ์ฌ zip ํ์ผ์ ์์ฑํ๋ค.
- name: Build with Gradle
run: ./gradlew build -x test
- name: Make zip file
run: zip -qq -r ./$GITHUB_SHA.zip .
shell: bash
- zip
ํ์ผ์ ์์ถํ๋ ๋ช ๋ น์ด - -qq
"Quiet" ๋ชจ๋. ์์ถ ๊ณผ์ ์ค ๋ฉ์์ง ์ต์ํ - -r
"Recursive" ๋ชจ๋. ๋๋ ํ ๋ฆฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํ์ํด ํ์ ๋๋ ํ ๋ฆฌ์ ํ์ผ ๋ชจ๋ ์์ถ - ./$GITHUB_SHA.zip
์์ถ๋ ๊ฒฐ๊ณผ ํ์ผ์ ์ด๋ฆ. '$GITHUB_SHA' ๋ GitHub์์ ์ ๊ณตํ๋ ํ์ฌ ์ปค๋ฐ์ ๊ณ ์ ์๋ณ์์ด๊ธฐ ๋๋ฌธ์ ๊ฐ ์ปค๋ฐ๋ณ๋ก ๊ณ ์ ํ ์์ถ ํ์ผ ์ด๋ฆ ์์ฑ ๊ฐ๋ฅ - .
์์ถ ๋์. ์ฌ๊ธฐ์๋ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๋ชจ๋ ํ์ผ๊ณผ ํ์ ๋๋ ํ ๋ฆฌ๋ฅผ ํฌํจํ์ฌ ์์ถํ๋ผ๋ ์๋ฏธ
- ๋น๋๋ ํ๋ก์ ํธ ํ์ผ์ S3 ๋ฒํท์ผ๋ก ๋ณต์ฌ
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://${{ env.S3_BUCKET_NAME }}/${{ env.PROJECT_NAME }}/$GITHUB_SHA.zip
- --region ap-northeast-2
์ ๋ก๋ํ S3 ๋ฒํท์ AWS region - ./$GITHUB_SHA.zip
๋ก์ปฌ์ ์์ฑ๋ ์์ถ ํ์ผ ๊ฒฝ๋ก - s3://${{ env.S3_BUCKET_NAME }}/${{ env.PROJECT_NAME }}/$GITHUB_SHA.zip
S3 ๋ฒํท์ ๊ฒฝ๋ก
- AWS CodeDeploy๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐํฌ
- name: Deploy with AWS codeDeploy
run: aws deploy create-deployment
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }}
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }}
--deployment-config-name CodeDeployDefault.AllAtOnce
--s3-location bucket=$S3_BUCKET_NAME,key=$PROJECT_NAME/$GITHUB_SHA.zip,bundleType=zip
- aws deploy create-deployment
์๋ก์ด ๋ฐฐํฌ ์์ฑ - --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }}
๋ฐฐํฌํ AWS CodeDeploy ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ฆ ์ง์ - --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }}
๋ฐฐํฌํ AWS CodeDeploy ๋ฐฐํฌ ๊ทธ๋ฃน ์ด๋ฆ ์ง์ - --deployment-config-name CodeDeployDefault.AllAtOnce
๋ฐฐํฌ ๊ตฌ์ฑ ์ด๋ฆ(CodeDeploy Application ์์ฑ ์ ์ ํ ๋ฐฐํฌ ๊ตฌ์ฑ) - --s3-location bucket=$S3_BUCKET_NAME,key=$PROJECT_NAME/$GITHUB_SHA.zip,bundleType=zip
S3์์ ๋ฐฐํฌํ ๋ฐฐํฌ ํ์ผ์ ์์น ์ง์
โ ์์ฑ๋ ํ ์คํฌ๋ฆฝํธ
name: Deploy to Amazon EC2
on:
push:
branches: [ "develop" ]
permissions:
contents: read
env:
PROJECT_NAME: ํ๋ก์ ํธ ์ด๋ฆ
S3_BUCKET_NAME: Amazon S3 Bucket ์ด๋ฆ
CODE_DEPLOY_APPLICATION_NAME: Amazon Code Deploy ์ดํ๋ฆฌ์ผ์ด์
์ด๋ฆ
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: Code Deploy ๊ทธ๋ฃน ์ด๋ฆ
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Controller Test with Gradle
run: ./gradlew test --tests "์ปจํธ๋กค๋ฌ ํ
์คํธ ๊ฒฝ๋ก"
- name: Build with Gradle
run: ./gradlew build -x test
- name: Make zip file
run: zip -qq -r ./$GITHUB_SHA.zip .
shell: bash
- name: AWS Configure credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
aws-region: ap-northeast-2
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://${{ env.S3_BUCKET_NAME }}/${{ env.PROJECT_NAME }}/$GITHUB_SHA.zip
- name: Deploy with AWS codeDeploy
run: aws deploy create-deployment
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }}
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }}
--deployment-config-name CodeDeployDefault.AllAtOnce
--s3-location bucket=$S3_BUCKET_NAME,key=$PROJECT_NAME/$GITHUB_SHA.zip,bundleType=zip
yml ๋ณ๊ฒฝ ์ฌํญ์ commitํ push ํ๋ฉด gradle.yml ํ์ผ์ด ์์ฑ๋จ๊ณผ ๋์์ workflow์ ์์ฑ๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ํตํด S3 ๋ฒํท์ ์์ถ ํ์ผ์ด ์ ์ก๋์์์ ํ์ธํ ์ ์๋ค.
Actions ํญ์์ ์์ฑ๋ ์ํฌํ๋ก์ ๊ฐ ๋จ๊ณ๋ณ ์งํ ์ํฉ์ ํ์ธํ ์ ์์ผ๋ฉฐ, ์งํ/์ฑ๊ณต/์คํจ ์ฌ๋ถ๋ repository์์ ์ต๊ทผ commit ๋ด์ญ๊ณผ ํจ๊ป ํ์๋๋ค.
https://jinmay.github.io/2020/05/13/aws/how-to-install-code-deploy-agent-ubuntu/
'Back-end' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] @Transaction(readOnly = true) ์ค์ (0) | 2023.09.01 |
---|---|
[JPA] JPA, Hibernate, Spring Data JPA์ ๋ํ ์ด๋ฐ์ ๋ฐ.. ์ ๋ฆฌ (0) | 2023.08.29 |
[Java] ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection: GC) (0) | 2023.06.04 |
[Spring Boot] OAuth 2.0 ๋ฅผ ์ด์ฉํ ์์ ๋ก๊ทธ์ธ ๊ตฌํ (0) | 2023.05.22 |
[Spring Boot] yml ํ์ผ์ ์์ฑํ ์ ๋ณด๋ก ์ด๋ป๊ฒ OAuth ์ค์ ์ ํ ๊น? (0) | 2023.05.22 |