1コマンドでターミナルからプルリクエストを作り、作業開始を報せる【GitHub CLI】

業務において「報連相」は欠かせません。開発業務においては「今、どんな作業をしているところです」ということが関係者にわかるだけでも「報 – 報せる」としては十分価値のあるものだと考えています。

ことGitHubを用いた開発では、リモートリポジトリへのpushなどが検出された際にSlackで通知を行うように設定しているチームが多く存在しています。

私はこの通知を「報」の一つであると捉えており、この通知がなるべくリアルタイムにSlackに通知されるよう、細かい粒度でのpushを心がけています。

Draft Pull RequestまたはWIPを利用し、いち早く作業開始を報せる

作業開始してから最初のコミットが発生するまでに、それなりの時間がかかるパターンがあります。例えば13時に作業開始し、15時に最初のコミットが発生した場合、間の2時間の間何をしているのかわかりません。

それが特に問題になったことはないものの、できれば最新の状況がわかる業務フローを整えておきたいと考えました。そこで「Draft Pull Request」または「WIP」を利用することにしています。

これは「差分がなくても、とりあえずプルリクエストを作ることで、作業に入ったことがわかるようにする」というものです。これで、リアルタイムな作業状況を他者が理解できます。

抱えていたちょっとしたストレス。ターミナルとブラウザを移動するのが面倒。

この「差分がない状態でも、とりあえずプルリクエストを作る」という行為は、実は少し手間がかかります。

実際に行なっている作業を書き出すと以下のようになります。

  • ターミナルから差分のないコミットを作成する
  • ターミナルからpushする
  • ブラウザに移動し、ブックマークからGitHubを開く
  • なんやかんや該当するリポジトリにたどり着く
  • プルリクエスト作成画面に移動する
  • 本文にIssue番号を記入する
  • タイトルを「WIP」にする
  • プルリクエストを「draft」で作成する

このように、ただプルリクエストを作りたいだけにも関わらず、ターミナルにコマンドを打ち込んだり、ブラウザを移動してGitHubの中をちまちまと移動したり入力したりと地味な作業が続いていることがわかります。

作業を開始するたびにこれらのルーティン作業を行うことは、多少なりともストレスを感じざるを得ません。

GitHub CLIを用いて、ルーティン作業を1コマンドで

これらの作業は、ただのルーティン作業にすぎません。そこで、全てをターミナルからコマンド1つで実行するようにします。(zshを利用していることを前提にします)

今回作るコマンドでは、GitHub CLIを活用し、以下の4つを順番に行わせます。

  • 差分のないコミットを作成する
  • リモートリポジトリへpushする
  • タイトルを「WIP」、本文にイシュー番号、ステータスをdraftにし、GitHubのリポジトリ上にプルリクエストを作成する
  • 作成したリポジトリのURLをブラウザで開く

完成したコード

以下のようなシェルスクリプトが完成しました。これを .zshrc に記述すればOKです。

コマンド名は、初期プルリクエストを出すという意味でprinitとしました。

prinit() {
    # 空のコミットを作成
    git commit --allow-empty -m "empty commit" 

    # 現在のブランチをリモートリポジトリへpush
    git push -u origin HEAD

    # 引数としてイシュー番号を受け取り、本文に記載
    # タイトルは「WIP」とする
    gh pr create --body "$1" --draft --title "[WIP]"

    # ブラウザでプルリクエストのURLを開く
    gh pr view -w
}

注:GitHub Teamを採用していないプロジェクトでは、ステータスが「draft」のプルリクエストを作成できません。その場合、gh pr create --body "$1" --draft --title "[WIP]" ではなく、gh pr create --body "$1" --title "[WIP]" のように記述してください。

.zshrcにこのコードを記載したら、ターミナルを再起動し、該当ブランチにいる状態で以下のコマンドで実行します。

prinit #5

#5 の部分は、これから作業するプルリクエストで扱うイシュー番号を記述します。

実行すると、以下のようなメッセージが表示とともにプルリクエストが作成され、ブラウザで開かれます。

$ prinit #5
[sample 9dad524] empty commit
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 645 bytes | 645.00 KiB/s, done.
Total 6 (delta 5), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (5/5), done.
remote: 
remote: Create a pull request for 'sample' on GitHub by visiting:
remote:      https://github.com/nayucolony-team/test/pull/new/sample
remote: 
To github.com:example-team/example.git
 * [new branch]      HEAD -> sample
Branch 'example' set up to track remote branch 'example' from 'origin'.

Creating draft pull request for sample into main in example-team/example

https://github.com/example-team/test/pull/6
Opening github.com/example-team/test/pull/6 in your browser.

タイトル、本文、ステータス共に期待通りになりました。

これで、作業開始時に細かい作業のストレスを感じることなくプルリクエストを作れるようになりました。

もっとやりたいこと

以下、利便性を高めるアイデアのメモです。

  • empty commitはgit logに残す必要がないため、どうにかして2つ目のコミットのタイミングで消し去りたい
    • squashをワンライナーでなんとかならないだろうか、と考えている
    • 今回の目的は「スピーディにWIPのプルリクエストを作成し、作業開始を知らせたい」であるため、別の検討事項
    • rebaseは予期せぬ動きをさせないよう、しっかり検討して実装する必要がある
  • タイトルはできれば該当するイシューから引き継ぎたい
    • 何の作業を開始したのかわかりやすくするため
  • オプションや例外処理を加え、より使いやすくしたい

Gaji-Laboでは、HTML/CSSコンポーネント設計経験が豊富なパートナーさんを募集しています

現在、Gaji-Laboの開発チームの一員としてプロジェクトに一緒に取り組んでくれる業務委託のパートナーさんを募集しています。現在は特に正しいHTMLマークアップやCSS設計の業務経験が豊富なWebフロントエンドエンジニアを必要としています。

パートナー契約へのお問い合わせもお仕事へのお問い合わせも、どちらもいつでも大歓迎です。まずはオンラインでのリモート面談からはじめましょう。ぜひお気軽にお問い合わせください!

お問い合わせしてみる!

投稿者 yuki nakamura

フロントエンドエンジニア。
受託制作会社を経てスタートアップへ参画、経営・組織づくり・事業開発・プロダクト実装と幅広く経験。のち、Gaji-Labo入社。
得意なことは何かといい具合にすることで、よしなにお願いされることが多く、度々よしなにしている。
元編集者でもあり、ドキュメントを書くことが好き。ダーツも好き。