GitHub Actionsで始める簡単CI/CD入門 - Pythonプロジェクト編

# はじめに

GitHub Actionsを使うと、リポジトリ内でのイベント（プッシュやプルリクエストなど）をトリガーにして自動的にワークフローを実行できます。
本記事では、Pythonプロジェクトを例にして、簡単なCI/CD（継続的インテグレーション/継続的デリバリー）パイプラインの構築方法を解説します。

## GitHub Actionsとは

GitHub Actionsは、GitHubが提供するCI/CDツールです。
リポジトリ内で発生するイベント（コミット、プルリクエスト、リリースなど）をトリガーとして、自動的にビルド、テスト、デプロイなどの処理を実行できます。

特徴:

- GitHubに統合されており、追加のサービスが不要
- YAMLファイルで設定可能
- 豊富なアクションが用意されている
- 独自のアクションも作成可能

## ファイル構成

今回は以下のようなファイル構成で作業します:

```
プロジェクトルート/
├── .github/
│   └── workflows/
│       └── ci-cd.yml  # GitHub Actionsの設定ファイル
├── githubaction/      # テスト用のPythonスクリプトディレクトリ
│   ├── test_script.py     # 実際のビジネスロジック
│   └── test_functions.py  # pytestによるテストファイル
└── requirements.txt   # 依存パッケージリスト

```

## ワークフロー設定ファイル (.github/workflows/ci-cd.yml)

まず、GitHub Actionsのワークフローを定義するYAMLファイルを作成します。

```yaml
name: CI/CD Pipeline

on:
  push:
    branches: [ main, master ]
  pull_request:
    branches: [ main, master ]
  workflow_dispatch:  # 手動でワークフローを実行するためのトリガー

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.10'

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install pytest
        if [ -f requirements.txt ]; then pip install -r requirements.txt; fi

    - name: Run tests
      run: |
        cd githubaction
        pytest -v  # もしくは特定のPythonスクリプトを実行する場合: python test_script.py

```

### 設定ファイルの解説

- `name`: ワークフロー名を定義します。GitHubのActionsタブに表示されます。
- `on`: ワークフローのトリガーとなるイベントを指定します。今回は:
    - `push`: main/masterブランチへのプッシュ時
    - `pull_request`: main/masterブランチへのプルリクエスト時
    - `workflow_dispatch`: 手動実行時
- `jobs`: 実行するジョブを定義します。
    - `test`: テストを実行するジョブ
        - `runs-on`: ジョブを実行する環境（Ubuntu最新版）
        - `steps`: 実行する手順を順番に記述

各ステップの内容:

1. `Checkout code`: リポジトリのコードをチェックアウト
2. `Set up Python`: Python 3.10をセットアップ
3. `Install dependencies`: 依存パッケージのインストール
4. `Run tests`: テストの実行

## テスト用Pythonファイル

### ビジネスロジック (test_script.py)

```python
# このファイルは test_script.py として保存します
# 簡単なテスト関数を含むPythonファイル

def add(a, b):
    """2つの数値を加算する関数"""
    return a + b

def multiply(a, b):
    """2つの数値を掛け算する関数"""
    return a * b

if __name__ == "__main__":
    # 基本的な関数テスト
    print("テストを実行中...")
    assert add(2, 3) == 5, "加算テスト失敗"
    assert multiply(2, 3) == 6, "掛け算テスト失敗"
    print("すべてのテストが成功しました！")

```

### テストコード (test_functions.py)

```python
# このファイルは test_functions.py として保存します
# pytestを使用したテストファイル

from test_script import add, multiply

def test_add():
    """加算関数のテスト"""
    assert add(1, 2) == 3
    assert add(-1, 1) == 0
    assert add(-1, -1) == -2

def test_multiply():
    """掛け算関数のテスト"""
    assert multiply(1, 2) == 2
    assert multiply(-1, 1) == -1
    assert multiply(-1, -1) == 1

```

### 依存パッケージ (requirements.txt)

```
pytest==7.4.0
# 他に必要なパッケージがあれば、ここに追加してください

```

## GitHub Actionsの動作確認方法

1. 上記のファイルをGitHubリポジトリにプッシュします
2. リポジトリのActionsタブを開きます
3. ワークフローの実行状況が表示されます
4. 各ジョブやステップの詳細を確認できます

## 応用例

### マトリックステスト（複数のPythonバージョンでテスト）

複数のPythonバージョンでテストを実行したい場合は、以下のように`strategy`を使用します：

```yaml
jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ['3.8', '3.9', '3.10', '3.11']

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v4
      with:
        python-version: ${{ matrix.python-version }}
    # 以下略

```

### 自動デプロイの追加

テストが成功した後に自動デプロイするジョブを追加することもできます：

```yaml
jobs:
  test:
    # テストジョブの内容（省略）

  deploy:
    needs: test  # testジョブが成功した場合のみ実行
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'  # mainブランチの場合のみデプロイ

    steps:
    - uses: actions/checkout@v3
    - name: Deploy to server
      # デプロイ用のアクションや独自のスクリプトを実行

```

## まとめ

GitHub Actionsを使うことで、簡単にCI/CDパイプラインを構築できます。
今回は基本的なPythonプロジェクトのテスト自動化を例に解説しましたが、
実際のプロジェクトに合わせてカスタマイズすることで、
より効率的な開発フローを実現できるでしょう。

- メリット:
    - コードの品質保持
    - 手動テストの負担軽減
    - デプロイミスの防止
    - 開発フローの効率化

ぜひ、あなたのプロジェクトにも取り入れてみてください！

## 参考リンク

- [GitHub Actions公式ドキュメント](https://docs.github.com/ja/actions)
- [Pythonアプリケーション用のワークフロー例](https://docs.github.com/ja/actions/automating-builds-and-tests/building-and-testing-python)