/ #github 

GitHub Actionsでfast forward(--ff)なプルリクエストマージをする

GitHubのプルリクエストのマージボタンでは、いわゆるfast forward(–ff)でマージすることはできません。このエントリではそれをGitHub Actionsで実現する方法を考察します。

💭 GitHubのプルリクエストのマージボタンについて

プルリクエストのマージボタンは、おもに一番上の Create a merge commit を使うことが多いと思いますが、以下のように3種類あります。

  1. Create a merge commit
    • マージコミットを作ります
  2. Squash and merge
    • プルリクエストのブランチを1つのコミットにまとめ(squash)します
  3. Rebase and merge
    • プルリクエストのブランチをrebaseします

💭 どのマージボタンでも、 --ff なマージはできない

では、上記の 3. で、 --ff なマージができる状況で、Rebase and mergeを押すと、 どうなるでしょうか。

この場合、手元でgit rebase する場合と別で(手元でrebaseした場合は Current branch xxx is up to date.となり、コミットハッシュは変わらない)、 rebaseは実行されてしまい、最後のコミットハッシュはGitHub側が生成したものになります。

--ff なマージをしたい場合は、以下のように、手元のコンソールで手動でmerge/pushすることが必要です。

# mainがbaseブランチ, プルリクエストのブランチがfeatureブランチだとして
$ git checkout main
$ git merge feature --ff

# pushすればプルリクエストがmerged状態になる
$ git push

❗ 本論: コンソールを使わずに--ff なマージをしたい

そこで今回はGitHub Actionsを使ってコンソールを使わずに–ffなマージをすることを考えます。

今回は https://github.com/robotology/gh-action-nightly-merge を利用します。

⚙️ 設定例

yaml設定例とポイントを述べます。

# .github/workflows/pull_request_merge.yml

name: 'pull request merge'

on:
  pull_request:
    types: [labeled]

jobs:
  pull_request_merge:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    if: ${{ startsWith(github.event.label.name, 'merge-ff') }}

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Fast Forword Merge
      uses: robotology/gh-action-nightly-merge@v1.3.2
      with:
        stable_branch: ${{ github.event.pull_request.head.ref }}
        development_branch: ${{ github.event.pull_request.base.ref }}

        # NOTE: fast forwardでマージするにはこの2つが必要
        allow_ff: true
        ff_only: true

        # NOTE: robotology/gh-action-nightly-mergeの実装の都合上、
        # プライベートリポジトリの場合はallow_forks: trueでないと動かないかもしれません
        allow_forks: false

      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

この例では、

  • プルリクエストに「merge-ff」という名前のラベルがついたら
  • そのプルリクエストをfast forwardでマージできる場合はマージする

というアクションを定義しています。

🎉 動いた場合のイメージ:

動いている様子を、以下のプルリクエストに示します。

✎まとめ

GitHubActionを使うことにより、コンソールを使わずに--ff なマージをすることができました🎉

実践投入してないので、何か見落としがある可能性はあります。

もっといい方法があれば教えて下さい!

Author

hoshinotsuyoshi

星野剛志(ほしのつよし) web application engineer. ruby/rails/docker