기존의 코드는 다음과 같았다.
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 |