Github Actions 코드 개선하기

기존의 코드는 다음과 같았다.

name: CI CD pipeline 

on:
  pull_request:
    types: [closed] 
    branches: [main]
  push:
    branches: 
    - main

jobs:
  build:
    defaults:
      run: 
        working-directory: ./test/

    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [18.x] 

    steps:
    - uses: actions/checkout@v4
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v4
      with:
        node-version: ${{ matrix.node-version }}
        cache-dependency-path: './test/package-lock.json'
        cache: 'npm'

    - name: get dev .env
      run: |
        echo "${{ secrets.DEVELOPMENT_ENV }}" > ./.env    

    - name: npm install, build and test
      run: |
        npm ci
        npm run build --if-present
      # npm test

  deploy: 
    runs-on: ubuntu-latest
    needs: build 
    defaults:
      run: 
        working-directory: ./test/

    steps:
      - uses: actions/checkout@v4
      - uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.SERVER_IP }}
          username: ${{ secrets.NODE_USER }}
          password: ${{ secrets.NODE_PASSWORD }} 
          source: "./"
          strip_components: 1
          target: ${{ secrets.SERVER_DIR }}

      - uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_IP }}
          username: ${{ secrets.NODE_USER }} 
          password: ${{ secrets.NODE_PASSWORD }} 
          script: |
            cd ${{ secrets.SERVER_DIR }}/test
            npm ci
            npm run build --if-present
            pm2 start ecosystem.config.js

이를 좀더 세분화로 나누기를 원했으며 무엇보다 scp를 수행하면서 코드의 변경 사항이 일부분인만큼 scp보다 git pull 명령을 수행하는게 더 나을것이라고 생각했다.


gpt의 도움을 받아 2개의 파일로 구성을 나눴다.
1.express-ci.yml
2. express-cd.yml

ci 파일의 경우에는 main을 제외한 모든 브랜치에서 빌드를 수행한다. 이는 github flow 특성 상 기능을 구현하면 PR을 통해서 코드 병합을 수행하기 때문이다. 그리고 빌드 결과물을 아티팩트로 저장한다.


1.express-ci.yml

name: CI Pipeline

on:
  push:
    branches-ignore:
      - main
  pull_request:

jobs:
  build:
    runs-on: ubuntu-latest

    defaults:
      run: 
        working-directory: ./test/

    strategy:
      matrix:
        node-version: [18.x] 

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
            node-version: ${{ matrix.node-version }}
            cache-dependency-path: './test/package-lock.json'
            cache: 'npm'

      - name: get dev .env
        run: echo "${{ secrets.DEVELOPMENT_ENV }}" > ./.env 

      - name: Install dependencies, test and build
        run: |
            npm ci
            npm run build --if-present
            # npm test

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: build-artifacts
          path: ./build

2.express-cd.yml

name: CD Pipeline

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    defaults:
      run: 
        working-directory: ./test/

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Download build artifacts
        uses: actions/download-artifact@v4
        with:
          name: build-artifacts

      - name: Deploy to Dev
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_IP }}
          username: ${{ secrets.USER }} 
          password: ${{ secrets.PASSWORD }} 
          script: |
            git pull 
            cd ${{ secrets.SERVER_DIR }}/test
            npm ci
            npm run build --if-present
            # npm test
            pm2 restart ecosystem.config.js

추가적으로 github actions에서는 환경에 따른 변수 그리고 시크릿을 사용할 수 있다. 현재 서버 환경이 개발과 운영 서버로 구성되어있기에 2개의 환경을 구성했다.


github actions에서는 이러한 환경을 구성할 수 있다.



정말 다양한 설정이 가능하다. 예를 들어 리뷰어를 요구하거나 대기 시간을 설정하거나 배포하고자 하는 브랜치나 tags를 제한할 수도 있다.



이 부분에서 원하는 것은 환경에 대한 Secrets이기 해당하는 부분에 대해서만 추가를 해주었다.



이러한 방식을 설정하게 된다면 시크릿을 생성할 때 어느 배포 환경의 시크릿인지 명시할 필요가 없다는 장점을 가지고 있다고 생각한다. 또한 각 배포 환경마다 동일한 변수명으로 편하게 관리할 수 있기에 재사용성 측면에서도 뛰어난 것 같다.

jobs:
  build:
    runs-on: ubuntu-latest
    environment: 
      name: tset

전체 코드
https://github.com/kwx4957/act

Ref
https://docs.github.com/ko/actions/deployment/targeting-different-environments/using-environments-for-deployment
https://docs.github.com/ko/actions/using-workflows/storing-workflow-data-as-artifacts

'CI&CD' 카테고리의 다른 글

Github Actions 카카오워크 알림 전송  (0) 2024.06.26
Github Actions CI&CD 파이프라인  (0) 2024.06.09
[Github Actions] 다수의 설정 한번에 주입  (0) 2024.06.08
[ArgoCD] 설치하기  (0) 2023.08.14
[ArgoCD] 슬랙 설정하기  (0) 2023.08.14