前言:

在二月份文章有提到 使用 GoReleaser 打包你用 Golang 寫的 CLI (Command Line Tool),並且搭配 Github Actions 準備 Changelogs ,透過 GoReleaser 可以跟 Github Action 整合之外,還可以幫你撰寫 Changelogs 讓版本管控上變得更加的簡單與方便。

但是隨著服務與產品的應用變廣,會有更多的客製化需求發生。那麼該如何讓你的 Github Action 能夠有更多樣的自訂設定呢?

基本需求: GoReleaser with Github Action

大家可以參考前一篇文章,也可以快速學習本篇。

把這個建立成檔案在 .github/workflows/release_build.yml 就可以了。 這個其實比較適合 main.go 直接放在 github repo 下的,可以參考 https://github.com/kkdai/go-cli-template 的專案形式。

main.go 在子目錄 (sub-folder) Main program in sub-folder

通常在開發一些套件的時候,有時候我們主要 Repository 會是相關的開發套件 (Package) 而會將 CLI 的部分放在 cmd/xxx_cli 的資料夾中。需要安裝的時候再跑 go install xxx.com/xxx/uuu/cmd/xxx_cli 來安裝。

如果這時候你的 main.go 並不在 repo 的主目錄下,而是在 cmd/test_cli 的目錄下。 這個時候你就會發生錯誤。

goreleaser error: dones not contain a main function

這時候要如何修改呢?

依照上面顯示,主要修改部分就在於 workdir: ./cmd/test_cli 放在 Steps Run GoReleaser 裡面的 with:。 這樣就可以正常的編譯出執行檔案,並且更新 changelogs 。

多個相關的執行檔案需要編譯 / 客製化編譯選項

因為原先在 .github/workflows資料夾中,有相關的指令限制,參考 github action Workflow syntax

如果有想要更多客製化編譯選項如下:

  • 多個資料夾在 /cmd/ 底下。
  • 讓 GoReleaser 的編譯選項多一些,預設會全部 Compile 。可以挑選只要 Mac + UNIX ,或是加上 x64 選項。
  • 加上一些 enviironment variable (e.g. CGO_ENABLED=0)
  • 打 LDFLAGS 給 go build (e.g. -s -w -X main.build=)
  • 透過 hooks 來跑某一個 compile shell script (e.g. post: ./script.sh )

如果有以上相關的客製化選項,可能就需要將 GoReleaser config 獨立出來成一個檔案,相關做法如下:

主要修改就是透過 args: release -f .goreleaser.yml --rm-dist 來將設定透過 .goreleaser.yml 來跑。 這樣就等於 goreleaser release -f .goreleaser.yml --rm-dist的意思。

該檔案內容可以參考文件上面的檔案。

也可以參考 PR https://github.com/kkdai/disqus-to-github-issues-go/pull/4

結論與未來

透過引用到 external config file 的方式,來讓 Github Action 的 GoReleaser 可以有更多的客製化選項,其實不僅僅可以只打包,還有更多的方式可以使用 上傳檔案到其他的 Artifactory 或是 Docker build 。 這樣也可以讓打包產品上,變得更加的簡單方便。

相關文章:


Buy Me A Coffee

Evan

Attitude is everything