Post

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
  1. main ๋˜๋Š” develop ๋ธŒ๋žœ์น˜๋กœ pr์ด ๋ฐœ์ƒ
  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์œ„์น˜ํ•œ github ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ์ฒดํฌ์•„์›ƒ
  3. JDK 17 ์„ค์น˜
  4. gradlew ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ถŒํ•œ๋ถ€์—ฌ
  5. gradle์„ ํ†ตํ•ด ๋นŒ๋“œ
  6. ๋„์ปคํ—ˆ๋ธŒ ๋กœ๊ทธ์ธ
  7. pr์— ๋”ฐ๋ฅธ ๋„์ปค์ด๋ฏธ์ง€ ์ด๋ฆ„ ์„ค์ • develop -> ๊ฐœ๋ฐœ, main -> ์šด์˜
  8. ๋„์ปค ๋นŒ๋“œ & ๋„์ปคํ—ˆ๋ธŒ์— ํ‘ธ์‹œ
deploy
  1. build job์ด ์„ฑ๊ณตํ–ˆ์„ ๊ฒฝ์šฐ์— ์‹คํ–‰
  2. pr์— ๋”ฐ๋ฅธ ๋ฐฐํฌ ํƒ€๊ฒŸ ์„ค์ • develop -> ๊ฐœ๋ฐœ, main -> ์šด์˜
  3. 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.