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