Linux中國

在 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.ymlbefore_script 部分。

before_script:
  - echo -e "machine gitlab.comnlogin gitlab-ci-tokennpassword ${CI_JOB_TOKEN}" > ~/.netrc

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

項目文件

Makefile

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

配置這些步驟意味著在 CI 腳本(和本地)中,我們可以運行 make lintmake 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

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


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國