GitHub Actionsでfast forward(--ff)なプルリクエストマージをする
GitHubのプルリクエストのマージボタンでは、いわゆるfast forward(–ff)でマージすることはできません。このエントリではそれをGitHub Actionsで実現する方法を考察します。
💭 GitHubのプルリクエストのマージボタンについて
プルリクエストのマージボタンは、おもに一番上の Create a merge commit
を使うことが多いと思いますが、以下のように3種類あります。
- Create a merge commit
- マージコミットを作ります
- Squash and merge
- プルリクエストのブランチを1つのコミットにまとめ(squash)します
- 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
なマージをすることができました🎉
実践投入してないので、何か見落としがある可能性はあります。
もっといい方法があれば教えて下さい!