[ํฐ๋] ํฐ๋ GitHub Actions๋ก CICD ๊ตฌ์ถํ๊ธฐ(1)
์๋
ํ์ธ์ ํฐํ์ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ๊น์ ์ ์
๋๋ค :)
์ ๋ ์ค๋ ํฐ๋์ด ์ด๋ป๊ฒ ๋ฐ๋ณต๋๋ ์์ ๊ณผ ๋ฐฐํฌ์ ์๋ฐ๋๋ ์์ ๋ค์ ์๋ํํด๋ณด์๋์ง ์ค๋ช ํด ๋ณด๋ ค ํฉ๋๋ค.
๐ฉ๐ป CI/CD๋?
์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๋จ๊ณ๋ถํฐ ๋ฐฐํฌ ๋๊ฐ์ง์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์๋ํํ์ฌ ๋ ํจ์จ์ ์ด๋ก ๋น ๋ฅด๊ฒ ์ฌ์ฉ์์๊ฒ ๋ฐฐํฌํ ์ ์๋ ๊ฒ์ ๋งํฉ๋๋ค.
CI(Continuous Integration)๋ ์ง์์ ํตํฉ, ์์ฝ ํ์๋ฉด ๋น๋/ํ
์คํธ ์๋ํ ๊ณผ์ ์
๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ก์ด ์ฝ๋๋ ๋ฒ๊ทธ ์์ ์ผ๋ก ์ฝ๋ ๋ณ๊ฒฝ์ด ์ฃผ๊ธฐ์ ์ผ๋ก ๋น๋ ๋ฐ ํ
์คํธ๋๋ฉด์ ๊ณต์ ๋๋ ๋ ํฌ์งํ ๋ฆฌ์ ํตํฉ(merge)๋์ด ์๋ก ์ถฉ๋ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
CD(Continuous Delivery/Deployment)๋ ๋ฐฐํฌ ์๋ํ ๊ณผ์ ์ ๋งํฉ๋๋ค. CI์์ Build ๋ฐ Test ๋ ํ์, ๋ฐฐํฌ๋ฅผ ์๋์ ์ผ๋ก ์งํํ๋ ๊ฒ์
๋๋ค. ์ง์์ ๋ฐฐํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ง ์ ํ ์์ด ์ต๋ํ ๋นจ๋ฆฌ ์ฌ์ฉ์์๊ฒ ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๐ฉ๐ป GitHub Actions๋?
Github Action์ด๋ Github ์ ์ฅ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ํํธ์จ์ด ๊ฐ๋ฐ Workflow๋ฅผ ์๋ํ ํ ์ ์๋ ๋๊ตฌ์ ๋๋ค.
Github ๋ด๋ถ์์ ํ๋ก์ ํธ๋ฅผ ๋น๋, ํ ์คํธ, ๋ฆด๋ฆฌ์ฆ ๋๋ ๋ฐฐํฌ๋ฅผ ์ง์ํ๋ ๊ธฐ๋ฅ์ผ๋ก์, Github์์ ์ ๊ณตํ๋ CI/CD ๋๊ตฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
๐ฉ๐ป GitHub Actions ๊ตฌ์ฑ์์
Workflow
- Workflow๋ ํ๋ก์ ํธ๋ฅผ ๋น๋, ํ ์คํธ, ํจํค์ง, ๋ฆด๋ฆฌ์ค ๋๋ ๋ฐฐํฌํ๊ธฐ ์ํ ์ ์ฒด์ ์ธ ํ๋ก์ธ์ค
- Workflow๋ ์ฌ๋ฌ๊ฐ์ Job์ผ๋ก ๊ตฌ์ฑ๋์ด event๊ธฐ๋ฐ์ผ๋ก ๋์
- ์ฌ๋ฌ Job์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ ์ต์์ ๊ฐ๋
- Workflow ํ์ผ์ YAML์ผ๋ก ์์ฑ๋๊ณ , Github Repository์ .github/workflows ํด๋ ์๋์ ์ ์ฅ
Event
- Workflow๋ฅผ ์คํํ๋ ํน์ ํ๋์ด๋ ๊ท์น์ด๋ค
- ์) ํน์ ๋ธ๋์น๋ก Push / ํน์ ๋ธ๋์น๋ก Pull Request
Jobs
- Job์ ์ฌ๋ฌ Step์ผ๋ก ๊ตฌ์ฑ๋๊ณ , ๊ฐ์ ํ๊ฒฝ์ ์ธ์คํด์ค์์ ์คํ๋๋ค.
- ํ๊ฐ์ง ๋ฌ๋์์์ ์คํ๋๋ ์ฌ๋ฌ๊ฐ์ง step๋ค์ ๋ชจ์
Actions
- ๋ณต์กํ๊ณ ์์ฃผ ๋ฐ๋ณต๋๋ ์์ ์ ์ ์ํ ์ปค์คํ ์ดํ๋ฆฌ์ผ์ด์
- workflow ํ์ผ ์์์ ์์ฃผ ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํด ์ฝ๋์ ์์ ์ค์ผ ์ ์์ต๋๋ค.
๐ฉ๐ป GitHub Actions + CodeDeploy๋ฅผ ์ด์ฉํ CI/CD ํ๋ฆ
- Github์ push ์, Github Actions์์ push๋ฅผ ๊ฐ์งํ๊ณ ์ ํด์ง Action์ ์ํ
- ์ ๋ฐ์ดํธ๋ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก Build์ Test๋ฅผ ์ํ
- ์ฝ๋๋ฅผ ์์ถํ์ฌ zipํ์ผ์ ์์ฑ
- S3์ zipํ์ผ์ ์ ๋ก๋
- Code Deploy์ ๋ฐฐํฌ ์์ฒญ์ ๋ด๋ฆผ
- S3๋ก๋ถํฐ zipํ์ผ์ ๋ฐ์
- ์ง์ ํ EC2 ์ธ์คํด์ค์ ์ ํ๋ฆฌ์ผ์ด์ ํ์ผ์ ์ ๋ฌ
- EC2 ์ธ์คํด์ค์์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ ๋ฐฐํฌ ์๋ฃ
๐ฉ๐ป ์ค์น๊ณผ์
๐CI
1. github ํ๋ก์ ํธ Repository์ Actions → set up a workflow your self ํด๋ฆญํ์ฌ yml ํ์ผ์ ์์ฑํฉ๋๋ค.
2. ์๋ ๋น๋ ๋ฐ ํ ์คํธ๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ด yml ์์ฑํฉ๋๋ค.
deploy.yml
name: Build and Deploy Spring Boot to AWS EC2
on:
push:
branches: [ main ]
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
Github Actions๋ .github/workflows ํ์ ๊ฒฝ๋ก์ ymlํ์ผ์ ์์ฑํ๋ฉด, ํน์ ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ฐ์ ์ Actions Runner๊ฐ yml ํ์ผ์ ์ง์ ๋ ํ๋์ ์ํํฉ๋๋ค.
3. ๋ฏผ๊ฐ ์ ๋ณด ํ์ผ์ github Repository→Settings→Secrets and variable→Actions์์ New repository secret ๋ฒํผ์ ๋๋ฌ์ ์์ฑํฉ๋๋ค.
4. APPLICATION์ Name์ผ๋ก rds ์ ๋ณด์ ๊ฐ์ด ๊ณต๊ฐํด์ ์๋๋ ๋ฏผ๊ฐ์ ๋ณด๋ฅผ ์์ฑํฉ๋๋ค. ์์ฑ ํ Add secret์ ๋๋ฅด๋ฉด ๊นํ๋ธ ์ก์ ์ด ๋น๋ํ๋ฉด์ ์๋์ผ๋ก APPLICATION ๋ด์ฉ์ ๊ฐ์ง๊ณ application-prod.propertiesํ์ผ์ ๋ง๋ญ๋๋ค.
๐CD
1. [S3 ๋ฒํท ์์ฑ]์์ฑํ ์ฝ๋๋ฅผ s3 ๋ฒํท์ ์ฎ๊ธฐ๊ธฐ ์ํด s3 ๋ฒํท์ ์์ฑํฉ๋๋ค. ๋ฒํท์ ๊ตฌ๋ถํ๊ธฐ ์ํ ์ด๋ฆ๊ณผ ์์ธ ๋ฆฌ์ ์ ์ ํํฉ๋๋ค.
2. IAM ์ฌ์ฉ์๋ฅผ ์ด์ฉํ์ฌ s3์ ์ ๊ทผํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํผ๋ธ๋ฆญ ์์ธ์ค๋ฅผ ์ฐจ๋จํฉ๋๋ค.
3. ์ดํ ๋ค๋ฅธ ์ค์ ๋ค์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ํ์ฌ s3 ๋ฒํท ์์ฑ์ ์๋ฃํฉ๋๋ค.
4. [IAM ์ฌ์ฉ์ ์์ฑ]CI/CD๋ฅผ ์ํ IAM ์ฌ์ฉ์๋ฅผ ์์ฑํฉ๋๋ค. ACCESS TOKEN ๊ฐ์ ์ฌ์ฉํ๋ฉด ๋๋ฏ๋ก AWS Management Console์ ๋ํ ์ฌ์ฉ์ ์์ธ์ค ๊ถํ์ ์ฒดํฌํ์ง ์์ต๋๋ค.
5. AmazonS3FullAccess, AWSCodeDeployFullAccess ๊ถํ์ ์ ํํ ํ IAM ์ฌ์ฉ์๋ฅผ ์์ฑํฉ๋๋ค.
6. AWS์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ACCESS KEY๋ฅผ ์ฌ์ฉํ ์ธ์ฆ ๋ฐฉ์์ ๊ถ์ฅํ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ACCESS KEY๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ์์ฑ๋ IAM ์ฌ์ฉ์๋ฅผ ํด๋ฆญํ๊ณ ๋ณด์ ์๊ฒฉ์ฆ๋ช ์ ๋ค์ด๊ฐ๋๋ค. ์ก์ธ์ค ํค ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
7. AWS ์ธ๋ถ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํํ ํ ๋ค์์ผ๋ก ๋์ด๊ฐ๋๋ค.
8. ์ก์ธ์ค ํค๊ฐ ์์ฑ๋๋ฉด ์ก์ธ์ค ํค์ ๋น๋ฐ ์ก์ธ์ค ํค๋ฅผ ๊ผญ ์ ์ฅํฉ๋๋ค. ์๋ฃ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ค์ ํค ๊ฐ์ ๋ฐ์ ์ ์์ผ๋ .csv ํ์ผ ๋ค์ด๋ก๋ ๋ฒํผ์ ๋๋ฌ ํค๊ฐ์ ์ ์ฅํฉ๋๋ค.
9. Github Actions์์ AWS ์๋น์ค์ ์ ๊ทผํ ์ ์๋๋ก Repository์ Settings→Secret and variables→ Actions → New repository secret์ IAM ์ฌ์ฉ์์ ์ก์ธ์ค ํค(AWS_ACCESS_KEY_ID์ ๋น๋ฐ ์ก์ธ์ค ํค(AWS_SECRET_ACCESS_KEY)๋ฅผ ์ ์ฅํฉ๋๋ค.
10. [EC2 ๊ด๋ จ ์ค์ ]EC2 ์ธ์คํด์ค์ ๋ํ IAM ์ญํ ์ ์์ ํฉ๋๋ค.
11. ์ ์ญํ ์์ฑ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
12. AWS ์๋น์ค → ์ฌ์ฉ์ฌ๋ก๋ EC2๋ฅผ ํด๋ฆญํ๊ณ ๋ค์ ๋ฒํผ์ผ๋ก ๋์ด๊ฐ๋๋ค.
13. IAM ์ญํ ์ ๊ตฌ๋ถํ ์ ์๋ ์ด๋ฆ์ ์์ฑํ๊ณ AmazonS3FullAccess์ AWSCodeDeployFullAccess์ ๋ํ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
14. ์์ฑํ IAM ์ญํ ์ EC2 ์ธ์คํด์ค์ ์ฐ๊ฒฐํฉ๋๋ค.
๋ค์ ๊ธ์์ ๊ณ์๋ฉ๋๋ค.
๐ฉ๐ป ๋ง์น๋ฉฐ
CI/CD ๊ตฌ์ถ์ ๋ํ ๊ธด ๊ธ์ ์ฝ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
CI/CD๋ฅผ ๊ตฌ์ถํ๋๋ฐ ์งง์ง ์์ ์๊ฐ์ด ๊ฑธ๋ ธ์ง๋ง, ๋น๋์ ๋ฐฐํฌ๋ฅผ ์๋ํํ๋ฉด์ ์ ํ ํ์ง์ ๋์ผ ์ ์์๊ณ , ์ฌ์ฉ์์๊ฒ ๋ ๋น ๋ฅธ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์ด ๋ป๊น์ ์๊ฐ์ด์์ต๋๋ค.
์ด ๊ธ์ด ์ฌ๋ฌ๋ถ์๊ฒ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฉฐ ์ ๋ ๋ค์ ๊ธ [GitHub Actions๋ก CI/CD ๊ตฌ์ถํ๊ธฐ(2)] CodeDeploy ์ค์น, ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ์์ฑ์์ ๋ ๋์ ๋ด์ฉ์ผ๋ก ์ฐพ์์ค๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค๐
๐ฉ๐ป ์ฐธ๊ณ
GitHub Action์ผ๋ก CI/CD ๊ตฌ์ถํ๊ธฐ
GitHub Action์ ํตํด ์ด๋ฏธ์ง ๋น๋ ๋ฐ ์ ๋ก๋, ์ปจํ ์ด๋ ๋ฐฐํฌ๋ฅผ ์ํํ๋ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํด๋ณด๊ฒ ์ต๋๋ค.
velog.io
๐ฉ Contact : uuuuujeong00000@naver.com
๐ฒ SNS : https://www.instagram.com/may_u_j__
'๐ฉโ๐ป TECH' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TECH] Android Studio๋ก ๋ค์ํ ๊ธฐ๊ธฐ ํ๋ฉด์ ๋์ํ๊ธฐ II (์ค์ ์ผ์ฑ ์๋ฎฌ ์ฌ์ฉ๋ฒ) (3) | 2023.08.29 |
---|---|
[TECH] Retrofit2 Multipart์ฌ์ฉํ๊ธฐ (0) | 2023.08.23 |
[TECH] Android Studio๋ก ๋ค์ํ ๊ธฐ๊ธฐ ํ๋ฉด์ ๋์ํ๊ธฐ (0) | 2023.08.07 |
[TECH] RecyclerView ViewModel ์ ์๊ธฐ (0) | 2023.08.02 |
[TECH] Cloudwatch Logs๋ก ๋ก๊ทธ ํ์ผ ์์งํ๊ธฐ (1) | 2023.07.26 |