いけむランド

はてダからやってきました

git コマンドに必要な .git がない場合に GitHub API で代用する例

GitHub から最新バージョンの release の tar ball を持ってきて、展開して、ビルドしようとしたらビルドスクリプト内でバージョン情報の埋め込みに git コマンドを使ってるが .git が同梱されていないため、git コマンドがこけてビルドできないというパターンに遭遇した場合の対処法についてまとめる。(滅多にない。)

具体例をあげると、以下のようなものである。

github.com

git rev-parse でソースに埋め込むためのコミットハッシュを取り出しているが、当然ながら .git がなければ動かず、そのあとの存在チェックで fatal になってしまい、ビルドができないという状況となる。

この例では代替案として commit_hash.txt が事前にあれば、それを使うという分岐があるため、GitHub API からコミットハッシュを持ってきて、書き込んでおくことで .git がなくても、ビルドできるようになる。

$ echo `curl --no-progress-meter -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/ethereum/solidity/tags | jq ".[] |  select(.name == \"v${PV}\") | .commit.sha" | cut -b 2-9` > commit_hash.txt

リポジトリのタグ一覧を取得する API を叩く。

docs.github.com

すると以下のような JSON を取得できる。

[
  {
    "name": "v0.8.4",
    "zipball_url": "https://api.github.com/repos/ethereum/solidity/zipball/refs/tags/v0.8.4",
    "tarball_url": "https://api.github.com/repos/ethereum/solidity/tarball/refs/tags/v0.8.4",
    "commit": {
      "sha": "c7e474f243fa6bd6d6c172118b95d52113b5fbad",
      "url": "https://api.github.com/repos/ethereum/solidity/commits/c7e474f243fa6bd6d6c172118b95d52113b5fbad"
    },
    "node_id": "MDM6UmVmNDA4OTI4MTc6cmVmcy90YWdzL3YwLjguNA=="
  },
  {
    "name": "v0.8.3",
    "zipball_url": "https://api.github.com/repos/ethereum/solidity/zipball/refs/tags/v0.8.3",
    "tarball_url": "https://api.github.com/repos/ethereum/solidity/tarball/refs/tags/v0.8.3",
    "commit": {
      "sha": "8d00100c4e9d211830a5dbf6a1f964d98648480d",
      "url": "https://api.github.com/repos/ethereum/solidity/commits/8d00100c4e9d211830a5dbf6a1f964d98648480d"
    },
    "node_id": "MDM6UmVmNDA4OTI4MTc6cmVmcy90YWdzL3YwLjguMw=="
  },
  :
]

この中から対応する tar ball のバージョンのコミットハッシュを jq で取り出し、ファイルに書き込めばできあがりとなる。