Event, Runner, Job, Step, Action
CI / CD Tool: GitHub Actions
GitHub Actions vs Jenkins
CI / CD ํด๋ก ์ ๋ช ํ ๊ฒ์ GitHub Action๊ณผ Jenkins๊ฐ ์๋ค. Jenkins๋ ๋ณ๋์ Jenkins ์๋ฒ๋ฅผ ๋ฐ๋ก ๊ตฌ์ถํด์ผ๋๊ธฐ ๋๋ฌธ์ ๋ฌด๋ฃ ํด์ธ GitHub Action์ ์ฌ์ฉํ ์์ ์ด๋ค.
Why Use to GitHub Actions?
- CI / CD ๊ฐ์ํ: ๋ณ๋์ ์๋ฒ(Jenkins ๋ฑ)๋ฅผ ๊ตฌ์ถํ ํ์ ์์ด GitHub์์ ๋ฌด๋ฃ๋ก ์ ๊ณตํ๋ค.
- ์ํํ ํตํฉ: GitHub ์ ์ฅ์์ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๋๋์ด ์๋ํ ๋ฐ ๋ฐ๋ณต์ ์ธ ์์ ์ํ์ ์ ๋ฆฌํจ.
CI / CD ๊ฐ๋
- CI (Continuous Integration): ์ฝ๋๊ฐ ์ง์์ ์ผ๋ก ํตํฉ๋์ด ๋น๋ ๋ฐ ํ ์คํธ๋๋ ํ๋ก์ธ์ค.
- CD (Continuous Deployment/Delivery): ํตํฉ๋ ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ฐฐํฌํ๊ฑฐ๋, ํน์ ์์ ์ ๋ฐฐํฌํ ์ ์๋๋ก ์ค๋นํ๋ ๋จ๊ณ.
GitHub Actions ๊ธฐ๋ณธ ๊ฐ๋
- Event: ์์ ์คํ ์์ ์ ์ ์ํ๋ ํธ๋ฆฌ๊ฑฐ.
- Runner: ์์ ์ ์ํํ๋ ๊ฐ์๋จธ์ ๋๋ ์ปจํ ์ด๋.
- Job: ์ฌ๋ฌ ์คํ (step)์ผ๋ก ๊ตฌ์ฑ๋ ์ฒ๋ฆฌ ๋จ์
- Step: ์์ ์ ์ต์ ๋จ์. ๋จ์ ๋ช ๋ น์ด(Command), ์คํฌ๋ฆฝํธ(Script) ๋๋ ์ก์ (Action)์ ํฌํจ
- Action: ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์, ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ง๋ Script (์ฌ์ฌ์ฉ ๋ฐ ์ค๋ณต ์ ๊ฑฐ)
Git Actions: Workflow ๊ตฌ์ฑ ๋ฐ ์์ฑ
Workflow ์ ์
- ์ํฌํ๋ก์ฐ (Workflow): Github Actions์์ ์๋ํ ์์
์ ์ ์ํ๋ ํ์ผ. `./github/workflows` ํด๋ ๋ด์ YAML ํ์ผ๋ก ์์ฑ.
- ์ฌ๋ฌ ๊ฐ์ ์ํฌํ๋ก์ฐ ํ์ผ์ ์์ฑํ ์ ์๋ค.
1. ON ์์ฑ : Event = ์์ ์ด ์ธ์ ์คํ๋๋์ง ์์ ์ ์
- ๋ธ๋์น ๊ธฐ์ค: ์ด๋ค ๋ธ๋์น์ ์ด๋ค ์ก์ (Push ํน์ Pull Reqeust ๋ฑ)์ด ๋ฐ์ํ๋์ง ๊ธฐ์ค์ผ๋ก ์์ ์ํ
- ์ด์ ๊ธฐ์ค: ๋ธ๋์น์ ๋น์ทํ๊ฒ ์ด์๊ฐ ๋ฐ์๋ ์์ , ์ด๋ค ํ์ ์ผ๋ก ๋ฐ์๋์๋์ง ๋ฑ์ ๊ธฐ์ค์ผ๋ก ์์ ์ํ
- ์๊ฐ ๊ธฐ์ค: cron ๋ฌธ๋ฒ์ ํตํด ์ธ์ ๋ช์ ๋ช๋ถ ๋ง๋ค ์ํํ ๊ฒ์ธ์ง ์ค์ผ์ค์ ๋ฐ๋ผ ์์ ์ํ
2. JOB ์์ฑ : Job = ์์ ์ฒ๋ฆฌ ๋จ์
๋ ๋ฆฝ๋ ๊ฐ์ ๋จธ์ (VM) ๋๋ ์ปจํ ์ด๋(Container)์์ ๋์๊ฐ๋ ํ๋์ ์ฒ๋ฆฌ ๋จ์๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ๋ ฌ๋ก ์ํํ๋ค.
- 1 Workflow : N Job
- ํ๋์ ์ํฌํ๋ก์ฐ๋ ์ฌ๋ฌ๊ฐ์ Job์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ ์ ์ด๋ ํ๋์ Job์ ์์ด์ผํ๋ค.
3. RUN-ON ์์ฑ : Runner = Job ์ํ์ ์ํ OS(๋จธ์ ) ์ ์
- 1 Job : 1 Runner
- Workflow๋ง๋ค Runner๋ฅผ ์ ์ํ๋๊ฒ ์๋, Job ๋ง๋ค Runner๋ฅผ ์ ์
- Workflow ๋ด ๋ค์์ Job ๊ฐ๊ฐ ๋ณ๊ฐ์ OS(๋จธ์ ) ์ค์ ๊ฐ๋ฅ
- Workflow๋ง๋ค Runner๋ฅผ ์ ์ํ๋๊ฒ ์๋, Job ๋ง๋ค Runner๋ฅผ ์ ์
4. STEP ์์ฑ : ์์์ ์ฒ๋ฆฌ ๋จ์ (Script ํน์ Action)
name: learn-github-actions
run-name: ${{ github;actor }} is learning GitHub Actions
on: [push]
jobs:
check-bats-version:
runs-on: ubuntu-latetst
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm install -g bats
- run: bats -v
- RUN: ์์ ๋จ๊ณ๋ ๋จ์ํ ์ปค๋งจ๋(Command)๋ ์คํฌ๋ฆฝํธ(Script)๊ฐ ๋ ์๋ ์๊ณ ,
- USES: ์ก์
(Actions)์ด๋ผ๊ณ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ ์ฑ๊ฒฉ์ ์คํฌ๋ฆฝํธ(Script)๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํ ์ ์๋ค.
- ์์ ์์์์ ์ฒดํฌ์์ ์ก์ (`actions/checkout`): ์ฝ๋ ์ ์ฅ์๋ก๋ถํฐ ์ฝ๋๋ฅผ ๋ด๋ ค๋ฐ๋ ์คํฌ๋ฆฝํธ
๋ฐฉ๊ธ ์ค๋ช ํ STEP(RUN, USES)์ด ํฌํจ๋ Workflow ์์๋ฅผ ์๋์ ๋์๊ณผ ํจ๊ป ์ดํดํด๋ณผ ์ ์๋๋ก ํ์.
์๋ ์ ์ฐจ: Github Action์ผ๋ก CI + ๊ฐ๋ฐ์๊ฐ ์ง์ CD
- 4๊ฐ์ง ์ ์ฐจ๋ง ๊ธฐ์ตํด๋ณด์ !
- Develop → Test Java → Build Java → Build Docker Image → Push → Pull → Run
- ํ์ ์์ญ: Java์ ๊ด๋ จ๋ ์ ์ฐจ
- ํ๋์ ์์ญ : Docker์ ๊ด๋ จ๋ ์ ์ฐจ
- CI ์ ์ฐจ: 1. Develop → 2. Test Java → 3. Build Java → 4. Build Docker Image → 5. Push
- CD ์ ์ฐจ: 6. Pull → 7. Run
- 3๊ฐ ํ์
์ ์ธ์คํด์ค: (1) Local + (2) Github Actions/ Jenkins + (3) Server
- CI / CD ์ ๋ต ํน์ ์ธํ๋ผ ๊ตฌ์ฑ: ๊ฐ ์ธ์คํด์ค์ 4๊ฐ์ ์ ์ฐจ๋ฅผ ์ด๋ป๊ฒ ๋ฐฐ์นํ ๊ฒ์ธ๊ฐ ?
- Develop: (1) Local ์์ ์ํ ← ๋ถ๋ณ(๊ณ ์ ) ์ ์ฐจ
- Test Java: (1) Local ํน์ (2) Github Actions / Jenkins ์์ ์ํ ← ๊ฐ๋ณ ์ ์ฐจ
- Build Java: ์์ ๋์ผ
- Build Docker Image: ์์ ๋์ผ
- Push Docker Image from Registry: ์์ ๋์ผ
- Pull Docker Image from Registry: ์์ ๋์ผ
- Run Docker Image: (3) Server์์ ์ํ ← ๋ถ๋ณ(๊ณ ์ ) ์ ์ฐจ
- CI / CD ์ ๋ต ํน์ ์ธํ๋ผ ๊ตฌ์ฑ: ๊ฐ ์ธ์คํด์ค์ 4๊ฐ์ ์ ์ฐจ๋ฅผ ์ด๋ป๊ฒ ๋ฐฐ์นํ ๊ฒ์ธ๊ฐ ?
+. Docker Image ์ ๋ก๋ ๋ฐฉ์: EC2์ Docker Image๋ฅผ ์์ฐฉ์ํค๊ธฐ ์ํ ๋ฐฉ๋ฒ 2๊ฐ์ง
1. SCP: Docker Image ๊ฒฐ๊ณผ → Tar ์์ถ → SCP (Secured Copy) ํตํด EC2๋ก ์ ๋ฌ → EC2 ๋ด ์คํ
2. ECR: Docker Image ๊ฒฐ๊ณผ → ECR ์ ๋ก๋ → EC2 ๋ด ECR๋ก ๋ถํฐ ๋ค์ด๋ก๋ → EC2 ๋ด ์คํ
- ECR์ ์
๋ก๋๋ ๋น๋ ์ด๋ฏธ์ง๋
- ECS๋ฅผ ํตํด EC2์ ์ฐ๊ฒฐํ์ฌ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ ๊ฐ๋ฅ
- Terraform์ ํตํด EC2์ ์ฐ๊ฒฐํ์ฌ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ ๊ฐ๋ฅ
- Terraform Provisioner๋ฅผ ํตํด ์ํ๋ EC2์ ์ ์ํด์ ๊ทธ ์์ ๋ช ๋ น์ด ์ํ
CI ์ฌ์ ์ค๋น : ๋ฐฐํฌํ๊ณ ์ ํ๋ Java ์ฝ๋ ์์ฑ ๋ฐ Github์ ์ ๋ก๋
์์น: Local(๋ด ์ปดํจํฐ)
Develop your (Java) Application: Java ๊ฐ๋ฐ
- Docker Image๋ ๋ฐฐํฌํฝ Java ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ด๋ฏธ์ง๋ก, ๊ฐ๋ฐ ํ GitHub Repository์ ์์ค์ฝ๋ ์ ๋ก๋(Git Push)
์ถ๊ฐ ์ค๋น:
- GitHub Action ๋์ ์คํฌ๋ฆฝํธ: GitHub๊ฐ ์ธ์ํ๋๋ก `.github/workflows/scriipt.yml` ์์น์ ์คํฌ๋ฆฝํธ ๋ฑ๋ก
- Dockerfile: GitHub Actions์์ Docker ๋น๋๋ฅผ ์ํํ ์ ์๋๋ก ํ๋ก์ ํธ์ Dockerfile ์ ์.
CI: Github ๋ด Java ์ฝ๋๋ฅผ Github Action์ผ๋ก ๊ฐ์ ธ์ Docker ๋น๋
์์น : Github Action
1. GitHub Action ์คํ ํธ๋ฆฌ๊ฑฐ
- ์ฝ๋๊ฐ GitHub Repository์ ํธ์๋๋ฉด, Action ์คํฌ๋ฆฝํธ๊ฐ ๊ตฌ๋๋์ด ๋น๋ ๋ฐ Docker ์ด๋ฏธ์ง๋ฅผ ์์ฑ.
2. GitHub Actions ์คํฌ๋ฆฝํธ ์ํ ์ ์ฐจ
Java ํ ์คํธ: Java ์์ค์ฝ๋๋ฅผ ํ ์คํธ→ ์ด๋ฒ ์ค์ต์์๋ ํด๋น ์ ์ฐจ ์ ์ธ.- Java ๋น๋: Gradle๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋น๋ (JAR ๋๋ WAR ์์ฑ)
- Docker ์ด๋ฏธ์ง ๋น๋: Dockerfile์ ํ์ฉํด Docker Image ์์ฑ.
- ๋น๋๋ Docker Image ์ ๋ก๋๋ฅผ ์ํ ์ ์ฅ์ Registry๋ก ์ฌ์ฉํ๊ธฐ ์ํ Docker Hub์ ๋ก๊ทธ์ธ
- Docker Hub์ ์์ ๋น๋ํ Docker Image ์ ๋ก๋(Push)
Test and Build Java Application
- ์์ ๊ฐ๋ฐํ Java ์์ค์ฝ๋๋ฅผ ํ ์คํธ ํ ๋ค, Java ๋น๋
- ์์ ์ธ๊ธํ์๋ Java ์ฝ๋์ ๋ํ ํ ์คํธ๋ ์ด๋ฒ ์ค์ต์์ ์ ์ธ. Java ๋น๋๋ Gradle์ ํตํด ๊ฐํธํ๊ฒ ์งํ
Build Docker Image and Push Docker Image to Registry
- Build : Docker Image ์์ฑ ← Dockerfile
- Github์ Java ์ฝ๋์ ํจ๊ป ์ฌ๋ ธ๋ Dockerfile์ ํตํด Github Action์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์์ฑ
- Push: Docker Image ์
๋ก๋ → Docker registry (๋์ปค ์ ์ฅ์)
- ๋น๋๋ Docker Image ์
๋ก๋๋ฅผ ์ํ ์ ์ฅ์ Registry๋ก ์ฌ์ฉํ๊ธฐ ์ํ Docker Hub์ ๋ก๊ทธ์ธ
- Github Action ์คํฌ๋ฆฝํธ ๋ด ๋ฏผ๊ฐํ ์ ๋ณด ์ง์ ๋ฃ์ผ๋ฉด ์ํํ๊ธฐ์ ๋ฐ๋ก ์ค์ ์ผ๋ก ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ฃผ์
- Docker Hub์ ๋ก๊ทธ์ธ์์ ์์ด๋์ Access Token ๊ฐ์ด ํ์ํ๋ฐ, ์ด๊ฑด ํ์ทจ๋๋ฉด ์๋๋ค.
- ๋น๋๋ Docker Image ์
๋ก๋๋ฅผ ์ํ ์ ์ฅ์ Registry๋ก ์ฌ์ฉํ๊ธฐ ์ํ Docker Hub์ ๋ก๊ทธ์ธ
CD: AWS EC2 ์์ฑ ํ ๋ด๋ถ์ ์ํ์ฌ CI๋ก ๋ง๋ Docker ์ด๋ฏธ์ง ์คํ
์์น : AWS EC2 = ์ ํ๋ฆฌ์ผ์ด์ (ํ๋ก๊ทธ๋จ)์ด ๊ตฌ๋๋ ์๋ฒ
- Pull: Docker Image ๋ค์ด๋ก๋ ← Docker Registry (๋์ปค ์ ์ฅ์)
- ๊ฐ๋ฐ์๊ฐ ์ง์ AWS EC2์ ์ ์ํ์ฌ, ์์ Docker Hub์ ์
๋ก๋ํ Docker Image ๋ค์ด๋ก๋
- ๊ฐ์ฅ ๋จผ์ AWS EC2์๋ ๊ธฐ๋ณธ์ ์ผ๋ก Docker๊ฐ ์ค์น๋์ด์์ง ์๊ธฐ ๋๋ฌธ์, Docker ์ค์น๋ฅผ ๋จผ์ ํด์ผํ๋ค.
- Docker Hub์์ Docker Image๋ฅผ ๋ค์ดํ ๊ฒ์ด๊ธฐ์ Docker Hub์ ๋ก๊ทธ์ธ
- ๋ก๊ทธ์ธ ์๋ฃํ Docker Hub์์ Docker Hub์ ๋ก๊ทธ์ธ
- ๋ก๊ทธ์ธ ์๋ฃํ Docker Hub์์ Docker Image๋ฅผ ๋ค์ด๋ก๋ (Pull)
- ๊ฐ๋ฐ์๊ฐ ์ง์ AWS EC2์ ์ ์ํ์ฌ, ์์ Docker Hub์ ์
๋ก๋ํ Docker Image ๋ค์ด๋ก๋
- Run: Docker Image ์คํ = Container
- ๋ก๊ทธ์ธ ์๋ฃํ Docker Hub์์ Docker Image ๋ค์ด๋ก๋ (Pull) ์๋ฃํ๋ค๋ฉด Docker Image ๊ตฌ๋
- Docker Container ๊ตฌ๋ ๋ฐ ์๋ฒ ํ์ธ
์ด์ด์ ๋ค์ํฌ์คํ ์ ์ค๋ ์์ฑํ ํฌ์คํ ์ ์ง์ ์ค์ตํ๋ ๊ณผ์ ์ ํฌ์คํ ํด๋ณผ ์์ ์ด๋ค.
โน๏ธ ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
'๐ปDEV-STUDY > Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] Dockerize #2 (5) | 2024.11.01 |
---|---|
[Docker] Dockerize #1 (0) | 2024.11.01 |
[Github Action & Docker]์๋: Github Action์ผ๋ก CI / CD ๋ชจ๋ ์๋ ์ฒ๋ฆฌ #3 (4) | 2024.10.29 |
[GitHub Action & Docker] CD: AWS EC2 ์์ฑ ํ ๋ด๋ถ ์ ์ ํ CI๋ก ๋ง๋ Docker ์ด๋ฏธ์ง ์คํ #2 (2) | 2024.10.29 |
[GitHub Action & Docker] ์๋: Github Action์ผ๋ก CI + ๊ฐ๋ฐ์๊ฐ ์ง์ CD #1 (3) | 2024.10.29 |