GitHub Actions를 사용하여 pytest

소개



이 기사에서는 GitHub Actions를 활용하여 Python 테스트 실행과 커버리지 측정을 수행하는 GitHub Actions를 만들고 싶습니다.

GitHub Actions 은 GitHub에서 제공하는 CI/CD 서비스입니다.

지금까지 CircleCI를 이용하고 있었습니다만, 어느새 GitHub Actions를 이용할 수 있게 되어 있어, 시험에 사용해 보면 편리했기 때문에 기사로 했습니다.

CircleCI에 비해 GitHub Actions가 좋다고 생각한 것은 다음의 3점입니다. (GitHub Actions와 CircleCI를 모두 굳게 사용하고 있는 것은 아니기 때문에, 잘못된 내용을 말하고 있으면 안 됩니다.)
  • CircleCI에서 CI를 실행하려면 CircleCI에서 초기 설정을해야하며 GitHub와 다른 사이트에서 구성하는 것이 복잡합니다.
  • GitHub에 package(python의 등록은 현시점에서는 할 수 없습니다만, 장래적으로 오자)나 release(tag)를 등록하려고 했을 때에 GitHub상에서 CI/CD를 달리게 하는 쪽이 일원 관리할 수 있어 좋아 보인다
  • CircleCI에 비해 GitHub Actions는 CI의 job과 구성 파일이 일대일로 대응할 수 있어 job의 관리가 용이하다.

  • GitHub Actions



    하고 싶은 일


  • 여러 파이썬 버전에서 테스트를 실행하고 특정 버전의 커버리지 만 codecov에 커밋합니다.

    설정 파일의 위치



    리포지토리 바로 아래에 .github/workflows/라는 폴더를 만들고 그 안에 job이 될 yml 파일을 둡니다.



    이 때 여러 개의 파일을 넣으면 각각이 job이됩니다.



    설정 파일 내용



    이번에 작성하는 CI는 다음 경우에만 실행되도록 제한됩니다.
  • master에 push되었을 때
  • develop에 pull_request가 있었을 때

  • 또한 테스트 커버리지는 Python3.8 에서의 테스트 결과만 codecov에 올려놓도록 하고 있습니다.

    ※설정의 내용의 대부분은, 참고 사이트씨의를 이용하고 있습니다.
    # ここに設定した名前がActions上に表示される
    name: pytest
    
    on:
      push:
        branches:
          - master
      pull_request:
        branches:
          - develop
    
    jobs:
      pytest:
        name: Run tests with pytest
        # 実行環境として `ubuntu-latest` という名前のものを選ぶ
        runs-on: ubuntu-latest
        # 複数の Python のバージョンでテストするために `strategy.matrix` を設定する
        strategy:
          matrix:
            python-version: [3.7, 3.8]
        steps:
          # リポジトリをチェックアウトする
          # See: https://github.com/actions/checkout
          - name: Checkout
            uses: actions/checkout@v2
          # Python のランタイムをセットアップする
          # バージョンは `strategy.matrix` に並べたものを指定する
          # See: https://github.com/actions/setup-python
          - name: Set up Python ${{ matrix.python-version }}
            uses: actions/setup-python@v1
            with:
              python-version: ${{ matrix.python-version }}
          # Poetry そのものをインストールする
          - name: Install Poetry
            run: |
              curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
          # Poetry へのパスを通す
          - name: Add path for Poetry
            run: echo "$HOME/.poetry/bin" >> $GITHUB_PATH
          # インストールした Poetry を使って必要な Python パッケージをインストールする
          - name: Install Dependencies
            run: poetry install --no-interaction
          # pytest を実行する
          - name: Run Tests
            run: poetry run pytest test --cov=./slack_api_decorator --cov-report=xml
          - name: Upload coverage to Codecov
            # 上記のstepsが全て完了した場合にcodecovへupload
            # 今回はpublic repositoryのためKEYは不要だが、privateなら必要なので注意
            if: ${{ matrix.python-version==3.8 }}
            uses: codecov/codecov-action@v1
            with:
              file: ./coverage.xml
              name: codecov-umbrella
              fail_ci_if_error: true
    
    
    

    GitHub Actions의 배지



    테스트를 하면, badge를 README라든지에 붙이고 싶네요.

    GitHub Actions를 사용하면 각각의 job 마다 badge를 이하의 버튼으로부터 취득할 수가 있습니다.



    다만, 이 기사 하지만 말해지고 있듯이, 링크처가 화상이 되어 있으므로, 링크등을 올바르게 설정해 주면 좋다고 생각합니다.

    다음 절차에 따라 수정할 수 있습니다.

    1: 생성된 배지
    ![pytest](https://github.com/gsy0911/slack-api-decorator/workflows/pytest/badge.svg)
    

    2: 생성된 배지를 []로 묶고 뒤에 ()를 붙인다.
    [![pytest](https://github.com/gsy0911/slack-api-decorator/workflows/pytest/badge.svg)]()
    

    3: 뒤에 ()에 해당하는 CI 링크를 붙이기
    [![github-pytest](https://github.com/gsy0911/slack-api-decorator/workflows/pytest/badge.svg)](https://github.com/gsy0911/slack-api-decorator/actions?query=workflow%3Apytest)
    

    결론



    일단 자주 사용하는 pytest의 GitHub Actions를 이용해 보았습니다.
    이번에는 AWS에 CDK를 이용하여 자동 배포하도록 하고 싶습니다.

    참고



    아래 사이트를 참고로 본 설정 파일을 작성했습니다.
  • 파이썬 팁 : 파이썬 프로젝트에서 GitHub Actions를 사용하고 싶습니다.
  • GitHub Actions에서 분기별로 워크플로 분리
  • Codecov GitHub Action
  • 좋은 웹페이지 즐겨찾기