ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [오분] Test CI를 위한 Github Actions , pytest-django 세팅
    🎁 토이 프로젝트/오분 (2020년 첫 토이 프로젝트) 2020. 3. 25. 02:23

    안녕하세요! 운동하는 개발자 JAY입니다.

     

    코로나-19 때문에 한 달 이상 재택근무를 하고 있네요...

    답답하기도 하지만, 코로나-19 때문에 많이 힘드신 분들에 비하면 견딜만하네요ㅠㅠ

    제가 무언가 해드릴 수도 없고... 힘내시라는 말밖에 못 드리네요 ㅠㅠ 정말 정말 힘내세요!!

     

    오늘은 토이 프로젝트를 하면서 Github Actions 세팅에 대해 알아보겠습니다. 그리고 제가 이 과정에서 어떤 삽질을 했는지(?)에 대해서도 끄적여 보겠습니다 ㅎㅎ

     

     1. What is GitHub Actions 


    그래서 GitHub Actions는 무엇인가? 한 문장으로 요약하자면,

     

    CI(Continuous Integration)와 CD(Continuous Deployment)를 할 수 있는 Tool 

     

    예를 들어 배포, TDD 등을 위해 매번 실행해야 하는 작업들을 자동으로 할 수 있는 Tool입니다. 비슷한 Tool로서는 Travis CI 나 jenkins 같은 Tool들이 있습니다. 

     

    Github Actions의 장점이라고 하면, 우리가 Github에 만든 repo에 대해서 end-to-end로 실행할 수 있다는 점이죠. (다른 추가적인 Tool들을 사용할 필요가 없음)

    게다가 Github Marketplace에 보면 다양한 예제(?)들이 있어서 처음 Github Actions을 사용하시는 분들도 쉽게 세팅을 할 수 있습니다.

     

     

     2. Github Actions  시작하기 


    본인의 repo에 가보면 Actions이라는 탭이 있습니다. Actions 탭을 클릭하면 아래 이미지처럼 본인이 하려고 하는 작업에 대한 workflow 세팅들이 있습니다. 간단하게 Github Actions 용어(?)들을 살펴보겠습니다.

     

    다양한 workflow 예시들

    • workflow: 프로젝트의 build, test, package release, deploy를 위한 프로세스입니다. workflow를 만들어 저장하면 Github Actions에서 이 파일을 읽서 사용자가 custom 한 작업들을 실행합니다. yml 파일로 되어있습니다.
        
    • on (evnet): workflow에서 감지하는 이벤트를 나타냅니다. 프로젝트를 push, pr 등을 할 때 workeflow를 실행시키는 이벤트를 정의합니다. 세부적으로 어떤 branch 일 때, Tag 등을 정할 수 있습니다.

    •  jobs: workflow는 하나 이상의 job으로 구성되며, job은 가상 OS(인스턴스)에서 여러 steps를 실행할 수 있는 작업 단위입니다. 여러 개를 만들 경우 병렬로 작업을 실행합니다.

    •  steps: 작업순서를 나타냅니다.  step은 uses, run으로 나뉘는데, uses다른 사람들이 만들어놓은 명령어를 실행하는 것입니다. runmkdir, cd 등과 같은 명령어를 실행할 수 있습니다.
        

    Django workflow 선택한 화면

    * workflow 문법 설명 문서:  https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions

     

     

     3. workflow + pytest-django 실행 


    2번의 과정까지 하면 기초작업은 끝납니다. 저는 django-pytest를 master에 PR, Push 할 때마다 실행하는 workflow를 만들어 보겠습니다.

     

    주의할 점(?)은 우리가 사용하는 gihub actionsworkflow.yml 은 가상 환경(인스턴스)을 문법으로 만드는 것입니다. 서버에서 본인이 실행하고 싶은 작업들을 단순히 문법으로 작성하는 것입니다.

    예를 들어 처음 workflow가 실행하는 경로를 알고 싶다 하면 run->pwd 하면 pwd명령어 실행 결과가 github actions build log에 나옵니다.

     

    저는 처음에 실행 경로를 알아야 할 이유(?)가 있었는데... 막 커밋 여러번(노가다) 하다가... 동료의 조언으로 그냥 ps 명령어로 보면 된다 해서.. 그렇게 확인했습니다. (참고로 가상 환경 사용자의 home 디렉토리는 repo의 이름입니다.)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    name: Python application
     
    on:
      push:
        branches: [ master ]
      pull_request:
        branches: [ master ]
     
    jobs:
      build:
        runs-on: ubuntu-16.04
        services:
         mysqldb:
            image: mysql:latest
            env:
              MYSQL_USER: 유저이름
              MYSQL_PASSWORD: 유저 패스워드
              MYSQL_DATABASE: 데이터베이스 이름
              MYSQL_ROOT_PASSWORD: root 패스워드
            ports:
              - 3306:3306 
            options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3
            
        steps:
        - uses: actions/checkout@v2
     
        - name: Set up Python 3.7
          uses: actions/setup-python@v1
          with:
            python-version: 3.7
        
        - name: Install dependencies
          run: |
            python -m pip install --upgrade pip
            pip install -r requirements/base.txt
            
        - name: Start Pytest
          run: |
            pytest
    cs

    저는 이렇게 작성했습니다. services는 docker 컨테이너를 정의하는 것입니다. 저는 mysql을 사용할 것이므로 위에 작성한 것처럼 작성하였으며, 다른 걸 사용하고 싶은 분들은 다른 docker 이미지를 작성하시면 됩니다 (docker-compose.yml 작성과 동일합니다)

     

    이제 Django settings 모듈과 pytest.ini 설정을 해줍니다. django settings를 github actions 용으로 하나 더 만들어 줍니다.

    각 환경에 따라 나눈 settings 모듈

    action.py 에는 기본 설정은 다른 settings와 비슷하지만, 우리가 사용할 workflow.yml에 정의되어 있는 mysql docker container에 맞게 세팅해 줍니다. ( 사실 이게 별거 아닌데... 이상하게 여기서 많이 해맸어요.. 그냥 local에서 docker 쓰는거랑 같은 건데 ㅠㅠ)

     

    pytest.ini 파일 설정

    pytest settings를 github actions 용으로 설정하고 master 브랜치에 Push를 하면..

    workflow.yml 이 build 되고 결과에 대하 log (클릭하면 상세 log 확인가능)

    이렇게 결과가 나옵니다. (저는 위에 작성하지 않은 step을 몇 가지 더 추가했습니다)

     

    pytest 실행 결과 (coverage 라이브러리도 사용)
    docker ps 커맨드 실행 화면

    위 이미지는 그냥 궁금해서 docker ps 명령어를 실행해본 결과입니다. 진짜 그냥 서버(인스턴스)라고 보시면 됩니다. 저는 너무 어렵고 복잡하게 생각해서(왜 그랬는지 모르겠지만ㅎㅎ) 처음에 많이 삽질했네요. 

     

     

     4. 마치며 


    오늘은 github actions에 대한 기본적인 내용, 그리고 pytest-django를 실행하는 방법에 대해 간단하게 설명해 보았습니다. 하다가 혹시 어려움이 있으시면 언제든 댓글로 남겨주세요!!

    그럼 오늘도 즐거운 코딩 하시길 바랍니다!! 아디오스~:D

    댓글

운동하는 개발자 JAY-JI