파이썬/Django

Docker + Django에 Gitlab-CI(Pytest) 붙이기

wookkl 2021. 10. 24. 13:05

GitLab CI/CD

Gitlab CI를 구성하기 위해서는 크게 

  1.  GitLab runners 설정하기
  2. 장고 패키지 설치하기
  3. 프로젝트 최상위 디렉토리에 .gitlab-ci.yml 작성하기

로 이루어져 있습니다.

우선 GirLab runners에 대해 알아보겠습니다.

GitLab Runners란?

  • 빌드, 테스트, 배포 같은 일련의 작업들을 실행하는 애플리케이션
  • 파이프라인에서 GitLab CI/CD와 함께 수행되는 애플리케이션
  • 각 Runner는 사용 가능한 상태(작업이 없는)가 되면 GitLab 인스턴스에 계속해서 요청을 보내 작업들을 할당 받음

이 Runner는  세 가지로 구분되어 있습니다.

간단히 각 Runners의 정의를 살펴보면

Specific runners

  • 하나의 프로젝트에 사용되는 러너

Shared runners

  • GitLab에서 제공해주는 모든 그룹과 프로젝트에서 사용되는 러너이며,
  • 기본적으로 깃랩에서 제공하는 러너들이 16개 정도 있고 따로 사용자가 러너를 구축해서 사용할 수 도 있음

Group runner

  • 특정 그룹내에 있는 서브 그룹과 모든 프로젝트에서 사용되는 러너

이다.

이제 GitLab CI를 구성해봅시다.

1. GitLab runners 설정하기

GitLab 프로젝트 메뉴 → Settings → CI/CD 에 들어갑시다.

 GitLab에서 기본적으로 제공해주는 러너인 Shared runners를 사용하기 위해서 

Enable shared runners for this project를 enable 해줍니다.

2. 장고 패키지 설치하기

프로젝트에 pytest와 pytest-django를 설치해줍니다.

# pytest 패키지 추가
pip install pytest pytest-django

# package 반영
pip freeze > requirements/test.txt

3. .gitlab-ci.yml 작성하기

,gitlab-ci.yml을 프로젝트 최상위 디렉토리에 생성하면 gitlab이 해당 파일을 자동으로 읽어 CI/CD를 진행하게 됩니다.

주의할 점
최상위 디렉토리에 생성해야합니다.
파일 이름이 .gitlab-ci.yml 이어야 합니다.
image: ubuntu:latest # 프로젝트에 사용되는 Dockerfile의 base image

stages:
  - test

services:
  - postgres:13.3

variables:
  POSTGRES_DB: db_name
  POSTGRES_USER: db_user
  POSTGRES_PASSWORD: db_password
  POSTGRES_HOST_AUTH_METHOD: trust
  DJANGO_SETTINGS_MODULE: "project.settings.test"
  SECRET_KEY: "django-test-secret-key"

pytest:
  stage: test
  script:
    - export PGPASSWORD=$POSTGRES_PASSWORD
    - psql -h "postgres" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "SELECT 'OK' AS status;"
    - pip install -r requirements/test.txt
    - cd project # manage.py가 있는곳으로 이동
    - python manage.py makemigrations --settings=$DJANGO_SETTINGS_MODULE
    - pytest --junitxml=../pytest-results.xml # 프로젝트 최상위 디렉토리에 결과 생성
  artifacts:
    reports:
      junit: pytest-results.xml
  only:
    - merge_requests

키워드 별 설명

image

해당 키워드를 사용해 도커 이미지를 사용할 수 있습니다.

stages

  • build
  • test
  • deploy

이렇게 기본적으로 사용되는 stage

유저가 따로 정의할 수도 있습니다.

build → test → deploy 순으로 job이 실행됩니다.

stage가 test인 job이 10개라면 10개가 동시에 parallel하게 돌아가며 모두 다 종료되면 deploy를 진행합니다.

services

각각 jobs 에 연결할 수 있는 도커 이미지를 정의할 수 있습니다.

대체로 DB(MySQL, PostgreSQL, Redis) 컨테이너를 띄우기 위해 사용됩니다.

물론 다른 컨테이너도 띄울 수 있습니다.

network accessible 기능을 제공하기 위해 디자인되었기 때문에 다른 목적의 이미지를 사용하지 않는것이 좋습니다.

variables

환경변수를 지정하는 키워드

왜 Gitlab UI에서 환경변수를 지정해주지 않나?

공식 문서

  • Gitlab UI를 통해 작성한 환경변수들은 services 컨테이너에 전달되지 않음
  • 따라서 직접 yml안에서 작성해야함

DB 환경변수를 POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD 로 똑같이 지정해야하나?

  • postgres라는 컨테이너를 사용하고 위의 이름 대로 지정을 해주면 자동으로 postgres 세팅(유저 생성, DB 생성 등) 을 해줌

 

jobs (pytest)

파이프라인에서 실행되는 jobs

job1:
  script:
     - echo "execute-script-for-job1"

job2: 
  script: 
    - echo "execute-script-for-job2"

우리가 정의한 pytest: 가 실행되어 테스트가 진행된다.

artifacts:reports:junit

테스트 결과를 JUnit format의 XML 파일을 지정한다.

GitLab UI의 pipeline 결과에 자세한 결과들을 볼 수 있다.

Unit test reports | GitLab

 

Unit test reports | GitLab

Documentation for GitLab Community Edition, GitLab Enterprise Edition, Omnibus GitLab, and GitLab Runner.

docs.gitlab.com

only:

특정 조건에서만 해당 job이 파이프라인에서 실행될 수 있도록 저장하는 키워드

 

.gitlab-ci.yml 키워드 레퍼런스

Keyword reference for the .gitlab-ci.yml file | GitLab

 

Keyword reference for the `.gitlab-ci.yml` file | GitLab

Documentation for GitLab Community Edition, GitLab Enterprise Edition, Omnibus GitLab, and GitLab Runner.

docs.gitlab.com

 

댓글수0