본문 바로가기
Infra & Cloud/DevOps

[GitHub/Django] GitHub CI에 Django Test 및 Redis 적용하기

by newstellar 2021. 9. 10.
반응형

[Django] GitHub CI에 Django Test 및 Redis 적용하기

 

1. GitHub CI란?

  • 우선 CIContinuous Integration의 준말로 테스트, 웹 크롤링 등 로컬에서 직접 수행하던 작업을 자동화하여 충돌 문제를 미연에 방지하는 프로세스를 뜻한다.

 

  • 새로운 버젼의 웹/앱 서비스를 배포하고 싶을 때 일일히 AWS, GCP, Kubernetes 등의 클라우드 시스템을 거치지 않고 GitHub에서 PR된 브랜치를 Merge할 때 자동으로 배포하도록 하는 CD (Continuous Deployment 또는 Continuous Delivery) 개념도 존재한다. CD의 경우 추후 알아보도록 한다. CI와 CD에 대한 설명 및 차이는 redhat 홈페이지에서 자세히 설명하고 있다.

 

 

  • GitHub에서는 일정 기준까지 무료로 CI 기능을 제공하고 있다. 각 Repository의 Pull Requests 탭 오른쪽에 존재하는 Actions가 바로 그 주인공이다.

 

  • Actions를 클릭하여 들어가보면 각 언어 및 프레임워크를 설정할 때 사용하면 편한 템플릿을 제공하고 있어 사용자의 서비스에 따라 선택하면 된다. 필자는 Django로 Backend를 구현하고 있어 Django workflow file을 선택했다.다음은 workflow를 추천받지 않고 스스로 설정하고자 했을 때 만들어지는 default main.yml의 모습이다.
  • GitHub Blog를 만들기 위해 사용하는 jekyll.yml도 존재한다.




2. Django Workflows 뜯어보기

  • 백문이 불여일견이라 했으니 내가 직접 짠 workflow를 살펴보도록 하자.
name: Django CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  test-host:
    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [ 3.8.3 ]

    services:
      mysql:
        image: mysql:5.7
        env:
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
          MYSQL_DATABASE: 'waffle_backend_assignment_2'
          MYSQL_USER: 'waffle-backend'
          MYSQL_PASSWORD: 'seminar'
          MYSQL_ROOT_PASSWORD: 1234
        ports:
          - 3306:3306
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3

      redis:
        image: redis
        ports:
          - 6379:6379
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
    - uses: actions/checkout@v2

    - name: Verify MySQL connection
      run: |
        mysql --version
        mysql --host 127.0.0.1 --port 3306 -u root -p1234 -e "SHOW DATABASES"

    - name: Set up Python 3.8.3
      uses: actions/setup-python@v2
      with:
        python-version: 3.8.3

    - name: Install Dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt

    - name: Run migrations
      run: |
        cd waffle_backend
        python manage.py migrate

    - name: Run Tests
      run: |
        cd waffle_backend
        mysql --host 127.0.0.1 --port 3306 -u root -p1234 -e "grant all privileges on test_waffle_backend_assignment_2.* to 'waffle-backend'@'%';"
        python manage.py test
      env:
        SYSTEM_ENV: GITHUB_WORKFLOW

 

 

반응형

댓글