gitのcommit-hashからPhabricatorチケットNo.の取得方法
Phabricatorでプロジェクトの管理をしているとリリースブランチに完了タスク以外のcommitが含まれていないかを確認したいときが出てくる。
具体的に言うのであれば、リリース管理として不正なコードがリリースされていないことの証明をすることをIT監査で求められたりする。
というわけで以下に取得の方法を書いていく。
- commit-hashの取得
- Phacricator上のリポジトリIDを取得
- commit-hashに紐付くPhabricatorのIDを取得(CommitPHID)
- CommitPHIDに紐付くDifferentialのIDを取得(DifferentialPHID)
- DifferentialPHIDからDIFFのチケット番号とタイトルを取得
- DifferentialPHIDに紐付くTaskのIDを取得(TaskPHID)
- TaskPHIDからTaskのチケット番号とタイトルを取得
- 最後に
commit-hashの取得
単純にgit log
コマンドで前回のリリースブランチと今回のリリースブランチの差分を取得する。
git log --pretty=oneline $OLD_BRANCH..$NEW_BRANCH | awk '{print $1}'
- $OLD_BRANCH: 前回のリリースブランチ
- $NEW_BRANCH: 今回のリリースブランチ
Phacricator上のリポジトリIDを取得
次のCommitPHIDを取得するためにリポジトリのPHIDを調べる必要があるので、phid.lookupで取得する。
echo '{"names": ["$REPOSITORY_NAME"]}' | arc call-conduit --conduit-uri $PHABRICATOR_URL phid.lookup | jq .
- $REPOSITORY_NAME: 取得したいリポジトリの名前
- $PHABRICATOR_URL: 管理しているPhabricatorのURL
commit-hashに紐付くPhabricatorのIDを取得(CommitPHID)
PhabricatorのCommitPHIDはdiffusion.querycommitsを使用することで取得できる。
echo '{"repositoryPHID": "$REPOSITORY_PHID","names": $COMMIT_LIST}' | arc call-conduit --conduit-uri $PHABRICATOR_URL diffusion.querycommits | jq -r ".response.data[].phid"
- $REPOSITORY_PHID: 上記で取得したPhabricatorPHID
- $COMMIT_LIST: git logで取得したhashをリスト形式で記載したもの
- 例) ["hoge", "hogehoge"]
- $PHABRICATOR_URL: 管理しているPhabricatorのURL
CommitPHIDに紐付くDifferentialのIDを取得(DifferentialPHID)
ここからが探していても分かりづらいところで、CommitPHIDからDifferentialPHIDを取得する際に、diffusionとかdifferentialのAPIでは取得できない。
そこでedge.search
を使用する。これはsourcePHIDsに指定したPHIDからtypesに指定した情報を取得できる。commit.revision
でCommitPHIDに紐付くDifferentialのPHIDが取得できる。
echo '{"types": ["commit.revision"], "sourcePHIDs": $COMMIT_PHID_LIST}' | arc call-conduit --conduit-uri $PHABRICATOR_URL edge.search | jq -r ".response.data[].destinationPHID"
- $COMMIT_PHID_LIST: 上記で取得したCommitPHIDをリスト形式で記載したもの
- 例) ["PHID-CMIT-hoge", "PHID-CMIT-hogehoge"]
- $PHABRICATOR_URL: 管理しているPhabricatorのURL
DifferentialPHIDからDIFFのチケット番号とタイトルを取得
diffの詳細については先で取得したDifferetialPHIDがあれば、differential.revision.search
を使用して簡単に取得できる。
echo '{"constraints": {"phids": $DIFF_PHID_LIST}}' | arc call-conduit --conduit-uri $PHABRICATOR_URL differential.revision.search | jq -rc '.response.data[] | {"id": .id, "title": .fields.title}'
- $DIFF_PHID_LIST: 上記で取得したDifferentialPHIDをリスト形式で記載したもの
- 例) ["PHID-DREV-hoge", "PHID-DREV-hogehoge"]
- $PHABRICATOR_URL: 管理しているPhabricatorのURL
DifferentialPHIDに紐付くTaskのIDを取得(TaskPHID)
こちらはCommitPHIDからDifferentialPHIDを取得したようにDifferentialPHIDからTaskPHIDを取得する。この場合のtypesはrevision.task
となる。
echo '{"types": ["revision.task"], "sourcePHIDs": $DIFF_PHID_LIST}' | arc call-conduit --conduit-uri $PHABRICATOR_URL edge.search | jq -r ".response.data[].destinationPHID"
- $DIFF_PHID_LIST: 上記で取得したDifferentialPHIDをリスト形式で記載したもの
- 例) ["PHID-DREV-hoge", "PHID-DREV-hogehoge"]
- $PHABRICATOR_URL: 管理しているPhabricatorのURL
TaskPHIDからTaskのチケット番号とタイトルを取得
taskの詳細については先で取得したTaskPHIDがあれば、maniphest.search
を使用して簡単に取得できる。
echo '{"constraints": {"phids": $TASK_PHID_LIST}}' | arc call-conduit --conduit-uri $PHABRICATOR_URL maniphest.search | jq -rc '.response.data[] | {"id": .id, "title": .fields.name}'
- $TASK_PHID_LIST: 上記で取得したTaskPHIDをリスト形式で記載したもの
- 例) ["PHID-TASK-hoge", "PHID-TASK-hogehoge"]
- $PHABRICATOR_URL: 管理しているPhabricatorのURL
最後に
この辺りはPhabricatorのドキュメントにも記載されてはいるが、率直に言って非常にわかりにくいドキュメントなのでなかなかに苦労した。 しかし、それなりに取得できる情報は多いので一度見てみるのも良いと思う。