GitHub Actionsを利用してpytestする

# はじめに

本記事では、GitHub Actionsを利用して、Pythonのテスト実行とカバレッジ計測をするGitHub Actionsを作成したいと思います。

[GitHub Actions](https://github.co.jp/features/actions)とは、GitHubが提供するCI/CDのサービスです。

今までCircleCIを利用していましたが、いつの間にかGitHub Actionsが利用できるようになっており、試しに使ってみたら便利だったので記事にしました。

CircleCIと比べてGitHub Actionsが良いな思ったのは以下の3点です。（GitHub ActionsとCircleCIを両方ガッツリ使っているわけでは無いので、間違った内容を言っていたらすいません。）

1. CircleCIでCIを実行するためには、CircleCI上で初期設定を行わなければならず、GitHubとは異なるサイトで設定を行うのが煩雑
1. GitHubにpackage（pythonの登録は現時点ではできないですが、将来的に来そう）やrelease(tag)を登録しようとしたときにGitHub上でCI/CDを走らせた方が一元管理できて良さそう
1. CircleCIと比べて、GitHub ActionsはCIのjobと設定ファイルが1対1で対応させることができ、jobの管理が容易である。

# GitHub Actions

## やりたいこと

* 複数のPythonのversionにてtestを走らせて、特定のversionのカバレッジのみcodecovにcommitする

## 設定ファイルの置き場所

リポジトリの直下に`.github/workflows/`というフォルダを作成して、その中にjobとなるymlファイルを置いていきます。

![スクリーンショット 2020-08-28 9.43.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260295/6f938ff9-1345-5333-afd8-22dce316f01f.png)

このときに、複数個のファイルを置くとそれぞれがjobとなります。

![スクリーンショット 2020-08-28 9.45.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260295/3814283d-176c-5650-720c-390876117883.png)


## 設定ファイルの内容

今回作成する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

テストをしたら、badgeをREADMEとかに貼りたいですよね。

GitHub Actionsならそれぞれのjobごとにbadgeを以下のボタンから取得することができます。

![スクリーンショット 2020-08-28 9.56.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260295/b2598f1c-90cf-a373-087c-f14fe6dd3def.png)


ただ、[この記事](https://qiita.com/akameco/items/e474691964703033e18d)でも言われれているように、リンク先が画像になっているので、リンクなどを正しく設定してあげると良いと思います。



以下の手順で修正できます。

1: 生成されたbadge

```
![pytest](https://github.com/gsy0911/slack-api-decorator/workflows/pytest/badge.svg)
```


2: 生成されたbadgeを[]で囲み、後ろに()をつける

```
[![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を利用して自動デプロイするようになどして見たいです。

# 参考

以下のサイトさんを参考に本設定ファイルを作成しました。

* [Python Tips: PythonのプロジェクトでGitHub Actionsを使いたい](https://www.lifewithpython.com/2020/04/python-github-actions.html)
* [GitHub Actionsでブランチ毎にワークフローを分ける](https://code-log.hatenablog.com/entry/2020/02/07/201830)
* [Codecov GitHub Action](https://github.com/codecov/codecov-action)