github apiを使ってrelease作成とunitypackageアップロード

2 min read読了の目安(約2400字

経緯

unityのexport unitypackageでできたファイルを自動でgithubに上げたいなと思い
とりあえずテストで作ったunitypackageファイルをアップロードできるところをやり始めた感じです。

下準備

今回private リポジトリでの作業も考えているのでtokenの作成をしておきます。

Personal Tokenの作成

画像 手順
githubの右上のprofileからsettings
左側のメニューからdeveloper settings
personal access tokenを選ぶ
generate new tokenを選ぶ
権限の指定ですが今回はrepo packagesの2つでいいですね(workflowのgithub actionは使わないのでなしでOK)

※作成すると文字列が出てきますが、二度と表示されないので必ずメモ帳等で保存します。

シェルの記述

releaseの作成

まずはreleaseを作るところから
アップロードするファイルはreleaseを作ってから上げる必要があります。
既にあればlatest release api等で取得するのが良いかと

test.sh
token="ここには上で取得した文字列を"
tag="v0.0.1"
repository_path="オーナー名/リポジトリ名"

response=$(curl -X POST -H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token $token" https://api.github.com/repos/$repository_path/releases \
-d "{\"tag_name\":\"$tag\"}")

create release apiについてはこちら

https://docs.github.com/en/rest/reference/repos#create-a-release

latest release apiについてはこちら

https://docs.github.com/en/rest/reference/repos#get-the-latest-release

タグ名でreleaseを持ってくる場合はこちら

https://docs.github.com/en/rest/reference/repos#get-a-release-by-tag-name

ファイルのアップロード

作成またはlatest等の次はファイルのアップロードです。
上のレスポンスにidがあるのでそれを使います。これでどのreleaseに対してファイルを上げるかを決定します。

test.sh
release_id=$(echo $response | jq '.id')
file_path="./test.unitypackage"

response=$(curl -X POST -H "Content-Type: $(file -b --mime-type $file_path)"\
-H "Authorization: token $token" --data-binary @$file_path \
"https://uploads.github.com/repos/$repository_path/releases/$release_id/assets?name=$(basename $file_path)")

補足
・ファイル名のままファイルを上げるにはnameにファイル名を渡す
・注意したいのはurlの形式、先程までapi.github.comだったところがuploads.githubになっている点。基本は下のapiを参考にしているがurlは違う
・--data-binaryで@$になってる点。@を外すとちゃんとデータがアップロードできないので注意

upload release asset

https://docs.github.com/en/rest/reference/repos#upload-a-release-asset

既にデータやreleaseがあった場合はupdate等のapiで書き換える必要がありますが
ひとまずアップロードできたらという感じで