Github Actions
๐ฌIntro
github actions์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
โ Github actions
github์์ ์ ๊ณตํ๋ ์๋ํ ๋๊ตฌ์ ๋๋ค. github์ ํน์ ๋ธ๋์น๋ก push๋ pr์ด ๋ฐ์ํ ๋ ๊ฐ๋ฐ์๊ฐ ์ ์ํด๋์ ์์ ์ ์๋์ผ๋ก ์คํํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ํด๋น ์์ ๋ค์ github๊ฐ ์ ๊ณตํ๋ ๊ฐ์ํ๊ฒฝ(ํด๋ผ์ฐ๋ pc)์์ ์งํ๋ฉ๋๋ค.
1. workflow
- ํน์ ์ด๋ฒคํธ(push ํน์ pr)๊ฐ ๋ฐ์ํ๋ฉด ์คํ๋๋ ์์ ์ ๋๋ค.
.github/workflows
ํด๋ ๋ด์ YAML ํ์ผ๋ก ์ ์๋ฉ๋๋ค.
2. Job
- workflow ๋ด์์ ์คํ๋๋ ์์ ๋จ์์ ๋๋ค.
- ์ฌ๋ฌ job์ผ๋ก ๋๋ ์ ์์ผ๋ฉฐ, ๊ฐ job์ ์๋ก
๋ ๋ฆฝ๋ ๊ฐ์ํ๊ฒฝ
์์ ์คํ๋ฉ๋๋ค.
3. Step
- Job ์์์ ์คํ๋๋ ์์ ์ ์ธ๋ถ ๋จ๊ณ์ ๋๋ค.
- ๊ฐ Step์ ์คํฌ๋ฆฝํธ๋ก ์ง์ ์์ ์ ์ ์ํ ์ ์๊ณ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ ์ํด ๋์ ์ก์ ์ ์คํํ ์ ์์ต๋๋ค.
4. Action
- ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ ์ํด ๋์ ์์ ์ ๋๋ค. ์ฆ, ๋ชจ๋์ด๋ผ๊ณ ์ดํดํ์๋ฉด ๋ฉ๋๋ค.
๐ ์์
ํ์ฌ ์ฌ์ด๋ํ๋ก์ ํธ์์ ์ฌ์ฉํ๊ณ ์๋ CI/CD ์คํฌ๋ฆฝํธ๋ฅผ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
Jobs
build
- main ๋๋ develop ๋ธ๋์น๋ก pr์ด ๋ฐ์
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์นํ github ๋ ํฌ์งํ ๋ฆฌ๋ก ์ฒดํฌ์์
- JDK 17 ์ค์น
- gradlew ํ์ผ์ ์คํํ๊ธฐ ์ํด ๊ถํ๋ถ์ฌ
- gradle์ ํตํด ๋น๋
- ๋์ปคํ๋ธ ๋ก๊ทธ์ธ
- pr์ ๋ฐ๋ฅธ ๋์ปค์ด๋ฏธ์ง ์ด๋ฆ ์ค์ develop -> ๊ฐ๋ฐ, main -> ์ด์
- ๋์ปค ๋น๋ & ๋์ปคํ๋ธ์ ํธ์
deploy
- build job์ด ์ฑ๊ณตํ์ ๊ฒฝ์ฐ์ ์คํ
- pr์ ๋ฐ๋ฅธ ๋ฐฐํฌ ํ๊ฒ ์ค์ develop -> ๊ฐ๋ฐ, main -> ์ด์
- EC2 ์๊ฒฉ ์ ์ ๋ฐ ๋์ปค์ปดํฌ์ฆ๋ฅผ ์ด์ฉํ ๋น๋
CI/CD Script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# ์ํฌํ๋ก์ฐ ์ด๋ฆ ์ค์
name: Java CI/CD with Gradle
# ์ํฌํ๋ก์ฐ ์คํ ์กฐ๊ฑด
# main, develop ๋ธ๋์น์ pr์ด ๋ฐ์ํ์๋ ์คํ
on:
pull_request:
branches: [ main, develop ]
# ์ ํ๋ฆฌ์ผ์ด์
์คํ์ ์ํด ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์ฝ์ ์ ์๋ ๊ถํ ๋ถ์ฌ
permissions:
contents: read
# ์์
์ ์
# 1. build
# 2. deploy
jobs:
# 1. build
build:
runs-on: ubuntu-22.04 # ์ฐ๋ถํฌ์์ ์คํ
# ์์
์คํ
steps:
# ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฌ๋ผ๊ฐ ์๋ ๋ ํฌ์งํ ๋ฆฌ๋ก ์ฒดํฌ์์
# ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ ์ํด๋์ ์ก์
์ด์ฉ
- name: ๋ ํฌ์งํ ๋ฆฌ ์ฒดํฌ์์
uses: actions/checkout@v4
with:
token: $ # ์๋ธ๋ชจ๋ ์ ๊ทผ์ ์ํ ํ ํฐ
submodules: true # ์๋ธ๋ชจ๋๋ค๋ ํจ๊ป ๊ฐ์ ธ์ด
# ์ ํ๋ฆฌ์ผ์ด์
๋น๋์ ์ํ java ์ค์น
# ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ ์ํด๋์ ์ก์
์ด์ฉ
- name: JDK 17 ์ค์น
uses: actions/setup-java@v4
with:
java-version: '17' # ์๋ฐ ๋ฒ์
distribution: 'temurin' # ์ ๊ณต์
# gradlew ์คํ์ ์ํ ๊ถํ ๋ถ์ฌ
- name: gradlew ๊ถํ ๋ถ์ฌ
run: chmod +x gradlew # ์คํ๊ถํ๋ถ์ฌ
# gradle์ ์ด์ฉํ ๋น๋
- name: Gradle ํตํด ๋น๋
run: ./gradlew clean build # ๋น๋
# ๋์ปค ํ๋ธ ๋ก๊ทธ์ธ
# ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ ์ํด๋์ ์ก์
์ด์ฉ
- name: DockerHub ๋ก๊ทธ์ธ
uses: docker/login-action@v3
with:
username: $ # ๋์ปค ๋ก๊ทธ์ธ์ ์ํ ์ ์ ๋ค์
password: $ # ๋์ปค ๋ก๊ทธ์ธ์ ์ํ ํ ํฐ
# pr์ ๋ฐ๋ฅธ ๋์ปค ์ด๋ฏธ์ง ์ด๋ฆ ๋ฐ ํ๊ฒฝ ์ค์
# develop -> ๊ฐ๋ฐ, main -> ์ด์
- name: Docker ์ด๋ฏธ์ง ์ด๋ฆ ๋ฐ ํ๊ฒฝ ์ค์
run: |
if [[ "$" == "main" ]]; then
echo "IMAGE_NAME=fashion-forecast-prod" >> $GITHUB_ENV
elif [[ "$" == "develop" ]]; then
echo "IMAGE_NAME=fashion-forecast-dev" >> $GITHUB_ENV
fi
# EC2์์ ์ฌ์ฉํ๊ธฐ์ํด ๋์ปค ๋น๋ & ํ๋ธ์ ํธ์
# ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ ์ํด๋์ ์ก์
์ด์ฉ
- name: ๋์ปค ๋น๋ & ํธ์
uses: docker/build-push-action@v6
with:
context: . # ๋์ปค๊ฐ ๋น๋๋ฅผ ์ํํ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก
file: ./Dockerfile # ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ์๋ ๋์ปคํ์ผ
push: true # ์ด๋ฏธ์ง ๋น๋ ํ ๋ ์ง์คํธ๋ฆฌ์ ํธ์
platforms: linux/amd64 # ๋น๋ํ ํ๋ซํผ ์ง์ (EC2์ ์ผ์น)
tags: $/$:latest # ํ๊ทธ ์ง์
# 2. deploy
deploy:
# needs ์กฐ๊ฑด์ผ๋ก build๊ฐ ์ฑ๊ณตํ์๋๋ง ์คํ
needs: build
runs-on: ubuntu-latest # ์ฐ๋ถํฌ์์ ์คํ
steps:
# pr์ ๋ฐ๋ฅธ ๋ฐฐํฌ ํ๊ฒ ์ค์ , ๋์ปค ์ปดํฌ์ฆ ํ์ผ์ ์ด๋ฆ์ ์ค์ ํ๊ธฐ ์ํจ
# develop -> ๊ฐ๋ฐ, main -> ์ด์
- name: ๋ฐฐํฌ ํ๊ฒ ์ค์
run: |
if [[ "$" == "main" ]]; then
echo "DEPLOY_ENV=prod" >> $GITHUB_ENV
elif [[ "$" == "develop" ]]; then
echo "DEPLOY_ENV=dev" >> $GITHUB_ENV
fi
# EC2 ์๊ฒฉ ์ ์ ๋ฐ ๋์ปค์ปดํฌ์ฆ๋ฅผ ์ด์ฉํ ๋น๋
# ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ ์ํด๋์ ์ก์
์ด์ฉ
- name: EC2 ์๊ฒฉ ์ ์ ๋ฐ Docker compose
uses: appleboy/ssh-action@master
with:
username: $ # EC2 ์ ์ ๋ค์
host: $ # EC2 ํธ์คํธ
key: $ # EC2 ํค(pemํค)
script_stop: true # ์๋ ์คํฌ๋ฆฝํธ๊ฐ ์คํจํ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฆ์ ์ค๋จ
# ๋์ปค ์ด๋ฏธ์ง ๋น๊ฒจ์ค๊ธฐ
# develop -> fashion-forecast-dev:latest, main -> fashion-forecast-prod:latest
# ๋์ปค ์ปดํฌ์ฆ๋ฅผ ์ด์ฉํ ๋์ปค ์ด๋ฏธ์ง ๋ค์ด & ๋น๋(-f๋ ์คํ์ ํ์ธ ๋ฉ์ธ์ง๋ฅผ ์๋ตํ๊ณ ๊ฐ์ ๋ก ์คํ, ๋น๋๋ -d ์ต์
์ผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ)
# develop -> docker-compose-dev.yml, main -> docker-compose-prod.yml
# ๋์คํฌ ๊ด๋ฆฌ๋ฅผ ์ํ ์ฌ์ฉํ์ง ์๋ ๋ถํ์ํ ์ด๋ฏธ์ง ์ญ์
script: |
sudo docker pull $/fashion-forecast-$:latest
sudo docker compose -f docker-compose-$.yml down
sudo docker compose -f docker-compose-$.yml up -d
sudo docker image prune -f
This post is licensed under CC BY 4.0 by the author.