Skip to content

Git Action을 이용한 CI/CD

개요

이 문서는 Git Action을 이용해 CI/CD 파이프 라인을 설정하는 방법에 대해 설명합니다. 아래는 deploy.yml 파일의 구조와 각 단계에 대한 설명입니다.


deploy.yml 파일 구조

1. Workflow 이름

yaml
name: Deploy to NCP

Workflow의 이름은 "Deploy to NCP"로 설정되었습니다.


2. 실행 조건

yaml
on:
  push:
    branches:
      - [dev-*, main]

이 Workflow는 dev 브랜치에 push 이벤트가 발생했을 때 실행됩니다.


Jobs 정의

1. CI (빌드 단계)

Job 이름: build

yaml
jobs:
  build:
    runs-on: ubuntu-latest

CI 단계는 ubuntu-latest 환경에서 실행됩니다.

Steps

  1. Repository Checkout

    yaml
    - name: Checkout repository
      uses: actions/checkout@v3

    현재 브랜치를 checkout 합니다.

  2. Node.js 환경 설정

    yaml
    - name: Set up Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '16.16.0'

    Node.js 16.16.0 버전을 사용합니다.

  3. 의존성 설치

    yaml
    - name: Install dependencies
      run: yarn install

    yarn install 명령어를 실행하여 프로젝트의 의존성을 설치합니다.

  4. 프로젝트 빌드

    yaml
    - name: Build project
      run: yarn build

    yarn build 명령어를 실행하여 프로젝트를 빌드합니다.

  5. 빌드 아티팩트 업로드

    yaml
    - name: Upload build artifacts
      uses: actions/upload-artifact@v3
      with:
        name: build
        path: build/

    빌드된 파일을 Git Action의 스토리지에 업로드합니다.


2. CD (배포 단계)

Job 이름: deploy

yaml
deploy:
  needs: build
  runs-on: ubuntu-latest

CD 단계는 CI 단계 (build)가 완료된 후 실행됩니다.

Steps

  1. 빌드 아티팩트 다운로드

    yaml
    - name: Download build artifact
      uses: actions/download-artifact@v3
      with:
        name: build
        path: build/

    CI 단계에서 업로드했던 빌드 아티팩트를 다운로드합니다.

  2. SSH 키 설정

    yaml
    - name: Setup SSH Key
      run: |
        mkdir -p ~/.ssh
        echo "${{ **secrets.NCP_SSH_KEY }**}" > ~/.ssh/id_rsa
        chmod 600 ~/.ssh/id_rsa
        ssh-keyscan -H ${{ secrets.NCP_HOST }} >> ~/.ssh/known_hosts

    SSH 키를 설정하여 원격 서버와의 연결을 준비합니다.

  3. 백업 파일 생성

    yaml
    - name: make backup file
      run: |
        ssh ${{ secrets.NCP_USER }}@${{ secrets.NCP_HOST }} -p 8003 'sh /home/reload.sh'

    기존 파일을 백업하기 위해 원격 서버에서 스크립트를 실행합니다.

  4. 파일 배포

    yaml
    - name: Deploy files to NCP
      run: |
        scp -P 8003 -r build/* ${{ secrets.NCP_USER }}@${{ secrets.NCP_HOST }}:/home/irontrain/briggsTest/admin_tobe

    빌드된 파일을 원격 서버의 지정된 경로로 전송합니다.

  5. 서버 재시작 (선택 사항)

    yaml
    - name: Restart server (Optional)
      run: |
        ssh ${{ secrets.NCP_USER }}@${{ secrets.NCP_HOST }} -p 8003 'cd /home/irontrain/briggsTest/'

    서버를 재시작하여 변경 사항을 적용할 수 있습니다.


요약

deploy.yml 파일은 Git Action을 이용해 CI/CD 파이프라인을 설정하는 방법을 명확히 설명합니다. CI 단계에서는 프로젝트를 빌드하고, CD 단계에서는 원격 서버에 배포합니다. 이를 통해 효율적이고 반복 가능한 배포 프로세스를 구축할 수 있습니다.

yaml
// deploy.yml

name: Deploy to NCP

on:
  push:
    branches:
      - dev

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '16.16.0'

      - name: Install dependencies
        run: yarn install

      - name: Build project
        run: yarn build

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

  deploy:
    needs: build
    runs-on: ubuntu-latest

    steps:
      - name: Download build artifact
        uses: actions/download-artifact@v3
        with:
          name: build
          path: build/

      - name: Setup SSH Key
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.NCP_SSH_KEY }}" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan -H ${{ secrets.NCP_HOST }} >> ~/.ssh/known_hosts

       - name: make backup file
       run: |
         ssh ${{ secrets.NCP_USER }}@${{ secrets.NCP_HOST }} -p ${{ secrets.NCP_PORT }} 'sh ${{ secrets.BACKUP_SCRIPT_PATH }}'

      - name: Deploy files to NCP
        run: |
          scp -P ${{ secrets.NCP_PORT }} -r build/* ${{ secrets.NCP_USER }}@${{ secrets.NCP_HOST }}:${{ secrets.DEPLOY_PATH }}

      - name: Restart server (Optional)
        run: |
          ssh ${{ secrets.NCP_USER }}@${{ secrets.NCP_HOST }} -p ${{ secrets.NCP_PORT }} 'cd ${{ secrets.PROJECT_PATH }}'

IronTrain Tech Blog