前言:
在二月份文章有提到 使用 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 。 這樣也可以讓打包產品上,變得更加的簡單方便。