単にブランチを作るだけのGitHub Actionを作った
READMEにも書いてあるが以下のように使う。これは、指定ブランチがあれば作るし、無かったら何もしない簡単なGitHub Actionだ。分岐元指定のrefにはブランチ名、タグ、コミットハッシュを指定できる。refは省略可能でデフォルトではgithub.refを使う。
- uses: Songmu/action-create-branch@v0
with:
branch: feature/new-feature
ref: main
何故作ったか
先のエントリーの、action-push-to-another-repositoryのフォーク元には、元々、create-target-branch-if-needed
という、指定ブランチがなかったら作るオプションがあった。しかし、私がフォークしたものからはそれを削除した。コードの複雑性が増してしまっていたし、その機能を内包する必要性も感じなかったからだ。
ただ、一時ブランチを作って、そこにpushするユースケースは確かにあるだろう。であれば、前段に、ブランチがなかったら作るというステップを定義すれば良い。
そういう、単純にブランチを作るだけのGitHub Actionはきっとあるだろうと思ったが、案外良い物が見当たらなかった。具体的には、分岐元のrefにブランチ名、タグ、コミットハッシュを柔軟に指定したいが、それができるアクションを見つけられなかったので、作った。
APIで操作するので、事前にcheckoutする必要がないのも嬉しいポイント。
action-push-to-another-repositotyとの組み合わせ
リポジトリのREADMEにも追記したが、以下のように使えば良い。
- uses: actions/checkout@v4
persist-credentials: false
- name: Create branch if needed
uses: Songmu/action-create-branch@v0
with:
repository: 'owner/dest-repo'
branch: 'new-feature'
ref: develop
- name: Push to another repository
uses: Songmu/action-push-to-another-repository@v2
with:
destination-repository: 'owner/dest-repo'
destination-branch: 'new-feature'
こちらの方が、1つのアクションに変にオプションを増やすよりも明確で分かりやすい。この様に、シンプルな部品を作りシンプルに留めること、それらを上手く組み合わせて使うのがソフトウェア設計全般で大事なことの1つだ。
実際、action-push-to-another-repositoryのスクリプトは50行程度だが、action-create-branchは133行と実はこっちの方が分量が多くなっている。なので、ブランチを作る処理はやはり内包したくない。
ちなみに、aciton-push-to-another-repositoryのコード行数が比較的少ないのは、コミット処理をsuzuki-shunsuke/commit-actionに委譲しているからだ。
また、action-create-branchのコード行数が比較的多いのは、指定されたrefからコミットハッシュを解決する処理がそこそこ複雑だからだ。それを今回はGraphQL APIを使って、一撃でcommitハッシュを取得するようにしてあるのが面白ポイントなので、興味ある方はコードを見て欲しい。
このアクションの開発ではClaude Codeに大半のコードを書いてもらった。便利ですね。