본 포스트는 Github Actions을 이용하여 NHN Toast Cloud에 배포 자동화를 구축하는 글입니다.

Github Actions를 이용한 CI/CD


android-github-actions-setup-image-35b6a79fea4a7289acb6796cd4ad05b4

프로젝트의 규모가 커질 수록 자동화된 워크플로우는 필수라고 생각한다. 워크플로우란 테스트, 빌드, 배포 등 다야한 작업을 만들어 자동으로 수행되게 해주는 것이라고 보면 되겠다. 이번에 Github Actions를 이용하여 CI/CD를 구축해보려고 한다.


CI/CD를 구축해두면 개발에만 몰두할 수 있게 되어 생산성이 향상된다. 만약 CI/CD를 구축해두지 않으면 일일이 개발자가 테스트를 진행 후 서버에 FTP를 이용하여 프로젝트 파일을 업로드해야 하는 번거로운일을 하게 된다. 이러한 작업은 개발 생산성에 저하를 불러온다. Github Actions으로 CI/CD를 구축해두면 main 브랜치에 push 한번이면 자동으로 테스트 및 배포를 진행하여 준다. 만약 거기서 문제가 생겼다면 오류를 찾아서 해결하면 될 것이고, 아무 이상이 없다면 서버에 정상적으로 배포가되어 서비스가 될 것이다.



NHN Toast Cloud에 어떻게 배포를 시킬 것인가?


49

주로 많이 사용되는 AWS나 구글 클라우드에 배포하는 건 Github Actions에서 템플릿 형태로 코드가 제공된다. 아래와 같이 말이다.

K-211

그러나 NHN Toast cloud에 배포하는 코드가 Github Actions에는 존재하지 않는다. 그래서 직접 코드를 작성하여 구현해주어야 한다. 그렇게 해서 생각한 방식이 SSH이다. Github Actions 에서는 docker처럼 리눅스 이미지를 제공해준다. workflow를 ubuntu 환경에서 동작하도록 하여 NHN Toast Cloud에 ssh를 이용하여 접속시킨 후, git pull 명령어를 이용하여 코드를 최신화하는 방식이다.



name: Django CI/CD

on:
  push:
    branches:
      - django_CI
      - main


jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      max-parallel: 4
      matrix:
        python-version: [3.9]

    services:
      psqldb:
        image: postgres
        env:
          POSTGRES_DB: DB명
          POSTGRES_USER: 아이디
          POSTGRES_PASSWORD: 비번
          POSTGRES_HOST_AUTH_METHOD: trust
          POSTGRES_INITDB_ARGS: --encoding=UTF-8
        ports:
          - 5432:5432

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python $
      uses: actions/setup-python@v1
      with:
        python-version: $
    - name: Install Dependencies
      run: |
        export DJANGO_SETTINGS_MODULE=backend.settings.dev
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Run Tests
      run: |
        pytest
      env:
        SYSTEM_ENV: GITHUB_WORKFLOW

    - name: deploy to NHN Toast Cloud
      uses: appleboy/ssh-action@master
      with:
        host: $
        username: $
        password: $
        port: $
        script: |
          cd airhelper-backend/
          docker stop $
          docker rm $
          docker rmi $
          git fetch --all
          git reset --hard origin/main
          git pull origin main
          docker-compose -f produce.yml up --build -d
          docker exec -it airhelper-backend_app_1 python manage.py collectstatic
          docker exec -it airhelper-backend_app_1 python manage.py migrate
          docker restart airhelper-backend_nginx_1

위 코드는 이번에 Django Rest Framework를 이용하여 개발중인 프로젝트의 GIthub Actions workflow를 작성한 것이다.

  • steps부터 단계별로 차례대로 작업이 수행된다.
  1. python 환경을 셋팅한다.

  2. 해당 프로젝트에 사용된 라이브러리를 설치한다. (requeirement.txt에 기록되어 있다.)

  3. 테스트를 수행한다.

  4. 테스트에 이상이 없으면 NHN Toast Cloud에 SSH로 접속한다. SSH workflow는

    이 제작하신 workflow 코드를 사용하였다. 이것 말고도 많지만 내가 보기엔 이게 제일 사용하기 쉽다고 판단해서 이것으로 사용하기로 했다.

  5. (서버에 SSH로 접속한 상태) 현재 작동중인 docker 컨테이너 작동을 중지시키고 이미지를 모두 삭제한다.

  6. git pull 명령어를 이용하여 코드를 최신화 시킨다.

  7. 도커 이미지를 다시 빌드하여 컨테이너를 작동시킨다.

위와 같이 순서대로 작업이 이루어진다.



후기

코드 버전관리를 Github를 통해서 하고 있으므로 Github에서 자체적으로 제공하는 GIthub Actions를 이용하여 CI/CD를 구축하니 상당히 편리하다. 되도록이면 한 사이트에서 모든 걸 해결하고 싶었다. 현재 대학생 인증이 되어 있으므로 Pro로 업그레이드가 되어 있어 Github Actions의 사용시간도 대폭 늘어났다. 그래서 왠만하면 유료 청구가 되지 않을거라 생각한다.


추후 Github Actions workflow 결과를 Slack에 알려줄 수 있도록 추가로 설정을 해볼 예정이다. 그에 대한 포스트는 별도로 작성하도록 하겠다.