在 GitLab CI 中使用 Docker 構建 Go 項目
介紹
這篇文章是我在 CI 環境(特別是在 Gitlab 中)的 Docker 容器中構建 Go 項目的研究總結。我發現很難解決私有依賴問題(來自 Node/.NET 背景),因此這是我寫這篇文章的主要原因。如果 Docker 鏡像上存在任何問題或提交請求,請隨時與我們聯繫。
dep
由於 dep 是現在管理 Go 依賴關係的最佳選擇,因此在構建前之前運行 dep ensure
。
注意:我個人不會將我的 vendor/
文件夾提交到源碼控制,如果你這樣做,我不確定這個步驟是否可以跳過。
使用 Docker 構建的最好方法是使用 dep ensure -vendor-only
。 見這裡。
Docker 構建鏡像
我第一次嘗試使用 golang:1.10
,但這個鏡像沒有:
- curl
- git
- make
- dep
- golint
我已經創建好了用於構建的鏡像(github / dockerhub),我會保持更新,但我不提供任何擔保,因此你應該創建並管理自己的 Dockerhub。
內部依賴關係
我們完全有能力創建一個有公共依賴關係的項目。但是如果你的項目依賴於另一個私人 Gitlab 倉庫呢?
在本地運行 dep ensure
應該可以和你的 git 設置一起工作,但是一旦在 CI 上不適用,構建就會失敗。
Gitlab 許可權模型
這是在 Gitlab 8.12 中添加的,這個我們最關心的有用的功能是在構建期提供的 CI_JOB_TOKEN
環境變數。
這基本上意味著我們可以像這樣克隆依賴倉庫:
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.comnlogin gitlab-ci-tokennpassword ${CI_JOB_TOKEN}" > ~/.netrc
使用 .netrc
文件可以指定哪個憑證用於哪個伺服器。這種方法可以避免每次從 Git 中拉取(或推送)時輸入用戶名和密碼。密碼以明文形式存儲,因此你不應在自己的計算機上執行此操作。這實際用於 Git 在背後使用 cURL
。 在這裡閱讀更多。
項目文件
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.comnlogin gitlab-ci-tokennpassword ${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 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive