GitHub

GitHub REST APIでReleaseのassetをアップロード・ダウンロードする

ビルドしたモジュールを GitHub の Release に登録し、次に登録したモジュールを取得してみます。

なお本記事は GitHub Enterprise Server 3.3 で確認しています。
(ドキュメントへのリンクはgithub.com向けのAPIへのリンクとしていますので、GHESのドキュメントを確認する場合はサイト内で切り替えてご覧くださいね)

assetのアップロード

asset をアップロードするには、まず Get a release by tag name API を使って、モジュールを登録したい既存タグの Release の情報を取得します。

#!/bin/bash

github_token="YOUR_TOKEN"
tag_name="v1.2"
github_releases_url="https://YOUR_GHES_HOST/api/v3/repos/OWNER/REPO/releases"
asset_file="hoge.tar.gz"

# tagのrelease情報を取得
get_tags_url="${github_releases_url}/tags/${tag_name}"
response=`curl -L -X GET $get_tags_url -H "Authorization: Bearer ${github_token}" \
     -H 'Accept: application/vnd.github+json'`
リリースの REST API エンドポイント - GitHubドキュメント
この REST API を使って、リリースの作成、変更、削除を行います。

この API のレスポンスの中に upload_url というフィールドがあります。
asset をアップロードするにはこのURLを使用します。

upload_urlYOUR_GHES_URL/api/uploads/repos/OWNER/REPO/releases/RELEASE_ID/assets{?name,label} のような文字列のため、整形しています。
また Content-Type もアップロードするモジュールの形式に合わせて指定しましょう。

#!/bin/bash

# レスポンスから、当該tagのReleaseへのアップロード用URLを整形
upload_url=`echo "${response}" | jq '. | .upload_url' | tr -d '"'`
upload_url="${upload_url%%\{*}?name=${asset_file}"
echo $upload_url

# assetをアップロード
curl -L -X POST ${upload_url} -H "Authorization: Bearer ${github_token}" \
     -H 'Accept: application/vnd.github+json' \
     -H 'Content-Type: application/gzip' \
     --data-binary ${asset_file}
リリース アセット用 REST API エンドポイント - GitHubドキュメント
REST API を使って、リリース アセットを管理します。

なお GitHub Actions を使う場合は、この処理と同等の upload-release-asset というアクションモジュールがあります。GHES でも標準装備されているアクションです。便利ですね。

GitHub - actions/upload-release-asset: An Action to upload a release asset via the GitHub Release API
An Action to upload a release asset via the GitHub Release API - actions/upload-release-asset

assetのダウンロード

Releaseのasset(Releaseに対してアップロードされた配布物)を取得するには、Get a release asset APIを使います。
ドキュメントによると、Accept ヘッダには application/octet-stream を指定する必要があるので注意です。

#!/bin/bash

# tagのrelease情報を取得
get_tags_url="${github_releases_url}/tags/${tag_name}"
response=`curl -L -X GET ${get_tags_url} -H "Authorization: Bearer ${github_token}" \
    -H 'Accept: application/vnd.github+json'`

asset_id_list=`cat ${response} | jq ".assets[].id"`

# assetのダウンロード
for asset_id in ${asset_id_list}
do
    $asset_url=${github_releases_url}/assets/${asset_id}
    curl -L -X GET ${asset_url} -H "Authorization: Bearer ${github_token}" \
    -H 'Accept: application/octet-stream'`
done
リリース アセット用 REST API エンドポイント - GitHubドキュメント
REST API を使って、リリース アセットを管理します。

このAPIを使うには、取得したい asset がある asset_id をあらかじめ取得しておく必要があります。
asset_id は ダウンロード時と同様の Get a release by tag name API あるいは Get the latest release API で取得できます。ここで取得した asset_id を、Get a release asset API で指定しています。

リリースの REST API エンドポイント - GitHubドキュメント
この REST API を使って、リリースの作成、変更、削除を行います。

ダウンロードの GitHub Action モジュールは、今時点では本家のものはないようです。
Marketplaceで検索すると、以下のようなモジュールがいくつかヒットします。

GitHub - dsaltares/fetch-gh-release-asset: Github Action to download an asset from a Github release
Github Action to download an asset from a Github release - dsaltares/fetch-gh-release-asset

参考)APIの動作確認にはPostmanが便利

GitHub REST API に限りませんが、REST API の動作確認には Postman というフリーソフトがおすすめです。
自分で curl コマンドを書こうとして都度都度オプション文字を調べたり、スクリプトの書き損じを直したりして、時間を浪費せずにすみます。
こちらのツールの使い方は、別記事で書けたらと思います。

Postman: The World's Leading API Platform | Sign Up for Free
Accelerate API development with Postman's all-in-one platform. Streamline collaboration and simplify the API lifecycle for faster, better results. Learn more.

しかも動作確認を終えたら、さまざまなプログラミング言語でコードを生成してくれますよ。
わたしは bash だけでなく PowerShell でも試すことが多いのでとても助かっています。

Generate code snippets from API requests | Postman Docs

GitHubにはREST APIだけでなくCLIツールもある

最後に、REST API に抵抗がある場合、GitHub にはコマンドもあります。
REST API 同様、まず Private Access Token での認証コマンドを通してから、利用します。
最新版のコマンドのマニュアルを確認したら、Release に関するサブコマンドもありますね。
CLI もどんどん便利になっていますね。

GitHub CLI
Take GitHub to the command line
タイトルとURLをコピーしました