GitHub 上 Release Golang 的 Action – GoReleaser Action

最近在寫 Golang 的東西覺得每次 Release 都要自己手動 Build 執行檔很麻煩,所以就找了一下 GitHub 發現有一個很好用的 Action 它叫 GoReleaser

GoReleaser 介紹

它可以做到自動 Build 再配合 actions/upload-artifact 就可以自動上傳執行檔到 GitHub artifact,如果有需要為檔案做 Signing 它也是可以完成的。

GoReleaser 支援

目前 GoReleaser 支援三種平台分別是 GitHub、GitLab 與 Gitea,不過本文只會介紹 GitHub 平台。

GoReleaser 設定方法

Build 測試

其實只要簡單新增一個檔案例如 .github/workflows/goreleaser.yaml 它就會自動做 Build 的動作了,此方法其實可以拿來做 Build 測試。

name: goreleaser

on:
  pull_request:
  push:

jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
      -
        name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.15
      -
        name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v2
        with:
          # either 'goreleaser' (default) or 'goreleaser-pro'
          distribution: goreleaser
          version: latest
          args: release --rm-dist
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          # Your GoReleaser Pro key, if you are using the 'goreleaser-pro' distribution
          # GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }}

自動上傳 GitHub artifact

上傳 Linux 與 macOS 執行檔

如果想要讓它自動上傳 Linux 與 macOS 執行檔到 artifact 可以把檔案修改成如下

name: goreleaser

on:
  pull_request:
  push:

jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
      -
        name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.15
      -
        name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v2
        with:
          version: latest
          args: release --rm-dist
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      -
        name: Upload assets
        uses: actions/upload-artifact@v2
        with:
          name: myapp
          path: dist/*

上傳包含 Windows 的執行檔

預設情況並不會 Build Windows 執行檔,所以如果想要它一起處理 Windows 執行檔,可以在目錄加入 .goreleaser.yml 檔案跟它說還需要處理 Windows 執行檔的動作,而更多的設定參數可以參考文件

builds:
  -
    env:
      - CGO_ENABLED=0
    goos:
      - darwin
      - linux
      - windows
    goarch:
      - 386
      - amd64

GoReleaser Pro

另外它還有付費功能的 GoReleaser Pro 可以處理上傳 aptyum 之類的功能,如果需要可以研究一下。

GoReleaser Command Line

除了 GitHub Action 之外它還有 cmd 指令可以使用,例如可以把 go build 換成 goreleaser build 使用,它可以提供更多的 Build 功能。