CI/CD
Continuous Integration, Continuous Development
ํ ์คํธ, ํตํฉ, ๋ฐฐํฌ์ ๊ณผ์ ์ ์๋ํํ๋ ๊ฒ์ ์๋ฏธ
์ฝ๋๋ฅผ ์ ๋ฐ์ดํธ / ์ถ๊ฐ ์์ฑ ํ ์ปค๋ฐ, ๋ธ๋์น์ Merge, ๋ฐฐํฌ, s3 ์ฝ๋ ๋ณ๊ฒฝ, ๋ฌดํจํ ๋ฑ...์ ๋ฒ๊ฑฐ๋ก์ด ๊ณผ์ ์ ์๋ํ์ํจ๋ค. => ์ฝ๋์๋ง ์ง์คํ ์ ์์!
CI/CD ๊ตฌ์ถ ํด ์ข ๋ฅ
- Github Actions
- Jenkins
- Circle CI
- Travis CI
Jenkins ์์ฒด๋ ๋ง์ด ์ฐ์ด์ง๋ง, ๋ณ๋ ์๋ฒ์ ๊ตฌ์ถ์ ํด์ผํ๋ค๋ ๋จ์ ์ด ์๋ค.
๋ฐ๋ฉด Github Actions๋ ๋ณ๋์ ์๋ฒ ๊ตฌ์ถ ์์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ด์ ๋น์ฉ์ ์ธ ์ธก๋ฉด์ผ๋ก๋ ์๋ฒ ์ ํ ์ด ํ์์๋ค
Github Actions
๊นํ๋ธ์์ ๊ณต์์ ์ผ๋ก ์ ๊ณตํ๋ CI/CD ํด๋ก, ๋น๋-ํ ์คํธ-๋ฐฐํฌ ๋ก์ง์ ์คํ์ํค๋ ์ญํ
- ์ฝ๋ ์์ฑ ํ Commit
- Github์ Push
- Push๋ฅผ ๊ฐ์งํด์ Github Actions์ ์์ฑํ ๋ก์ง์ด ์คํ
- ๋น๋(Build)
- ํ ์คํธ(Test)
- ์๋ฒ๋ก ๋ฐฐํฌ(Deploy)
- ์๋ฒ์์ ๋ฐฐํฌ๋ ์ต์ ์ฝ๋๋ก ์๋ฒ๋ฅผ ์ฌ์คํ
์ค์ต
์ผ๋จ ์ค์ต์ฉ์ผ๋ก ์ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ํ๋ ์์ฑํ๋ค.
github actions ์ค์ต์ฉ์ด๋ฏ๋ก ํ๋ก์ ํธ๋ฅผ ๋ฐ๋ก ๊ตณ์ด ๋ง๋ค ํ์๋ ์์ด์
์ด์ ์ค์ต์ฉ์ผ๋ก ์์ฑํ๋ vite ํ๋ก์ ํธ๋ฅผ ๋ค๊ณ ์์ pushํ๋ค.
git init # ๊น ์ด๊ธฐํ
git add . # ํ์ผ ์ถ๊ฐ
git commit -m "first commit" # ์ปค๋ฐ
git branch -M main # main ๋ธ๋์น๋ก
git remote add origin ๋ ํฌ์งํ ๋ฆฌ ๋งํฌ # ๋ ํฌ์งํ ๋ฆฌ์ ์ฐ๊ฒฐํ๊ธฐ
git push -u origin main # pushํ๊ธฐ
๊ทธ๋ฆฌ๊ณ ํ๋ก์ ํธ ํด๋ ๋ด ์ต์๋จ์ ๋ค์๊ณผ ๊ฐ์ด ํด๋ ๋ฐ ํ์ผ์ ์์ฑํ๋ค. Github Actions๋ฅผ ์คํ์ํค๊ธฐ ์ํด์๋ ๋ฐ๋์ ๋ง๋ค์ด์ค์ผ๋๋ค..
ํ๋ก์ ํธ ํด๋
แ.github
แworkflows
แdeploy.yml
deploy.yml
# Workflow : ํ๋์ yml ํ์ผ์ ํ๋์ Workflow๋ผ๊ณ ๋ถ๋ฆ
name: Github Actions ์คํ์ํค๊ธฐ
# Event : ์คํ๋๋ ์์ ์ ์ค์
# main์ด๋ผ๋ ๋ธ๋์น์ push ๋ ๋ ์๋ Workflow๋ฅผ ์คํ
on:
push:
branches:
# - ๋ธ๋์น๋ช
<< ์ด๋ฐ์์ผ๋ก ๋์ด์ฐ๊ธฐ ๊ผญ ํ ๊ฒ..
- main
# Workflow๋ ์ฌ๋ฌ ๊ฐ์ Job์ผ๋ก ์ด๋ฃจ์ด์ง ์ ์๊ณ ๋ณ๋ ฌ์ ์ผ๋ก ์ํ๋จ
jobs:
# Job์ ์๋ณํ๋ id
My-Develop-Job:
runs-on: ubuntu-latest
# ํ๋์ Job์ ์ฌ๋ฌ ๊ฐ์ step์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์
steps:
- name: Hello World ์ถ๋ ฅํ๊ธฐ # Step์ ์ด๋ฆ
run: echo "Hello World" # ์คํ์ํฌ ๋ช
๋ น์ด
- name: ์ฌ๋ฌ ๋ช
๋ น์ด ๋ฌธ์ฅ ์์ฑํ๊ธฐ
# ์ฌ๋ฌ ๋ช
๋ น์ด ์์ฑํ ๋๋ | ์ฌ์ฉํ๊ธฐ
run: |
echo "Good"
echo "Morning"
pwd
# ์ฐธ๊ณ : https://docs.github.com/en/actions/learn-github-actions/variables
- name: Github Actions ์์ฒด์ ์ ์ฅ๋ ๋ณ์ ์ฌ์ฉ
run: |
echo $GITHUB_REPOSITORY
echo $GITHUB_SHA
- name: Github Actions Secret ๋ณ์ ์ฌ์ฉ
run: |
echo ${{ secrets.MY_NAME }}
echo ${{ secrets.MY_HOBBY }}
์ด์ add commit push๋ฅผ ํด๋ณด๋ฉด
์ด ๋ ๋ง์ง๋ง Github Action Secret ๋ณ์๋ค์ ์ถ๋ ฅ๋์ง ์๊ณ ์๋๋ฐ,
๋ณ์๋ฅผ ์ง์ ํด์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ ๋น์ฐํ๋ค.
๋ณ์๋ฅผ ์ง์ ํด์ฃผ๋ ค๋ฉด ๋ ํฌ์งํ ๋ฆฌ์ Settings ํญ์ ๋ค์ด๊ฐ Secrets and variables - Actions์ผ๋ก ๋ค์ด๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ New repository secret์ ์์ฑํ๋ค
์ด์ action์ ์ฌ์คํํด์ผํ๋ฏ๋ก deploy.yml์์ step ์ด๋ฆ์ ์กฐ๊ธ ์์ ํ๋๊ฐ ์ฃผ์์ ์ถ๊ฐํด์ ๋ณ๊ฒฝ์ฌํญ์ ๋ง๋ค์ด๋ด add commit push๋ฅผ ํ ํ ๋ค์ action์ ์คํํด๋ณด๋ฉด
๋ญ๊ฐ ์ถ๋ ฅ์ ๋๋๋ฐ ***๋ก ์ํธํ๋ผ์ ๋ณด์ฌ์ง๊ณ ์๋ค
๋ณดํต ์ด๋ฐ secret ๋ณ์๋ ๋ฏผ๊ฐํ ๊ฐ(๋น๋ฐ๋ฒํธ ๋ฑ)์ ์ ์ฅํ ๋ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ณด์ฌ์ฃผ์ง ์๊ณ ์๋ค.
React ํ๋ก์ ํธ์ CI/CD ์ ์ฉ
์ผ๋จ github actions ์์ฒด๋ aws์ ์ธ๋ถ ์๋น์ค์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ก์ธ์คํค๋ฅผ ๋ฐ๊ธ๋ฐ์์ผ ํ๋ค.
IAM
์ ๋ช ํ ๋ ธ๋๊ฐ ์๊ฐ๋์ง๋ง ๊ทธ๊ฑด ์๋๊ณ
Identity and Access Management์ ์ฝ์๋ก AWS ๋ฆฌ์์ค์ ๋ํ ์ก์ธ์ค ๊ด๋ฆฌ๋ฅผ ํ๋ ์๋น์ค๋ค.
https://us-east-1.console.aws.amazon.com/iam/home?region=ap-northeast-2#/home
1. ์ฌ์ฉ์ ์์ฑ
์๋ฌดํผ IAM์ ๋ค์ด๊ฐ์ ์ก์ธ์ค ๊ด๋ฆฌ - ์ฌ์ฉ์ - ์ฌ์ฉ์ ์์ฑ ํด๋ฆญ
์ด๋ฆ์ ์์๋ก ์๋ฌด๊ฑฐ๋ ์ฃผ๊ณ ๋ค์์ผ๋ก ๋์ด๊ฐ๋ค
์ด์ ๊ถํ ์ ์ฑ ์ ์ฐ๊ฒฐํ๋ค. ์ง์ ์ ์ฑ ์ฐ๊ฒฐ์ ํด๋ฆญ ํ
1. Amazons3fullAccess
2. CloudFrontFullAccess
๋ฅผ ์ฒดํฌ ํ ๋ค์ ํด๋ฆญ -> ์ฌ์ฉ์ ์์ฑ ํด๋ฆญ
์ฌ์ฉ์ ์์ฑ์ ์๋ฃํ๊ฒ์ด๋ค..
2. ์ก์ธ์ค ํค ๋ฐ๊ธ
์ด์ ์์ฑ๋ ์ฌ์ฉ์ ํด๋ฆญ ํ ๋ณด์ ์๊ฒฉ์ฆ๋ช ํญ - ์ก์ธ์ค ํค ํญ๋ชฉ - ์ก์ธ์ค ํค ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํ๋ค.
๊ทธ๋ค์ AWS ์ธ๋ถ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ํด๋ฆญ - ์ค๋ช ํ๊ทธ๋ ๊ตณ์ด ์์ฐ๊ณ ์๋ตํ๊ณ ๋์ด๊ฐ - ์ก์ธ์คํค ๋ง๋ค๊ธฐ!
์ด์ ์ก์ธ์ค๊ฐ ๋ง๋ค์ด์ก๋๋ฐ ์ด์ ์ฌ๊ธฐ์ ์ฐฝ์ ๋๊ฐ๋ฉด ์๋๋ค... ๋๊ฐ๋ฉด์๋๊ณ
์ก์ธ์ค ํค๋ ๋น๋ฐ ์ก์ธ์คํค๋ฅผ ์ด๋๋ค ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ๋ณต๋ถํด๋ฌ์ผํ๋ค
์ด์ ๋ค์ ๋ด ๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ๋ก ์ด๋
Settings - Secrets and variables - Actions ์ด๋ํด์ new repository secret ๋๊ฐ ์ถ๊ฐ
1) AWS_ACCESS_KEY_ID : ์ก์ธ์ค ํค
2) AWS_SECRET_ACCESS_KEY : ๋น๋ฐ ์ก์ธ์ค ํค
์ด์ ๋น๋ฐ ํค๋ ๋ง๋ค๊ณ ์ด๋ฅผ ์ฌ์ฉํด์ deploy.yml์์ ์๋ํํ๋ ์ฝ๋๋ฅผ ์์ฑํด์ค์ผ ํ๋ค.
3. deploy.yml ์์ฑ
์ผ๋จ ์ฌ๊ธฐ์ ์ปค๋ฐ ํ Pushํ ํ์ผ๋ค์ ๋ถ๋ฌ์์ผ ํ๋๋ฐ, ์ด๋ฅผ ์ด๋ป๊ฒํ๋๋ฉด
github marketplace ์ ๊ฐ์ checkout ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
1) checkout v4 ์ฌ์ฉ
๊ธฐ๋ณธ ์ฌ์ฉ๋ฐฉ๋ฒ์ step์ -uses: action/checkout@v4 ๋ฅผ ์ถ๊ฐํ๊ธฐ.
๊ทธ ์ธ ๊ธฐํ ์ค์ ์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐธ๊ณ
์ด ์ธ์๋ aws์์ ์ฐ๊ฒฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฌ์ฉํ๋๋ฐ ๊ทธ๊ฑด ์๋ deploy.yml์ ์ ์ด๋๋ค
name: Deploy To S3 and Invalidate CloudFront
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Github Repository ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
# github ๋ผ์ด๋ธ๋ฌ๋ฆฌ checkout ์ฌ์ฉ
uses: actions/checkout@v4
- name: ์์กด์ฑ ์ค์น
run: npm i
- name: ๋น๋ํ๊ธฐ
run: npm run build
- name: AWS Resource์ ์ ๊ทผํ ์ ์๊ฒ AWS ์ธ์ฆ ์ค์
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ap-northeast-2
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: S3 ๊ธฐ์กด ํ์ผ๋ค ์ ์ฒด ์ญ์
# 250528-facebook-web : S3์์์ ๋ฐฐํฌ๋ช
run: aws s3 rm --recursive s3://250528-facebook-web
- name: S3์ ๋น๋๋ ํ์ผ ์
๋ก๋ํ๊ธฐ
run: aws s3 cp ./dist s3://250528-facebook-web/ --recursive
- name: CloudFront ์บ์ ๋ฌดํจํ
# --distribution-id ๋ฐฐํฌID
run: aws cloudfront create-invalidation --distribution-id E233UE5GOZVBDT --paths "/*"
์ด์ ๋๊ฐ์ด add commit push๋ฅผ ํ๋ฉด ์๋ํ๊ฐ ์ ๋ ๊ฒ์ด๋ค!
์ด๋ฏธ์ง ์ถ์ฒ
CI/CD ๊ณผ์ : https://www.performetriks.com/post/load-test-in-a-cicd-environment
'AWS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
AWS / ์๋น์ค๋ค ์ ๋ฆฌํ๊ธฐ (0) | 2025.05.29 |
---|---|
AWS / ๋๋ฉ์ธ, HTTPS ์ค์ (0) | 2025.05.28 |
AWS / S3, Cloudfront๋ฅผ ํ์ฉํด ๋ฐฐํฌํ๊ธฐ (0) | 2025.05.28 |
AWS / ๊ธฐ์ด (0) | 2025.05.26 |