How to automagically open pull requests with GitHub Actionsの翻訳です。
2022年9月27日
GitHub Actionsで自動的にプルリクエストをオープンする方法
アクションタイム:GitHub Actions でプルリクエストを自動化する
繰り返し作業をしているときは、一歩下がって自動化する方法を考えてみましょう。CI/CD の人たちが好んで使う自動化ツールのひとつに、GitHub Actions があります。
GitHub Actions は、テストの実行やコードのチェックに広く使われています。しかし、自動化によってコードが変更され、その変更をコミットしたくなった場合はどうなるでしょうか。手動でスクリプトを実行し、プルリクエストを開こうと考えているなら、これは選択肢の一つだ。GitHub Actions を使ってプルリクエストを自動化すればいいのです。この記事では、その方法を順を追って説明します。
シナリオ
Aivenでは、クラウド・プロバイダーのリストを拡大し続けているという興味深い問題を抱えている。クラウドプロバイダーのリストをどんどん増やしています。私たち開発ポータルのドキュメントを管理する者にとって、クラウドプロバイダーに関する最新情報を読者に確実に提供することは課題です。
Aivenのクラウドプロバイダーのリストは、Docs.aiven.ioに掲載されています。このポータルは、開発者向けドキュメントをホストしているポータルでもあります。現在利用可能なクラウドプロバイダーのリストを素早く取得するために、私の同僚であるLorna Mitchellは、Aiven APIとドキュメントを生成から私たちのクラウドリストを引き出すPythonスクリプトを書きました!
スクリプトがあるのは素晴らしいことだ。スクリプトを実行することで、Aiven APIのデータから新しいドキュメントを素早く生成できるようになりました。しかし、これでプロセスが完全に自動化されたわけではありません。スクリプトの実行、コミットすべき新しい変更があるかどうかのチェック、プルリクエストの作成などなど。
これは、GitHub Actions ワークフローを設定して定期的にスクリプトを実行し、変更が検出されたらプルリクエストをオープンすることができる良い例です。同じような課題がある場合は、以下に自動化フローの追加方法を順を追って説明します。
GitHub Actions ワークフローの設定
さあ、GitHub Actions の出番です!以下の手順で GitHub Actions ワークフローを設定しましょう:
1) スクリプトをチェックする
自動化に使用する前に、スクリプトが正しく動作することを確認しよう。ここで、スクリプトを2、3回実行し、想定通りに動作していることを確認してください。
このプロセスを簡単にするために、スクリプトを実行するコマンドをMakefileに追加することができる。Makefileはコードのコンパイルを整理するのに便利な方法で、make
コマンドを使って長いコマンドを短いバージョンで実行するのに役立ちます。この例に従って、Makefile に追加する内容を示します:
SOURCEDIR = .
# (Re)Generate cloud listing
cloud-list:
python "$(SOURCEDIR)/scripts/aiven/clouds.py" "includes/clouds-list.rst"
あとはスクリプトを実行するだけだ:
make cloud-list
このステップでは、コードを変更するために使用するスクリプトが、プルリクエストでコミットしたい変更を生成することを確認します。間違いは起こるものです。スクリプトが期待通りに動かない場合は、先に進む前にコードをデバッグする必要があるかもしれません。スクリプトがうまく動作していれば、そのまま GitHub ワークフローを作成することができます。
2)GitHub ワークフローの作成
このステップでは、ワークフローの設定を定義する YAML ファイルを追加します。まず、.github/workflows/
フォルダが作成されていることを確認します。次に、ワークフロー設定を定義する YAML ファイルを作成する。例えば、.github/workflows/cloud-list.yaml
とする。このファイルでワークフローの名前を定義する。この例では、まずワークフローに名前を付ける:
name: Cloud - Create PR to update available list
ファイル名とワークフロー名は、コードに加える変更に関連するものを選んでください。これは、コードやワークフローの識別に役立ちます。GitHubのhow to create your first workflowにあるクイックガイドをチェックしましょう。
3) トリガーを選択する
GitHub Actions を使うと、特定のイベントをトリガーにしてワークフローを実行させることができます。この例では、定期的にジョブを実行する必要があります。そのためには、cron jobに従ってon schedule
実行するように設定します。
cronの構文は時々混乱することがあります。cronの構文をダブルチェックするには、crontab guruというオンラインの無料ツールを使うことができます。これに加えて、このページには構文をより理解するのに役立つ多くの例があります。
例えば、このワークフローは毎週火曜日のUTC午前6時(CEST午前8時)に実行するように設定されている:
on:
schedule:
- cron: "0 6 * * 2"
GitHub Actions では、時刻は UTC を基準にします。
注意:** GitHub Actions では、スケジュールされたワークフローを実行できる最短の間隔は 5 分に一度です。プルリクエストごとにジョブを実行したい場合や別のユースケースがある場合は、GitHub documentation でワークフローを実行するための利用可能なトリガーをすべてチェックできます。
4) 依存関係のインストールとスクリプトの実行
GitHub のワークフローは一つ以上のジョブで構成されます。ジョブは runs-on
で定義された特定の環境で実行される一連のステップです。以下の例では、CloudList
ジョブは最新の ubuntu イメージ上で実行される。環境を定義したら、ブランチから checkout
して、Python のバージョンを決める必要がある。最後に、依存関係をインストールしてスクリプトを実行するステップを追加する必要がある。
jobs:
CloudList:
runs-on: ubuntu-latest
steps:
- name: Checkout the repo
uses: actions/checkout@v2
- name: Set up Python 3.8
uses: actions/setup-python@v2
with:
python-version: "3.8"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Update available cloud list
run: make cloud-list
これで、ジョブはすでに定期的に実行され、ファイルが生成されます。しかし、最終的なゴールはプルリクエストを開き、メンテナが変更点をチェックしてコードをマージできるようにすることです。それでは、プルリクエストのステップをワークフローに追加する方法を見てみましょう。
5) プルリクエストの作成
プルリクエストを作成するには、ワークフローの Create Pull Request アクションを使います。このアクションでは、プルリクエストに関連するカスタマイズを追加することができます。例えば、ラベルやブランチ名を定義することができます:
- name: Create Pull Request
uses: peter-evans/create-pull-request@v4
with:
commit-message: Cloud - Update available list
title: Cloud - Update available list
body: Cloud - Update available list
base: main
labels: automated-pr, Clouds & Regions
branch: cloud-update-advanced-params
delete-branch: true
アクションがマージされなくても、ワークフローはスケジュールされた時間に従って指定されたジョブを実行します。
定期的にワークフローを実行するだけでなく、手動でワークフローを起動するオプションと組み合わせることもできます。GitHub Actionsマニュアルを参照してください。
アクションが実行されると、新しいプルリクエストはこのようになります✨:
こうして毎週、ワークフローが実行され、私たちの愛すべきユーザーのためにAiven クラウドリスト が常に更新されるのです。🧡
結論
devportalのメンテナとして、私たちはCI/CDプロセスでGitHub Actionを使うことで、Aiven クラウドリストを常に最新の状態に保つことができます。
この記事では、ワークフローのコードを1セグメントずつレビューした。完全なスクリプトは次のようになります:
ファイル: .github/workflows/cloud-list.yaml
name: Cloud - Create PR to update available list
on:
schedule:
- cron: "0 6 * * 2"
jobs:
CloudList:
runs-on: ubuntu-latest
steps:
- name: Checkout the repo
uses: actions/checkout@v2
- name: Set up Python 3.8
uses: actions/setup-python@v2
with:
python-version: "3.8"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Update available cloud list
run: make cloud-list
- name: Create Pull Request
uses: peter-evans/create-pull-request@v4
with:
commit-message: Cloud - Update available list
title: Cloud - Update available list
body: Cloud - Update available list
base: main
labels: automated-pr, Clouds & Regions
branch: cloud-update-advanced-params
delete-branch: true
続きを読む
定期的にワークフローを実行するだけでなく、手動でワークフローを起動するオプションを追加することもできます。詳しくはGitHub Actions manualをご覧ください。
もしあなたの考えているプルリクエストの内容が違うようなら、create-pull-request
アクションをあなたのユースケースに合わせてカスタマイズする方法について、より多くの examples をチェックすることができます。
GitHub Actions を使ってプルリクエストをオープンする方法は、こちらの examples を参照ください。プルリクエストの自動化 ⚙️ を楽しんでください!
--
ご意見やご質問は、Twitter または LinkedIn までお寄せください。変更履歴とブログのRSSフィードをフォローしてください。また、Aivenと私たちのサービスに関する最新ニュース、さらにオープンソース全般に関する情報をご希望の方は、月刊ニュースレターの購読をご利用ください!