中級者向け：ハッカソンの開発効率UP！GitHub Actionsで自動テストを導入する方法

## はじめに
GitHub Actionsは、ソフトウェアの自動化を支援する強力なCI/CDツールです。

これにより、リポジトリ内でコードが更新されるたびにビルドやテストが自動的に行われ、開発の効率が向上します。

本記事では、Pythonを用いたGitHub Actionsのワークフローを構成し、テストが自動で実行されるプロセスを備忘録としてまとめます。

## 知識整理
### GitHub Actionsとは？
GitHub Actionsは、GitHub上でコードのビルドやテスト、デプロイなどのタスクを自動化するためのCI/CDプラットフォームです。

![スクリーンショット 2024-10-25 12.44.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f48e04c0-122d-684d-3717-671fcf4e3bdd.png)
引用画像：https://blog.studysapuri.jp/entry/2024/07/09/101443

GitHubリポジトリにワークフローファイルを設定するだけで、プルリクエストやプッシュ時に指定されたアクションがトリガーされ、ワークフローが実行されます。

これにより、手作業で行っていた一連の作業を自動化し、開発スピードと効率を向上させることができます。

### CI/CDとは？
CI（Continuous Integration）は、コードの変更をリポジトリに継続的に統合し、バグやエラーの早期発見を目指すプロセスです。

![スクリーンショット 2024-10-25 12.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/84e67eb8-2c5b-dbd7-f3f9-5d505da89457.png)
引用画像：https://codezine.jp/article/detail/11083

CD（Continuous DeploymentまたはContinuous Delivery）は、CIでテストされたコードを自動的にデプロイするプロセスを指し、迅速なリリースを実現します。

## ディレクトリ構成
Pythonを使ったGitHub Actionsワークフローのディレクトリ構成は、以下の通りです。

```bash
/<プロジェクトルートディレクトリ>
├── .github
│   └── workflows
│       └── python-app.yml   # GitHub Actionsのワークフローファイル
├── main.py                  # Pythonスクリプト
├── test_main.py              # テストコード
├── requirements.txt          # 依存ライブラリ
└── README.md                 # プロジェクトの概要（任意）
```

:::note warn
今回は、``README.md``は任意のため、作成していません。必要に応じて作成してください。
:::


## ハンズオン: PythonでGitHub Actionsを構成する
以下の手順で、GitHub Actionsを用いたPythonの自動テストワークフローを作成します。

### Step 1: GitHubリポジトリを作成する
GitHubにログインし、新しいリポジトリを作成します。

![スクリーンショット 2024-10-25 12.52.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/42b1fb42-e6ea-1e78-7c84-d7249104ad90.png)


リポジトリ名と説明を入力し、「Create repository」をクリックします。

### Step 2: GitHub Actions ワークフローファイルを作成する
作成したリポジトリのトップページで、「Actions」タブに移動します。

![スクリーンショット 2024-10-25 12.53.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c4e9e556-88b4-6be2-c497-09fadfe70034.png)

「**Set up a workflow yourself**」をクリックし、新しいYAMLファイルの編集画面を開きます。

![スクリーンショット 2024-10-25 13.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/510a24d3-1e32-d8fd-97e5-a52ba25059c0.png)


``python-app.yml`` という名前で、以下の内容を入力します

```yaml
name: Python Application CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Check out the code
        uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.x'

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Run Tests
        run: |
          pytest
```

このワークフローファイルは、リポジトリにプッシュやプルリクエストがあるたびにPython環境をセットアップし、テストを実行します。

## Step 3: Pythonコードとテストファイルを作成する
ここでは、main.py ファイルを作成し、シンプルな関数を追加します。

```mai.py
def add(x, y):
    return x + y

if __name__ == "__main__":
    print(add(3, 5))
```

次に、作成した関数のテストを記述します。

```test_main.py
from main import add

def test_add():
    assert add(3, 5) == 8
    assert add(-1, 1) == 0
```

最後に、依存関係を記述した requirements.txt ファイルを作成します。

```requirements.txt
pytest
```

## Step 4: 変更をコミットし、GitHubにプッシュする
ターミナルを開き、以下のコマンドを実行して変更をコミットし、リポジトリにプッシュします。

```bash
git add .
git commit -m "Add Python script and test"
git push origin main
```

これにより、リポジトリが更新され、GitHub Actionsがトリガーされます。

## GitHub Actionsの実行を確認する

GitHubのリポジトリに戻り、「Actions」タブをクリックします。更新が反映されている場合、以下のような画面が表示されます。

![スクリーンショット 2024-10-25 13.26.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2b05055d-39c7-46c5-334f-47b148079641.png)

ワークフローが成功すると、ステータスとして緑色のチェックマークが表示されます。

![スクリーンショット 2024-10-25 13.27.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/894762fc-a2f0-c456-fd5c-d911c8792123.png)

「Run Tests」ステップでテストが実行され、すべてのテストがパスしていることを確認してください。

![スクリーンショット 2024-10-25 13.35.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9a2b1417-72dd-46ba-f9b3-820f74dc9bd9.png)

ワークフローが問題なく完了していれば、GitHub ActionsによるPythonテストの自動化が成功です。

```bash
============================= test session starts ==============================
platform linux -- Python 3.12.7, pytest-8.3.3, pluggy-1.5.0
rootdir: /home/runner/work/GitHub-Actions/GitHub-Actions
collected 1 item

test_main.py .                                                           [100%]

============================== 1 passed in 0.01s ==============================
```

1件のテストが実行され、すべて成功 (1 passed) していることが示されています。

## まとめ

初めてGitHub Actionsを触った時はどれが何をしているかさっぱりわからなかったのですが、**記事としてアウトプットすることで仕組みが理解できました。**

次回のITスクールのハッカソンで、GitHub Actionsを活用し、リポジトリへのコード更新時に自動でビルドやテストが行われるようにしたいと考えています。

Pythonのテスト自動化ワークフローを設定し、開発効率向上を目指します。

## 参考文献

https://dev.networld.co.jp/1354/

https://qiita.com/shun198/items/14cdba2d8e58ab96cf95