GitHub Actionsを使ってプルリクエストを自動でオープンする方法

<font color="Grey">*[How to automagically open pull requests with GitHub Actions](https://aiven.io/blog/how-to-automagically-open-pull-requests-with-github-actions)の翻訳です。*</font>

2022年9月27日

# GitHub Actionsで自動的にプルリクエストをオープンする方法

アクションタイム：GitHub Actions でプルリクエストを自動化する

繰り返し作業をしているときは、一歩下がって自動化する方法を考えてみましょう。CI/CD の人たちが好んで使う自動化ツールのひとつに、GitHub Actions があります。


GitHub Actions は、テストの実行やコードのチェックに広く使われています。しかし、自動化によってコードが変更され、その変更をコミットしたくなった場合はどうなるでしょうか。手動でスクリプトを実行し、プルリクエストを開こうと考えているなら、これは選択肢の一つだ。GitHub Actions を使ってプルリクエストを自動化すればいいのです。この記事では、その方法を順を追って説明します。


## シナリオ


Aivenでは、クラウド・プロバイダーのリストを拡大し続けているという興味深い問題を抱えている。クラウドプロバイダーのリストをどんどん増やしています。私たち開発ポータルのドキュメントを管理する者にとって、クラウドプロバイダーに関する最新情報を読者に確実に提供することは課題です。


Aivenのクラウドプロバイダーのリストは、[Docs.aiven.io](https://docs.aiven.io/)に掲載されています。このポータルは、開発者向けドキュメントをホストしているポータルでもあります。現在利用可能なクラウドプロバイダーのリストを素早く取得するために、私の同僚であるLorna Mitchellは、[Aiven API](https://api.aiven.io/doc/#operation/ListClouds)と[ドキュメントを生成](https://github.com/aiven/devportal/pull/675/files)から私たちのクラウドリストを引き出すPythonスクリプトを書きました！


スクリプトがあるのは素晴らしいことだ。スクリプトを実行することで、Aiven APIのデータから新しいドキュメントを素早く生成できるようになりました。しかし、これでプロセスが完全に自動化されたわけではありません。スクリプトの実行、コミットすべき新しい変更があるかどうかのチェック、プルリクエストの作成などなど。


これは、GitHub Actions ワークフローを設定して定期的にスクリプトを実行し、変更が検出されたらプルリクエストをオープンすることができる良い例です。同じような課題がある場合は、以下に自動化フローの追加方法を順を追って説明します。


## GitHub Actions ワークフローの設定


さあ、GitHub Actions の出番です！以下の手順で GitHub Actions ワークフローを設定しましょう：


### 1) スクリプトをチェックする


自動化に使用する前に、スクリプトが正しく動作することを確認しよう。ここで、スクリプトを2、3回実行し、想定通りに動作していることを確認してください。


このプロセスを簡単にするために、スクリプトを実行するコマンドをMakefileに追加することができる。Makefileはコードのコンパイルを整理するのに便利な方法で、`make`コマンドを使って長いコマンドを短いバージョンで実行するのに役立ちます。この例に従って、[Makefile](https://github.com/aiven/devportal/blob/main/Makefile#L96-L97) に追加する内容を示します：



```
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`](https://github.com/aiven/devportal/blob/main/.github/workflows/cloud-list.yaml) とする。このファイルでワークフローの名前を定義する。この例では、まずワークフローに名前を付ける：



```
name: Cloud - Create PR to update available list
```

ファイル名とワークフロー名は、コードに加える変更に関連するものを選んでください。これは、コードやワークフローの識別に役立ちます。GitHubの[how to create your first workflow](https://docs.github.com/en/actions/quickstart)にあるクイックガイドをチェックしましょう。


### 3) トリガーを選択する


GitHub Actions を使うと、特定のイベントをトリガーにしてワークフローを実行させることができます。この例では、定期的にジョブを実行する必要があります。そのためには、[cron job](https://ostechnix.com/a-beginners-guide-to-cron-jobs/)に従って`on schedule`実行するように設定します。


cronの構文は時々混乱することがあります。cronの構文をダブルチェックするには、[crontab guru](https://crontab.guru/)というオンラインの無料ツールを使うことができます。これに加えて、このページには構文をより理解するのに役立つ多くの[例](https://crontab.guru/examples.html)があります。


例えば、このワークフローは毎週火曜日のUTC午前6時（CEST午前8時）に実行するように設定されている：



```
on:
schedule:
    - cron: "0 6 * * 2"
```

GitHub Actions では、時刻は UTC を基準にします。



> ![](/build/_assets/shape-quote-WGSAHX4E.svg)
> 注意:** GitHub Actions では、スケジュールされたワークフローを実行できる最短の間隔は 5 分に一度です。  
>
> プルリクエストごとにジョブを実行したい場合や別のユースケースがある場合は、[GitHub documentation](https://docs.github.com/en/actions/using-workflows/triggering-a-workflow) でワークフローを実行するための利用可能なトリガーをすべてチェックできます。
>
>
>


### 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](https://github.com/peter-evans/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
```

アクションがマージされなくても、ワークフローはスケジュールされた時間に従って指定されたジョブを実行します。


![workflow-running screencap](https://cdn.sanity.io/images/sczeoy4w/production/d247849642fa9a6e246d4733aa3b9f5c6f9bedd4-2942x1626.png?q=80&fit=min&auto=format&dpr=1.5)


定期的にワークフローを実行するだけでなく、手動でワークフローを起動するオプションと組み合わせることもできます。[GitHub Actionsマニュアル](https://github.blog/changelog/2020-07-06-github-actions-manual-triggers-with-workflow_dispatch/)を参照してください。


アクションが実行されると、新しいプルリクエストはこのようになります✨：


![pull-request-open screencap](https://cdn.sanity.io/images/sczeoy4w/production/ae3158d89c3454eee1cbb57210afe527b7199714-3688x1784.png?q=80&fit=min&auto=format&dpr=1.5)


こうして毎週、ワークフローが実行され、私たちの愛すべきユーザーのためにAiven [クラウドリスト](https://docs.aiven.io/docs/platform/reference/list_of_clouds.html) が常に更新されるのです。🧡


## 結論


devportalのメンテナとして、私たちはCI/CDプロセスでGitHub Actionを使うことで、Aiven [クラウドリスト](https://docs.aiven.io/docs/platform/reference/list_of_clouds.html)を常に最新の状態に保つことができます。


この記事では、ワークフローのコードを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](https://github.blog/changelog/2020-07-06-github-actions-manual-triggers-with-workflow_dispatch/)をご覧ください。


もしあなたの考えているプルリクエストの内容が違うようなら、`create-pull-request` アクションをあなたのユースケースに合わせてカスタマイズする方法について、より多くの [examples](https://github.com/peter-evans/create-pull-request/blob/main/docs/examples.md) をチェックすることができます。


GitHub Actions を使ってプルリクエストをオープンする方法は、こちらの [examples](https://github.com/aiven/devportal/pull/945/files) を参照ください。プルリクエストの自動化 ⚙️ を楽しんでください！


--


ご意見やご質問は、[Twitter](https://twitter.com/aiven_io) または [LinkedIn](https://www.linkedin.com/company/aiven/) までお寄せください。[変更履歴](https://aiven.io/changelog)と[ブログ](https://aiven.io/blog)のRSSフィードをフォローしてください。また、Aivenと私たちのサービスに関する最新ニュース、さらにオープンソース全般に関する情報をご希望の方は、[月刊ニュースレターの購読](https://aiven.io/newsletter)をご利用ください！