げっとシステムログ

WEB開発メモ

GitHub Release に asset を追加してみる

CONTENTS
  1. やりたいこと
  2. できたやつ
  3. ベースにしたもの
  4. まとめ
  5. 参考資料
ENVIRONMENTS
  • node: 14.4
  • @actions/github: 3.0.0

やりたいこと

CI から GitHub の Release に asset を追加したい。 GitHub Actions からやる方法はいろいろ出てくるが、GitHub Actions ではない CI からやる方法が見つからなかったのでまとめておく。

TOP

できたやつ

node で以下を実行する。

const { getOctokit } = require('@actions/github');
const fs = require('fs');
const path = require('path');

(async function run() {
  try {
    const github = getOctokit(process.env.GITHUB_RELEASE_TOKEN);

    const release = await github.repos.createRelease({
      // リリースを作るリポジトリを指定
      owner: "getto-systems",
      repo: "example",
      tag_name: get_tag_name(),
    });

    const assetPath = path.join(__dirname, "build.tar.gz");
    const assetData = fs.readFileSync(assetPath);

    const headers = {
      // asset の content-type を指定
      'content-type': "application/gzip",
    };

    // Release に追加する asset の名前を指定
    const assetName = "asset.tar.gz";
    const uploadURL = `${release.data.upload_url}&name=${assetName}`;

    await github.repos.uploadReleaseAsset({
      url: uploadURL,
      headers,
      data: assetData,
    });
  } catch (error) {
    console.log(error);
    process.exit(1);
  }
})();

function get_tag_name() {
    return "v0.0.0"; // リリースを作るタグをどうにかして特定
}

TOP

ベースにしたもの

GitHub の Release に asset を追加する方法を調べると、この GitHub Action が出てきた。 これをベースにして外部の CI から使用できるように調整してみた。

ドキュメントが見つからなかったので、Developer Guide を参考にしつつ、呼び出すメソッドを手探りで探す感じになった。

まず、リリースは createRelease で作成しないといけない。 tag をつけただけではリリースにはならないらしい。 さらに、1つの tag につき1つのリリースしか作成できない。

uploadReleaseAsset に指定する URL は createRelease のレスポンスに含まれる upload_url を使用する必要がある。 また、バイナリの場合、asset データは file ではなく data で指定する必要があった。

TOP

まとめ

リリースに asset をアップロードする方法をまとめた。

API 呼び出しメソッドの定義にたどり着けなかったので、完全に手探りなスクリプトである。

TOP

参考資料

TOP