-
Docker + Django에 Gitlab-CI(Pytest) 붙이기파이썬/Django 2021. 10. 24. 13:05
Gitlab CI를 구성하기 위해서는 크게
- GitLab runners 설정하기
- 장고 패키지 설치하기
- 프로젝트 최상위 디렉토리에 .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 결과에 자세한 결과들을 볼 수 있다.
only:
특정 조건에서만 해당 job이 파이프라인에서 실행될 수 있도록 저장하는 키워드
.gitlab-ci.yml 키워드 레퍼런스
Keyword reference for the .gitlab-ci.yml file | GitLab
'파이썬 > Django' 카테고리의 다른 글
[Django] DRF Serializer(시리얼라이저) 동작 원리 (0) 2022.01.24 pydantic이란? (DRF Serializer를 대체할 수 있을까?) (1) 2021.12.14 [Django] Django의 동작 원리와 과정 파헤치기 (1) 2021.10.20 Gunicorn 동작 과정 알아보기 (0) 2021.10.10 [Django] GenericForeignKey (0) 2021.05.23