作者 | Sean Drumm
譯者 | geekpi ? ? 共計翻譯:712 篇 貢獻時間:1658 天
介紹
這篇文章是我在 CI 環境(特別是在 Gitlab 中)的 Docker 容器中構建 Go 專案的研究總結。我發現很難解決私有依賴問題(來自 Node/.NET 背景),因此這是我寫這篇文章的主要原因。如果 Docker 映象上存在任何問題或提交請求,請隨時與我們聯絡。
dep
由於 dep 是現在管理 Go 依賴關係的最佳選擇,因此在構建前之前執行 dep ensure
。
註意:我個人不會將我的 vendor/
檔案夾提交到原始碼控制,如果你這樣做,我不確定這個步驟是否可以跳過。
使用 Docker 構建的最好方法是使用 dep ensure -vendor-only
。 見這裡[1]。
Docker 構建映象
我第一次嘗試使用 golang:1.10
,但這個映象沒有:
我已經建立好了用於構建的映象(github[2] / dockerhub[3]),我會保持更新,但我不提供任何擔保,因此你應該建立並管理自己的 Dockerhub。
內部依賴關係
我們完全有能力建立一個有公共依賴關係的專案。但是如果你的專案依賴於另一個私人 Gitlab 倉庫呢?
在本地執行 dep ensure
應該可以和你的 git 設定一起工作,但是一旦在 CI 上不適用,構建就會失敗。
Gitlab 許可權模型
這是在 Gitlab 8.12 中新增的[4],這個我們最關心的有用的功能是在構建期提供的 CI_JOB_TOKEN
環境變數。
這基本上意味著我們可以像這樣克隆依賴倉庫[5]:
git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/myuser/mydependentrepo
然而,我們希望使這更友好一點,因為 dep
在試圖拉取程式碼時不會奇跡般地新增憑據。
我們將把這一行新增到 .gitlab-ci.yml
的 before_script
部分。
before_script:
- echo -e "machine gitlab.com\nlogin gitlab-ci-token\npassword ${CI_JOB_TOKEN}" > ~/.netrc
使用 .netrc
檔案可以指定哪個憑證用於哪個伺服器。這種方法可以避免每次從 Git 中拉取(或推送)時輸入使用者名稱和密碼。密碼以明文形式儲存,因此你不應在自己的計算機上執行此操作。這實際用於 Git 在背後使用 cURL
。 在這裡閱讀更多[6]。
專案檔案
Makefile
雖然這是可選的,但我發現它使事情變得更容易。
配置這些步驟意味著在 CI 指令碼(和本地)中,我們可以執行 make lint
、make build
等,而無需每次重覆步驟。
GOFILES = $(shell find . -name '*.go' -not -path './vendor/*')
GOPACKAGES = $(shell go list ./... | grep -v /vendor/)
default: build
workdir:
mkdir -p workdir
build: workdir/scraper
workdir/scraper: $(GOFILES)
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o workdir/scraper .
test: test-all
test-all:
@go test -v $(GOPACKAGES)
lint: lint-all
lint-all:
@golint -set_exit_status $(GOPACKAGES)
.gitlab-ci.yml
這是 Gitlab CI 魔術發生的地方。你可能想使用自己的映象。
image: sjdweb/go-docker-build:1.10
stages:
- test
- build
before_script:
- cd $GOPATH/src
- mkdir -p gitlab.com/$CI_PROJECT_NAMESPACE
- cd gitlab.com/$CI_PROJECT_NAMESPACE
- ln -s $CI_PROJECT_DIR
- cd $CI_PROJECT_NAME
- echo -e "machine gitlab.com\nlogin gitlab-ci-token\npassword ${CI_JOB_TOKEN}" > ~/.netrc
- dep ensure -vendor-only
lint_code:
stage: test
script:
- make lint
unit_tests:
stage: test
script:
- make test
build:
stage: build
script:
- make
缺少了什麼
我通常會用我的二進位制檔案構建 Docker 映象,並將其推送到 Gitlab 容器註冊庫中。
你可以看到我正在構建二進位制檔案並退出,你至少需要將該二進位制檔案(例如生成檔案)儲存在某處。
via: https://seandrumm.co.uk/blog/building-go-projects-with-docker-on-gitlab-ci/
作者:SEAN DRUMM[8] 譯者:geekpi 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出