二度忘れた事を三度忘れないようにする

しがないフリーランスIT系エンジニア

Github Actionsでビルドしてリリースにアップロードしてみた

前回の続きです。

前回は自動ビルドとテストが出来ることを確認したので、今回はよくある以下のような状態を自動で行われるようにします。

f:id:knhko:20200519164010p:plain

流れとしては
・バージョンのタグ付けをする
・GithubActionsが動く
・完了
となります。

タグ付けは置いておいて、リリースへアップロードする用に新しくワークフローを作ります。

name: release

on:
  push:
    tags:
      - 'v*.*'

まず、特定文字列のタグがPushされた場合にこのワークフローが動くように条件設定します。今回は「v1.0」「v2.1」くらいの粒度にしてます。

jobs:

  release:
    name: release
    runs-on: ubuntu-latest
    steps:

      - name: Set up Go 1.x
        uses: actions/setup-go@v2
        with:
          go-version: ^1.13
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

次にビルドする環境を定義していきますが、ここは前回と同じような内容になっているので、割愛します。

      - name: Create artifact dir
        run: |
          cd src
          mkdir -p artifacts/Linux

      - name: Build for Linux
        run: |
          cd src
          GOOS=linux GOARCH=amd64 go build -o artifacts/Linux

      - name: Zip artifacts
        run: |
          cd src/artifacts
          zip -r Linux Linux/

ここのステップに記述されていることはスクリプトなどにしてしまうのも手かと思いますが、今回はActionsで完結するようにします。
一つ目のステップは、Golangなのでプラットフォーム毎にビルドしたモノを出力するディレクトリを作成しています。今回はLinuxのみにしてます。
二つ目のステップは、OSとアーキテクチャの指定を行いビルドを実施します。 三つ目のステップは、ビルドされたモノをZIPで圧縮しているだけです。

      - name: Create release
        id: create_release
        uses: actions/create-release@v1.0.0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          body: |
            Changes in this Release
            - First Change
            - Second Change
          draft: false
          prerelease: false

      - name: Upload Release Asset
        id: upload-release-asset-linux
        uses: actions/upload-release-asset@v1.0.2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./src/artifacts/Linux.zip
          asset_name: go_linux_amd64.zip
          asset_content_type: application/zip

次のステップ群はActionsオフィシャルの公開アクションを利用して、リリースの作成成果物のアップロードを実施しています。
一つ目のステップは、リリース作成のステップとなっていますが、公式のREADMEをそのままコピペして動きます。途中出てきている変数についてはGithub側で定義されている情報なので、我々が何か設定してやる必要はないようです。 body部分は独自に変えたほうが良いと思いますが、今回自分は削除してます。
二つ目のステップは、作成したリリースにファイルをアップロードします。withにあるupload_urlをみると、stepsからIDを指定して情報を取得しているので、URLがわかるのであれば静的に同じところへアップロードすることもできます。逆に同じワークフローで公開アクションを使ってリリースを作成していないと、コピペでは動かないでしょう。
asset_pathは先ほどZIP圧縮したファイルのパスを指定します。ここで注意なのは、ステップ毎にホームディレクトリへ戻っている為、パスの指定はホームディレクトリからとなります。
asset_nameはアップロードされ、リリースページで見える名前になります。なので、圧縮時までは適当な名前でも、ここで修正できます。

あとはこのファイルをcommitし、ブラウザやGitクライアントからタグをつけてやると、Actionsが動いて記事の頭にある画像のようにファイルがアップロードされます。
公式がアクションを用意してくれているため、非常に簡単に事が進みました。

次はGolang限定ですが、これらの流れがもっと簡素に出来るという「GoReleaser Action」というものに置き換えてみます。