【GitHub】Actionsを使ってコミット時のコードチェック・ユニットテストの自動化をする


投稿日 2023年6月6日 >> 更新日 2023年6月9日

概要

GitHubのActionsについて簡単に説明をしてから、Actionsで実行させるワークフロー(コードチェックやユニットテスト)の権限を有効にしたり、ワークフローのファイルを作成しコミットします。

レポジトリの作成については以下の記事をご覧ください。

実行環境

実行環境
Windows Subsystem for Linux
git version 2.17.1

Actionsについて

GitHubはバージョン管理ツールであるGitのリポジトリをホスティングすることができるサービスですが、GitHubの「Actions」というサービスを利用することで、ローカルリポジトリがリモートへホスティングされる度に任意のワークフローを実行することができます。

ソフトウェア開発における最も大事なワークフローといえばテストです。

テストの他にもソースコードのチェックや各チームで決められたルールにのっとったワークフローも有るかと思います。

ソフトウェア開発の終盤で先のワークフロー(コードチェックやユニットテスト)を行うと思いますが、Actionsはリポジトリがコミットされるとワークフローが実行されるように自動化をすることができます。

上記のような流れの手法を「CI(Continuous integration:継続的インテグレーション)」と呼びます。

他にもデプロイを自動化させる「CD(Continuous delivery:継続的デリバリー/Continuous deployment:継続的デプロイ)」という手法もあります。

ActionsではGitHubでリポジトリがコミットされる度に「CI/CD」ワークフローを走らせることができます。

Webアプリのような常に稼働しているサービスの開発では、機能であったりセキュリティであったりよりスピーディーな開発が求められるかと思います。

そんな短い開発スパンの中でビルド・テスト・デプロイを毎回手動で実行するのではなく、プロセス全体を自動化することによって、開発者の負担軽減やソフトウェアの品質が担保されるようになります。

「CI/CD」ツールのサービスはGitHubのActions以外にも「CircleCI」「Jenkins」などがあります。

今回GitHubのActionsを選んだ理由は、GitHubサービスのみで開発プロセスを終えることが出来るので、他のサービスを取り入れるなどして複雑な構成にしてあまり学習コストを掛けずに開発に取り組めたことです。

GitHubのActionsはパブリックリポジトリでの使用は基本的に無料で使用することができます。

Actionsの使用制限等に関しての詳しい内容はこちらをご参照ください。

Actionsでワークフローの作成

ブラウザでGitHubを開いて、ワークフローを実行したいパブリックなリポジトリにアクセスします。

そして以下のようなページにアクセスしたら、「Actions」というタブをクリックします。

ワークフローがまだ作成されていない状態で「Actions」にアクセスすると、各自の開発環境に関連されたワークフローの候補が表示されます。

私の場合はPythonプロジェクトのバージョン3.10を使用しているので、そのプロジェクトにマッチしたワークフローが各種選択できるようになっています。

今回は「Python application」というワークフローを選択してみました。

クリックすると以下のようになっています。

ワークフローのファイルは「YAML」というルールで書かれており、書き方を理解している場合はブラウザからそのまま編集することができます。

以下は「Python application」のYAMLファイルの内容です。

# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python

name: Python application

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

permissions:
  contents: read

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python 3.10
      uses: actions/setup-python@v3
      with:
        python-version: "3.10"
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install flake8 pytest
        if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
    - name: Lint with flake8
      run: |
        # stop the build if there are Python syntax errors or undefined names
        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
        # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
    - name: Test with pytest
      run: |
        pytest

上記コードの処理内容については割愛しているので、詳しく知りたい方は、こちら「GitHub公式ドキュメント ワークフローについて」をご参照ください。

簡単に説明すると、リポジトリがコミットする際に、コードチェッカーの「flake8」とユニットテストの「pytest」が実行されるという処理内容です。

ワークフローの内容が良ければ画面右上の「Commit Changes」をクリックします。

コミットメッセージがあれば記入します。

コミットされると、ワークフローファイルの置かれたページにリダイレクトされます。

Actionsタブを開くと、先ほど作成したワークフローが実行されていることが分かります。

上記の緑マークはワークフローが成功したことを意味しています。

以下はワークフローが失敗した例です。

ワークフローファイルにも記述されている通り「main」ブランチによる「push」か「pull request」のイベントが発生されるとワークフローが実行されます。

上図のワークフローリストのコミットメッセージをクリックすると、ワークフローの処理内容を確認できます。

「build」と表示されているのは、以下のワークフローで実行された「jobs」節に設定された個々のジョブ名です。

name: Python application

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

permissions:
  contents: read

jobs:
  build: # ジョブ名

    runs-on: ubuntu-latest
    ...

「build」で実行された処理内容や結果を確認したい場合は、上図の赤線の入った「build」をクリックします。

するとPython3.10のセットアップからPytestまでの項目が表示されます。

それぞれの実行内容を確認するには「>」をクリックします。

ワークフローが失敗し、コードチェックやユニットテストのエラーが発生した場合は、上図の画面にて内容をチェックします。

実行済みのワークフローファイルに記述した設定内容を確認したい場合は、以下のページで確認できます。

Pythonプロジェクト用のワークフローのドキュメントもあるので、こちらも参考にしてみてください。

アクセストークンのワークフローを有効にする

ローカルリポジトリをリモートリポジトリへホスティング際に使用するアクセストークンのワークフローを有効にしていない場合、ワークフローを実行することができません。

以下のように「.github/workflows/python-app.yml」のワークフローが存在しているのにアクセストークンの「workflow」が無効になっていると、ローカルからリモートへ「push」した際にエラーが発生して送ることができません。

.
├── .git
├── .github
│   └── workflows # ワークフローファイル
│       └── python-app.yml
├── .gitignore
├── README.md
├── actions.py
├── requirements.txt
└── tests
    ├── __init__.py
    └── test_actions.py
$ git push
...
 ! [remote rejected] main -> main (refusing to allow a Personal Access Token to create or update workflow `.github/workflows/python-app.yml` without `workflow` scope)
error: failed to push some refs to 'https://github.com/user-name/test_actions.git'

アクセストークンのワークフローを有効にするは、アクセストークンのアップデートをします。

GitHubページの右上にあるアカウントのセレクトメニューから「settings」をクリックします。

自分のアカウントページに遷移されたら、左側のサイドバーの1番下にある「Developer settings」の項目をクリックします。

以下のような開発用のページに遷移されると、左側のサイドバーに「Personal access tokens」とあります。

「Personal access tokens」のメニューに「Tokens(classic)」という項目があるので、そこをクリックします。

以下は既存のアクセストークンです。

アクセストークンが存在している場合はトークン名をクリックし、存在しない場合は新しく作成します。

アクセストークンの取得については以下をご覧ください。

アクセストークンには様々な権限を定義することができ、その中にある「workflow」という項目にチェックを入れます。

チェックを入れたら、「Update token」をクリックしてアクセストークンの更新を完了します。

アクセストークンのワークフローを有効にして更新ができたら、もう一度ローカルリポジトリから「push」コマンドを実行してみます。

$ git push
...
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/user-name/test_actions.git
   10d7743..82f837a  main -> main

無事にリモートリポジトリへプッシュされワークフローが実行されました。

それでは以上となります。

最後までご覧いただきありがとうございました。