コンテンツにスキップ

GithubActionsで自動化(2) リリース

Githubのリリースとは

基本は 前回まとめたので、今回はビルド結果をリリースする方法について。

Githubには、リポジトリのコードをビルドした結果を「Release」という形で
配布用に公開することができる。

リリースは、タグ単位で作成することができて、

タグページの Draft a new release から、

タグを指定して、作成できる。

作成すると、タグを指定した段階のリポジトリのソースコードと
GithubActionsを使用してビルドした結果などを
ダウンロードできるようにできる。

自動化

スクリプトを実行した結果を、ダウンロードできるようにしたサンプル。

タグの追加でアクション実行

すべてのPushに対してリリースが作られれてしまうと色々まずいので
指定のバージョンのみビルドするようにしたい。
そういう場合は、タグを使う。

タグは、コミット単位で指定することができる。
コードをコミット・プッシュした段階で、

1
git tag <tagname>

でタグを作成。
作成すると、最後のコミットに対してタグが追加できる。

この段階だと、ローカルのリポジトリに反映されただけなので

1
git push origin <tagname>

で、Github側にタグを反映できる。

1
2
3
4
on:
  push:
    tags:
      - "release-v*"

アクション側のトリガーに、 tagをプッシュした場合のみに変更。
さらに、タグ名も release-v1.0.0v のようにリリースタグがついたとき
のみに実行するようにする。

Actionsの便利なジョブを使う

GithubActionsには、自分でジョブを書くだけではなく
公開されたジョブのプリセットのようなものを「使う」事ができる。

1
2
3
4
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

たとえば、Gitのリポジトリをクローンしてくるような処理。
使いたい場合は、 run ではなく uses を使い
ユーザー名/リポジトリ名@ブランチ のように、指定する。

https://github.com/actions

公式で用意されているのはここにある。

1
2
3
4
      - uses: satackey/action-docker-layer-caching@v0.0.11
        continue-on-error: true
      - name: Docker Compose
        run: docker-compose -f docker/docker-compose.yml up --build -d

チェックアウト以外に、Dockerのイメージビルドをキャッシュして
変更がなければ高速化できる action-docker-layer-caching のように、だれかが公開してくれている
アクションも使うことができる。

大抵のものは調べたら出てくるので、これを利用して処理を自動化すると良い。

Artifactの追加

Artifactとは、アクション実行時の生成物を保存しておくことができる機能。

1
2
3
4
      - uses: actions/upload-artifact@master
        with:
          name: export usda
          path: ./src/usd/HelloWorld.usda

例えば、スクリプトを実行したときにできたファイルを、指定すると、

Actionsのページからダウンロードできるようになる。

タグ名を取得する

リリースでダウンロードできるようにするzipに、Gitのタグを使いたい場合。

1
2
3
      - name: Get the version
        id: get_version
        run: echo ::set-output name=VERSION::$(echo $GITHUB_REF | cut -d / -f 3)

事前のステップで、outputsにセットするようにすればよい。
タグ名は github.ref を使用すれば取得できるが、そのままだと refs/tag/tagname になってしまう。
なので、 cut を使用して3つ目のタグ部分だけを切り出して、 outputにセットする。

outputにセットされていれば、その値は steps.get_version.outputs.VERSION で取得できるので
これを zip 作成時に使う。

リリース

最後に、生成物をリリースする。

リリース部分もすでに便利なアクションが用意されているのでそれを使用する。

upload-release-asset の asset_path で、リリースをするファイルを指定できるので、
事前に作っておいたzipを指定する。

with: は、用意されたアクションに対して渡す引数のようなものなので
必要な情報を with 以下 key: value で指定すればOK。

まとめ

このアクションを作っておけば、指定タグをPushしたタイミングで自動でビルドが走り
その成果物が自動でリリースされる。

注意点として、このリリース処理はタグがついていることが前提になっていて
トリガーを tags ではなく通常のpushにして
タグがついていない状態で実行されると、 ref/heads/master というタグが自動で生成されて
ブランチ名と同様のタグができてしまい、プッシュしようとするとエラーになっていた。
(ものすごいハマる)

その時はGithubのTagから ref/heads/master を削除して、
アクションのトリガーは tag 指定のときのみに限定する。