前言:
使用 Golang 來開發小工具最方便的方式,就是可以很快速將程式碼託管在 github.com 。 並且透過 Golang 的跨平台編譯的工具,可以快速打包出各種平台(Windows, Linux 跟 Mac 平台)的執行檔。
那麼有沒有方式可以直接在 github.com 發行新的版本後,直接就打包好所有執行檔變且幫你把 Changelog 都打好呢?
TL;DR
本篇文將要介紹:
- 新的打包套件 GoReleaser
- 如何整合到 GitHub action
- 發行新的版本 (Release) 的時候,就直接打包好新版本
- 並且可以自動幫你打好所有 Release Note (包含 Changelog )
以前要如何打包你的 Golang CLI ?
在以前的時候,曾經有出過一個很方便可以快速打包所有平台執行檔案的小工具。 Gox 就是一個很方便的小工具:
GOX 快速快平台打包工具(以前)
https://github.com/mitchellh/gox
$ go get github.com/mitchellh/gox
...
$ gox -h
...
就這麼簡單,就可以快速編譯跨平台的工具。 其實因為 Golang 從 1.5 之後就支援跨平台編譯。 其實跨平台編譯透過
env GOOS=linux GOARCH=arm go build -v github.com/constabulary/gb/cmd/gb
透過這個方式就可以快速的打包你的工具,所以其實後來 gox 就也比較沒人在用。
需要注意地方:
- AMD 64 只能編譯 AMD64
- 如果要編輯 ARM 就需要使用到 ARM 版本的處理好才可以。
關於跨平台打包(編譯)更多的文章:
關於跨平台編譯更多的詳細敘述,可以參考這篇 Dave Cheney 的文章。
GoReleaser 一個好用的打包發佈的工具
後來我也看到 https://github.com/kkdai/youtube 一起在打造的夥伴們有導入 GoReleaser 。 看了一下,發現還真的蠻好用的。
這裡簡單介紹一下, GoReleaser 有做哪些事情:
- 幫助你一次透過多平台打包套件
- 可以深度整合 Github 跟 Gitlab 讓你直接發佈整個產品提供下載
-
可以幫忙整理出 ChangeLog 可以幫忙整理出 ChangeLog 可以幫忙整理出 ChangeLog (懶人福星) - 整合 Docker 相關功能(打包 Docker Image)
GoReleaser 的安裝方式
brew install goreleaser/tap/goreleaser
curl -sfL https://install.goreleaser.com/github.com/goreleaser/goreleaser.sh | sh
如何使用 GoReleaser
-
goreleaser init
來產生.goreleaser.yml
的樣板檔案 -
來測試一下打包
goreleaser --snapshot --skip-publish --rm-dist
-
設定環境變數,讓你可以跟 Github 整合
export GITHUB_TOKEN="YOUR_GH_TOKEN"
- Github Token 產生方式,去這一頁. https://github.com/settings/tokens/new
-
如果需要發布新版本,依照以下兩個步驟:
-
git tag -a v0.1.0 -m "First release" git push origin v0.1.0
goreleaser release
-
-
就會在 Github release 直接產生一個 Release ,並且把 ChangeLog 都包進去
是不是很方便?
可能會有的問題
第一次使用 GoReleaser 可能會遇到以下問題:
-
確認 Github Token 有確切的當成環境變數
-
每一次要 Release 前,需要手動將 git tag 打好 Push
-
沒有出現 ChangeLog?
- 記得不要打任何 Description 在你的 release
- 記得不要打任何 Description 在你的 release
- 記得不要打任何 Description 在你的 release
整合進 github action
Github Action 可以讓你更方便的,更直覺的來發布你的專案。而 GoReleaser 的 Github Actions 專案只需要透過以下方式:
- 建立一個檔案在
.github/workflows/release_project.yml
(檔名可換) - 內容參考官方範例
- 記得加入專案的 Secrets
- [Settings] -> [Secrets] -> (右上角) [New repository secre]
- 名稱:
GITHUB_TOKEN
Token 就照之前申請的
- 由於設定 yaml 檔裡面有設定是
push:
tags:
- "*"
這樣就會每次有打 Tag 才會執行。
- 接下來只要在 github 上頁上的 Release -> [Draft a new release] 就可以了。
想找一個打包好的樣板,試試看? Github Command-line Template Repo
https://github.com/kkdai/go-cli-template
相關文章:
- GoReleaser Quick Star https://goreleaser.com/quick-start/
- 🚀 GitHub Action for release your Go projects as fast and easily as possible
- Golang Github Actions Starter