ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker + Django에 Gitlab-CI(Pytest) 붙이기
    파이썬/Django 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

     

    댓글

Designed by Tistory.