ただ枯れゆく大樹が如く

技術の話やら愚痴やら節操もなく徒然と

gitのcommit-hashからPhabricatorチケットNo.の取得方法

Phabricatorでプロジェクトの管理をしているとリリースブランチに完了タスク以外のcommitが含まれていないかを確認したいときが出てくる。

具体的に言うのであれば、リリース管理として不正なコードがリリースされていないことの証明をすることをIT監査で求められたりする。

というわけで以下に取得の方法を書いていく。

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のドキュメントにも記載されてはいるが、率直に言って非常にわかりにくいドキュメントなのでなかなかに苦労した。 しかし、それなりに取得できる情報は多いので一度見てみるのも良いと思う。

https://secure.phabricator.com/conduit/