shepherdという複数のGithubリポジトリに対して一括で変更〜PR作成までができるツールを使ってみたので、使い方をまとめます!
インストール
$ npm install -g @nerdwallet/shepherd
$ shepherd version
1.16.0
準備
shepherdでは、github の操作のためにTokenが必要です。
Personal Access Tokenの場合は、github UIの右上アイコンのプルダウンから「Setting」 > 左側の「Developer settings」を選択します。
そうするとTokneを生成できるUIが表示されるので「Generate new token」を実行します。
以下の権限をつけておけば大丈夫です!
- Pull Requests:Read and write
tokenを作成したら、環境変数に設定しておきます。
$ export GITHUB_TOKEN=<生成したトークン>
変更内容を定義
shepherdでは、各リポジトリへの変更内容を shepherd.yml
に記述します。
以下は、リポジトリ直下に「README.md」がなければ作成するという変更をすると仮定した記述例です。
# ブランチ名
id: create_readme
# PRタイトル
title: "create README.md"
adapter:
# github固定
type: github
# repositories or code
search_type: repositories
# 検索クエリ
search_query: "org:rhirabay"
hooks:
# 変更対象かどうかの判定コマンド
should_migrate:
- test ! $(ls README.md)
# 変更内容を記載
apply:
- touch README.md
# PRメッセージを生成(echo等で標準出力)
pr_message: |
echo 'create README.md'
実行!
shepherdは以下の形式で実行します。
shepherd <コマンド> <shepherd.ymlの格納ディレクトリ>
リポジトリに変更を加えて、PRを作成するのであれば以下のコマンドを順に実行すればOK!
- checkout
- apply
- commit
- push
- pr
checkout
変更対象のリポジトリをcheckoutするコマンドです。
変更対象はsearch_query
とshould_migrate
によって判断されます。
$ shepherd checkout .
checkoutされたリポジトリの一覧は list
コマンドで確認可能です。
$ shepherd list .
apply
checkoutしたリポジトリにそれぞれ変更を加えるコマンドです。
apply
で定義した内容で変更が行われます。
$ shepherd apply .
commit / pull
それぞれgitコマンドと対応したコマンドという認識で大丈夫です。
applyで実行した変更をcommit, pushしてくれます!
$ shepherd commit .
$ shepherd push .
pr
PullRequestを作成してくれるコマンドです。
$ shepherd pr .
PullRequestのボディを事前に確認したい場合はpr-preview
で確認できます!
$ shepherd pr-preview .
[rhirabay/my-projects] 1/1
$ echo 'create README.md'
Step "echo 'create README.md'
" exited with 0
✔ Generated PR message
=========
create README.md
---
*This change was executed automatically with [Shepherd](https://github.com/NerdWalletOSS/shepherd).* 💚🤖
=========
作成されたPRとそのステータスの一覧は pr-status
で確認できます!
$ shepherd pr-status .
[rhirabay/my-projects] 1/1
PR #2 [https://github.com/rhirabay/my-projects/pull/2]
PR is mergeable!
Tips
checkoutしたリポジトリはどこに?
~/.shepherd/<id>/repos/<org>/<repo>
というディレクトリ配下にありました!
一部だけ実行する
--repos
オプションをつけることで、各コマンドの対象リポジトリを絞ることができます!
# 形式: --repos <org>/<repo>,<org>/<repo>
$ shepherd checkout . --repos rhirabay/my-projects
一気にapplyしてしまうと怖い人でもこれで安心です!
applyスクリプトを共有する
publicなリポジトリにスクリプトを置いておくと、こんなふうに書ける!
hooks
apply:
- curl https://raw.githubusercontent.com/rhirabay/my-projects/main/shepherd/scripts/create_readme.sh | bash
ただ、このスクリプトを探す手間や難易度をどう下げるかは考えないと、同じようなスクリプト乱立しそう😅
調査に使う
脆弱性対応や社内のシステム改修の影響調査等にも使えそうです!
例えば社内のシステム構成の統一のために「xxx.yyy
ファイルが配置されていないリポジトリは対応してー」みたいなときに以下の定義で checkout
とlist
を実行すれば、対象があるのかないのかすぐに確認できます!
hooks:
should_migrate:
- test ! $(ls xxx.yyy)
まとめ
shepherdの使い方についてまとめました。
一括で複数のリポジトリに変更を加えられるので、保守作業が一気に効率化できそうです…!
何かもっと効率的な使い方が思いついたら追記します!