Draftプルリクエスト作成をターミナルだけで行う(GitHub CLI 1.0)

公開:2020/09/18
更新:2020/09/19
5 min読了の目安(約3500字TECH技術記事

はじめに

Zenn良さげなのでテンション上がって初投稿です。
内容について、間違いや、そもそもその開発手順おかしくね?など気付いたらどしどしコメントしていただければ幸いです

背景

普段の業務で、以下の手順に沿ってチケット駆動開発をしています。

  1. Jiraでタスクをアサインされる。
  2. タスクと連動したfeatureブランチを作成する。(Jira連動については参考リンク参照)
  3. featureブランチに--allow-emptyで空コミットする。(UIではコミットないとPR作れないため)
  4. featureブランチからdefaultブランチへドラフトPRを作成する
  5. 実際に作業、コミット
  6. レビュー可能になったら、ドラフトを外す(ready for review)。レビュアーをアサインする。
  7. レビューもらったら修正。修正したらレビューリクエスト。これをapproveされるまで繰り返す
  8. approveされたらマージ。featureブランチも消す。

この手順、ブラウザとターミナルを行き来きして大変です。
タスクの粒度が細かくなるほどこの作業の回数が増えるので、めんどくさいです。
特に手順2、3、4は虚無です。

GitHub CLIで置き換え

先日、GitHub CLI 1.0がリリースされました。

Goodbye, context switching. Hello, terminal. ということで

cliのマニュアルを見ながら、

上記の手順を、cliで一つずつ実現していきます。

準備

インストール

# homebrew
brew install github/gh/gh

# scoop
scoop bucket add github-gh https://github.com/cli/scoop-gh.git
scoop install gh

次に、アカウント認証して読み取りと書き込みの権限を付与

gh auth login

ブランチの作成。

まず作業用のブランチをローカルに作成します
Jiraなどと連動している場合は、タスク名を含めます

# ローカルブランチを作成
git branch feature/example

空コミット

GUIと同様に、コミットが1つもない状態では、PRは作れません。以下のようなエラーになります

pull request create failed: GraphQL error: No commits between master and feature/example

作業に着手した段階でドラフトPRが作成される というフローにしたいので、`--allow-empty'で親コミットと差分がないコミットを作成します。

git commit --allow-empty -m ":tada: first commit"

ドラフトPRの作成

gh pr createはリモートに対象のブランチがなくても、リモートに作成してからPRを作ってくれます。
--draft を指定することで、ドラフトPRの作成になります。
オプションは、-dのように短縮することもできます。

gh pr create --draftとすれば、対話的にPRを作成できます

今回は、オプションでPRのタイトルと本文を指定してみます。

gh pr create --draft --title "Pull request title" --body "Pull request body"

これで、ドラフトPRが作成されます。

便利〜〜〜〜

ドラフトPRをready for reviewにする

$ gh pr ready
✔ Pull request #1 is marked as "ready for review"

レビュアーを設定する。

レビュアーはgh pr create時に--reviewerオプションで設定できます。
しかし、PRを作った後にCLIから設定する方法はまだ無いようです。

「ready for reviewにする時にreviewer設定できたらよくね?」というissueが立っています。

Add PR reviewers when marking PR ready for review · Issue #971 · cli/cli

PRの状態を確認、マージ、ブランチの削除

# PRの状態確認
$ gh pr status

#CI を通過しているか確認
$ gh pr checks

approveされたPRのマージもgh pr mergeだけで対話的に行えます。
オプションを指定した際はデフォルトでブランチも削除されます。

$ gh pr merge -m
✔ Merged pull request #1 (feature/example)
✔ Deleted branch feature/example and switched to branch master

便利〜〜〜〜

エイリアスを設定する

これらのコマンド、毎回打つには長いので、.zshrcに以下の関数を追加します

# ブランチ作成->ドラフトPR作成
gwip () {
    git checkout -b $1 && \
    git commit --allow-empty -m ":tada: first commit" && \
    gh pr create --draft
}

これで、gwip ブランチ名でブランチの作成からドラフトPRの作成までできるようになりました。

$ gwip feature/task1
Switched to a new branch 'feature/task1'
[feature/task1 c1511df] :tada: first commit
? Where should we push the 'feature/task1' branch? uta-mori/example

Creating draft pull request for feature/task1 into master in uta-mori/example

? Title task1detail
? Body <Received>
? What's next? Submit

便利〜〜〜〜

気づいたこと

  • 「ready for reviewなPRをドラフトPRにする」機能はCLIでは提供されてない
  • PR作成後にreviwer設定できない
  • 修正後にレビュー再依頼もできない?

おわりに

今回は個人的に面倒に感じている作業をCLIに統一できました。
Issue作成 からリリースまで と公式にあるように、大抵のことはCLIでできそうです。

GitHub公式ツールということで、今後も機能追加やメンテナンスは行われていくので、安心して使えますね。

最後までお読みいただきありがとうございました。

参考リンク

JIRA CloudとGitHubを連携する - 839の日記
Manual | GitHub CLI