🍣

GitHub Actions から Releasesを作る

に公開

GitHub Actions から Releasesを作る

GitHub Actionsを使って、GitHub Releasesを作成し、そこに成果物を添付したいというのが動機です。
シンプルですが、GitHub Releasesを作成する記事はあるものの、成果物の添付までするようなものは少ない印象だったので、この記事を書いた次第です。

Actions から Releases を作るには

結論から言うと、svenstaro/upload-release-action@v2 のアクションを使うと簡単に実現が可能です。
たとえば、成果物が artifacts.zip として用意されているとして、ファイル添付ありでリリースするには、以下のようなymlファイルを記述します。

name: Sample

on:
  workflow_dispatch:

jobs:
  build-and-release:
    runs-on: ubuntu-latest
    name: build-release
    steps:
      - name: Checkout Repos
        uses: actions/checkout@v4
      - name: Build
        run: |
            echo "ここでビルド処理"
      - name: Upload binaries to release
        uses: svenstaro/upload-release-action@v2
        with:
            repo_token: ${{ secrets.GITHUB_TOKEN }}
            file: build/artifacts.zip
            asset_name: artifacts.zip
            tag: ${{ github.ref }}
            overwrite: true
            body: "This is my release text"

これはアクションのドキュメントにあるものをベースに記述していますが、そのまま使うには課題があります。たとえば、以下のような点で気になります。

  • タグが github.ref なのでブランチ名などになってしまう
  • この upload-release-actionでは、対象となるタグが必要であること
  • リリースおよびタグにはバージョンなどの記載ができていないこと

タグを自動生成して Releases を作る

先の課題を解決するために、タグを自動で生成してバージョン情報とし、Releasesを作る方法があります。
日時情報からタグを付けてReleasesを作る設定例が以下の通りです。
gitの操作をするという点で、fetch-depth:0 を付けてチェックアウトしたり、tag を付けるためにユーザー情報を仮設定していたりなどしています。
タグを付けたらそれを元にsvenstaro/upload-release-action@v2でリリースを作成する流れとなっています。

steps:
    - name: Checkout Repos
      uses: actions/checkout@v4
      with:
        fetch-depth: 0 
    - name: build
      run: |
        echo "Build Process"
    - name: Set current time
      id: version
      run: |
          echo "text=ver$(TZ=Asia/Tokyo date +%y%m%d%H%M)" >> "$GITHUB_OUTPUT"
    - name: Create tag
      run: |
          cd $GITHUB_WORKSPACE
          git config user.name "github-actions"
          git config user.email "github-actions@github.com"
          git tag ${{ steps.version.outputs.text }}
          git push origin ${{ steps.version.outputs.text }}          
    - name: upload pdf to release
      uses: svenstaro/upload-release-action@v2
      with:
          release_name: ${{ steps.version.outputs.text }}
          file: production.zip
          asset_name: production-${{ steps.version.outputs.text }}.zip
          tag: ${{ steps.version.outputs.text }}
          body: "リリースしました🎉"
          overwrite: true

その他

これでバージョンを自動生成し、Releasesを作れるようになりました。
この一連の作業を切り出して、Composite Actionとするのも良さそうです。
tagの生成をSHAを使うようにしたり、日付を使うようにしたりと、与える引数で切り替えられてもよいですね。

Actionsの記述を再利用する方法として、以下のようなパターンがあります

  • Composite Action
  • Reusable workflow

独立性を高くして再活用したかったので、今回はComposite Actionを選択しました。ここでReusable workflowの記述と混乱してしまったので簡単に注意点を記載します。

Composite Actionは、以下のような配置で使う必要があります。
フォルダやファイル名に固定のルールがあります。

root
  + .github
  |    + actions
  |    |   + your-action
  |    |       + action.yml (or action.yaml)
  |    + workflows
  |        + myworkflow.yml
  |
  + source (プロジェクトコード類)

ポイントは以下の点です。ファイル名が固定となる点が注意です。

  • .github/actions 以下に、アクション名を示すフォルダを作成する
  • 各Composite Actionは、action.yml という固定のファイル名であること

参考情報

一度ある程度分かった後だと、情報を調べやすくなりました。
参考にした各サイトへのリンクを紹介します。

https://zenn.dev/tmrekk/articles/5fef57be891040

https://qiita.com/shun0909/items/5532d2911b4df7a9a6e3

https://enu23456.hatenablog.com/entry/2022/10/16/105857

https://github.com/svenstaro/upload-release-action

Discussion