はじめに
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ファイルを作成します。
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: 実行する手順を順番に記述
-
-
各ステップの内容:
-
Checkout code: リポジトリのコードをチェックアウト -
Set up Python: Python 3.10をセットアップ -
Install dependencies: 依存パッケージのインストール -
Run tests: テストの実行
テスト用Pythonファイル
ビジネスロジック (test_script.py)
# このファイルは 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)
# このファイルは 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の動作確認方法
- 上記のファイルをGitHubリポジトリにプッシュします
- リポジトリのActionsタブを開きます
- ワークフローの実行状況が表示されます
- 各ジョブやステップの詳細を確認できます
応用例
マトリックステスト(複数のPythonバージョンでテスト)
複数のPythonバージョンでテストを実行したい場合は、以下のようにstrategyを使用します:
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 }}
# 以下略
自動デプロイの追加
テストが成功した後に自動デプロイするジョブを追加することもできます:
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プロジェクトのテスト自動化を例に解説しましたが、
実際のプロジェクトに合わせてカスタマイズすることで、
より効率的な開発フローを実現できるでしょう。
- メリット:
- コードの品質保持
- 手動テストの負担軽減
- デプロイミスの防止
- 開発フローの効率化
ぜひ、あなたのプロジェクトにも取り入れてみてください!