Featured image of post 用 Github Action 編譯並發 Release

用 Github Action 編譯並發 Release

用 Github Action 編譯並發 Release

如果自己寫的小工具的 GitHub 頁面右邊 Release 那欄有個什麼東西,一定很酷對吧!如果裡面已經提供了不同作業系統編譯好的程式,一定更酷!
想要建立 Release,你可以在新版本發布時自己手動 crose compile 再手動設定 Release,這個方法可行,但是聽起來全手動就很 low,我們要用一個全自動的方式發 Release!

Github Actioin

既然我們程式碼都託管在 GitHub 了,直接用 Gtithub Action 是很合理的吧!

觸發條件

因為我們要做的是發布版本,不是每個 commit 都要觸發,因此觸發條件就設成

1
2
3
4
on:
    push:
        tags:
            - 'v[0-9]+.[0-9]+.[0-9]+'

意思是只有像是 v0.1.13 這樣的標籤會觸發,也就是你建立新版本時。

編譯

在嘗試各種套件之後,我覺得 goreleaser-action 是我用起來最舒服的,不用太多設定,就直接都編譯好了(詳細設定可以去 goreleaser 的網站看 )
在 GitHub Action 中設定就下面幾行,第一個步驟是安裝 go,再來就是編譯了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
- name: Set up Go
  uses: actions/[email protected]
  with:
      go-version: 1.17.x
- name: Run GoReleaser
  uses: goreleaser/[email protected]
  with:
      version: latest
      args: release --rm-dist
  env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

注意,裡面有個 secret.GITHUB_TOKEN,這個東西你就照寫,不要抄錯,GitHub Action 會自動在 runtime 填入,所以你也不用特別去設定。

上傳編譯好的執行檔

goreleaser 的文件裡面有推薦一個上傳的套件,但是可能是我笨,那個都不成功。我用的是另一套 upload-to-github-release,這個可以一次上傳多個檔案,設定一樣很簡單。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
- uses: little-core-labs/[email protected]
  id: tagName
- name: Upload To Github Release
  uses: xresloader/[email protected]
  env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  with:
      file: 'dist/telegrary_*'
      draft: true
      tag_name: ${{ steps.tagName.outputs.tag }}

你會看到在上傳之前還有一個步驟,這個是用來取得 tag name 用的,他用來指定檔案要上傳到哪裡
with.file 這欄,你可以指定要上傳的檔案,這個要設成什麼就要看你 goreleaser 編譯出來的檔案放在哪,叫什麼(這個都是可以設定的)
draft 設成 true 有個好處,就是 Action 跑玩後不會立刻建立新 Release,而是你在去手動確認,而且包括 Release name、Change log 都設定好了,你只需要看有沒有什麼說明要加,就可以直接按發布了,非常方便。當然你如果沒有什麼想說的,就可以直接設定 draft: true,如此一來就真的是「全自動了」

完整 action 設定檔

以上是細部解說,下面就是完整設定檔,如果有更新的話請到 https://github.com/simbafs/telegrary/blob/main/.github/workflows/release.yml 看最新版。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
name: Release

on:
    push:
        tags:
            - 'v[0-9]+.[0-9]+.[0-9]+'

jobs:
    goreleaser:
        runs-on: ubuntu-latest
        steps:
            - name: Checkout
              uses: actions/checkout@v2
            - name: Unshallow
              run: git fetch --prune --unshallow
            - name: Set up Go
              uses: actions/[email protected]
              with:
                  go-version: 1.17.x
            - name: Run GoReleaser
              uses: goreleaser/[email protected]
              with:
                  version: latest
                  args: release --rm-dist
              env:
                  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
            - name: ls
              run: |
                  ls dist                  
            - uses: little-core-labs/[email protected]
              id: tagName
            - name: Upload To Github Release
              uses: xresloader/[email protected]
              env:
                  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
              with:
                  file: 'dist/telegrary_*'
                  draft: true
                  tag_name: ${{ steps.tagName.outputs.tag }}
好想養貓阿~~
使用 Hugo 建立
主題 StackJimmy 設計