先日のエントリで、CI/CD向けにgithub上にファイルをアップロードする方法としてUpload-Artifactアクションを使う方法を記述したが、
デプロイで外部からダウンロードするには不適切だったことがわかった。
そこで、今回はGithub Actionsでリリースを自動化する方法をまとめておく。
golang クロスビルド
まずは、リリースの成果物としてgolangからクロスビルド。(ちなみに今回のような場合は特にgox使わず go buildで良いが)
ひとまずバージョンとして日付とgitのコミットhashをバージョン文字列にしている。(本来はSemantic Versioningなどに従うべき)
バイナリのバージョンがわかりやすいように、-ldflags "-X main.version=
でバイナリにもバージョンを埋め込んでいる。
これはprometheusなどで出力しておくと便利。
- name: Cross build
id: build
run: |
DATE=`date +'%Y%m%d%H%M%S'`
VER=`date +'%Y%m%d%H%M%S'`-`git rev-parse --short HEAD`
echo "::set-output name=RELEASE_VER::${VER}"
gox -osarch="linux/arm" -ldflags "-X main.version=${VER}" ./cmd/elexporter/
また echo "::set-output name=XXXX"
としてechoしておくと、後続のactionから変数を参照できるようになる。
今回は上記で決めたバージョン文字列をsteps.build.outputs.RELEASE_VER
で他のactionから取得できるようにしている。
github release作成
リリースの作成。create-release
を使う。
- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.build.outputs.RELEASE_VER }}
release_name: Release ${{ steps.build.outputs.RELEASE_VER }}
draft: false
prerelease: false
release 成果物のアップロード
リリース成果物のアップロード。upload-release-asset
を使う。
デプロイのときにバイナリを個別にダウンロードしたかったので、ひとまずzipで固めずに個別にアップロードさせるようにした。
ただの実行形式バイナリなので、content-typeはapplication/octet-stream
。
- name: Upload Release Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./elexporter_linux_arm
asset_name: elexporter_linux_arm
asset_content_type: application/octet-stream
これで成功すると、githubのReleaseにこのように追加される。
参考
こちらを参考にさせていただきました!
コメント
[…] […]