歡迎光臨
每天分享高質量文章

在 GitLab CI 中使用 Docker 構建 Go 專案 | Linux 中國

這篇文章是我在 CI 環境(特別是在 Gitlab 中)的 Docker 容器中構建 Go 專案的研究總結。我發現很難解決私有依賴問題(來自 Node/.NET 背景),因此這是我寫這篇文章的主要原因。
— Sean Drumm


致謝
編譯自 | https://seandrumm.co.uk/blog/building-go-projects-with-docker-on-gitlab-ci/ 
 作者 | 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,但這個映象沒有:

◈ curl
◈ git
◈ make
◈ dep
◈ golint

我已經建立好了用於構建的映象(github[2] / dockerhub[3]),我會保持更新,但我不提供任何擔保,因此你應該建立並管理自己的 Dockerhub。

內部依賴關係

我們完全有能力建立一個有公共依賴關係的專案。但是如果你的專案依賴於另一個私人 Gitlab 倉庫呢?

在本地執行 dep ensure 應該可以和你的 git 設定一起工作,但是一旦在 CI 上不適用,構建就會失敗。

Gitlab 許可權模型

這是在 Gitlab 8.12 中新增的[4],這個我們最關心的有用的功能是在構建期提供的 CI_JOB_TOKEN 環境變數。

這基本上意味著我們可以像這樣克隆依賴倉庫[5]

  1. git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/myuser/mydependentrepo

然而,我們希望使這更友好一點,因為 dep 在試圖拉取程式碼時不會奇跡般地新增憑據。

我們將把這一行新增到 .gitlab-ci.yml 的 before_script 部分。

  1. before_script:

  2.  - echo -e "machine gitlab.com\nlogin gitlab-ci-token\npassword ${CI_JOB_TOKEN}" > ~/.netrc

使用 .netrc 檔案可以指定哪個憑證用於哪個伺服器。這種方法可以避免每次從 Git 中拉取(或推送)時輸入使用者名稱和密碼。密碼以明文形式儲存,因此你不應在自己的計算機上執行此操作。這實際用於 Git 在背後使用  cURL。 在這裡閱讀更多[6]

專案檔案

Makefile

雖然這是可選的,但我發現它使事情變得更容易。

配置這些步驟意味著在 CI 指令碼(和本地)中,我們可以執行 make lintmake build等,而無需每次重覆步驟。

  1. GOFILES = $(shell find . -name '*.go' -not -path './vendor/*')

  2. GOPACKAGES = $(shell go list ./...  | grep -v /vendor/)

  3. default: build

  4. workdir:

  5.    mkdir -p workdir

  6. build: workdir/scraper

  7. workdir/scraper: $(GOFILES)

  8.    GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o workdir/scraper .

  9. test: test-all

  10. test-all:

  11.    @go test -v $(GOPACKAGES)

  12. lint: lint-all

  13. lint-all:

  14.    @golint -set_exit_status $(GOPACKAGES)

.gitlab-ci.yml

這是 Gitlab CI 魔術發生的地方。你可能想使用自己的映象。

  1. image: sjdweb/go-docker-build:1.10

  2. stages:

  3.  - test

  4.  - build

  5. before_script:

  6.  - cd $GOPATH/src

  7.  - mkdir -p gitlab.com/$CI_PROJECT_NAMESPACE

  8.  - cd gitlab.com/$CI_PROJECT_NAMESPACE

  9.  - ln -s $CI_PROJECT_DIR

  10.  - cd $CI_PROJECT_NAME

  11.  - echo -e "machine gitlab.com\nlogin gitlab-ci-token\npassword ${CI_JOB_TOKEN}" > ~/.netrc

  12.  - dep ensure -vendor-only

  13. lint_code:

  14.  stage: test

  15.  script:

  16.    - make lint

  17. unit_tests:

  18.  stage: test

  19.  script:

  20.    - make test

  21. build:

  22.  stage: build

  23.  script:

  24.    - make

缺少了什麼

我通常會用我的二進位制檔案構建 Docker 映象,並將其推送到 Gitlab 容器註冊庫中。

你可以看到我正在構建二進位制檔案並退出,你至少需要將該二進位制檔案(例如生成檔案)儲存在某處。


via: https://seandrumm.co.uk/blog/building-go-projects-with-docker-on-gitlab-ci/

作者:SEAN DRUMM[8] 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

贊(0)

分享創造快樂

© 2024 知識星球   網站地圖