タグを push したら GitHub Actions でリリースの下書きを作成+α - proudust.github.io

タグを push したら GitHub Actions でリリースの下書きを作成+α

この記事は Qiita の GitHub Actions Advent Calendar 2019 24 日目の記事でした。

今回はタグをリモートに push したら、リリースを作成とビルドの成果物を添付を自動で行う Workflow の実装例を紹介します。

1. タグを push したら自動でリリースの下書きを作成する

リリースの作成には actions/create-release を使用します。 ${{ github.ref }} は厳密には refs/tags/(タグ名) が入りますが、アクション側で refs/tags/ は取り除かれるので問題ありません。

- uses: actions/create-release@v1
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  with:
    # リリースのタグ (必須)
    tag_name: ${{ github.ref }}
    # リリースのタイトル (必須)
    release_name: 1. タグを push したら自動でリリースの下書きを作成する
    # リリースのタイトル (省略可能)
    body: |
      リリースの作成テストです。
      下書きかつプレリリースの状態で作成されます。
    # 下書き状態で作成する場合は true (省略時 false)
    draft: true
    # プレリリース表示を付ける場合は true (省略時 false)
    prerelease: true

ソースコード全文

このワークフローにより、以下のようなリリースが下書きで作成されます。

下書きリリース

2. 更にビルドの成果物を添付する

ファイルの添付には actions/upload-release-asset を使用します。 actions/create-release のステップに id を振り、outputs の upload_url を参照できるようにします。 圧縮などはしてくれないので、予め zip コマンドなどを使用して圧縮する必要があります。

なお今回の例ではビルドの処理を省略し、touch artifact で作成した空の artifact ファイルをビルド成果物として記述しています。

# ビルド処理に置き換える
- run: |
    touch artifact
    zip artifact.zip artifact

- uses: actions/create-release@v1
  id: create_release # ファイルアップロードに outputs の値を使用するため ID が必要

- uses: actions/upload-release-asset@v1
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  with:
    # リリースのアップロード URL (必須)
    upload_url: ${{ steps.create_release.outputs.upload_url }}
    # 添付ファイルのパス (必須)
    asset_path: ./artifact.zip
    # 添付ファイルの表示名 (必須)
    asset_name: artifact.zip
    # 添付ファイルに対応する content-type (必須)
    asset_content_type: application/zip

ソースコード全文

このワークフローにより、Assets に artifact.zip が追加されたリリースが下書きで作成されます。 ssets に artifact.zip が追加されたリリース

3. ブランチの push の時はビルドだけする

同じ push イベントでも github.ref を確認することでタグが push された場合のみの処理を書くことができます。

  on:
    push:
+     branches:
+       - "*"
      tags:
        - "*"
# ビルド処理に置き換える
- # 略

# タグが push された場合のみ実行される
- uses: actions/create-release@v1
  if: startsWith(github.ref, 'refs/tags/')
  # 略

# タグが push された場合のみ実行される
- uses: actions/upload-release-asset@v1
  if: startsWith(github.ref, 'refs/tags/')
  # 略

ソースコード全文

このワークフローにより、ブランチの push 時はビルド、 ブランチの push 時はビルド

タグの push 時は更にリリースの作成が行われます。 タグの push 時は更にリリースの作成

4. ブランチの push の時の成果物をダウンロード可能にする

actions/upload-artifact にファイルパスを渡すことでそのファイルまたはディレクトリを圧縮して ZIP でダウンロードできるようにしてくれます。 ただし以下の点に注意してください。

  • path に圧縮済みのファイルを指定しても圧縮処理され、zip in zip という無意味なものが生成される (v2-preview では修正済み)
  • 保持期間は push されてから 90 日間、過ぎた場合は削除される
  • 手動での削除方法が無い
  • 容量制限がある (1GB までらしい)
- name: Upload build artifact
  # タグ以外が push された場合のみ実行される
  if: "!startsWith(github.ref, 'refs/tags/')"
  uses: actions/upload-artifact@v1
  with:
    # 表示名 (必須)
    name: artifact.zip
    # アップロードするファイルまたはディレクトリ (必須)
    path: ./artifact

ソースコード全文

このワークフローにより、ブランチの push 時はアーティファクト、 ブランチの push 時はアーティファクト

タグの push 時はリリースへビルドの成果物がアップロードされます。 タグの push 時はリリース

参考文献


Proudust

Proudust

Virtual cockadoodledoo