在 GitLab CI 編譯 Go 項目

在之前的文章 - 使用 Glide 管理 Go 套件中,我們示範了一個簡單的 Glide 例子,本篇將會以它為基礎來看看如何在 GitLab CI 編譯一個 Go 項目。

開始之前

我已在 $GOPATH 下創建了一個新項目,並從 glide-example 複製所有文件到該文件夾。當中包括:

  • .gitignore
  • glide.lock
  • glide.yaml
  • README.md (非必須的)
  • vendor/

先確認能夠它們能夠在本地編譯和運行。

設置持續整合管道

在項目的根文件夾新增一個 .gitlab-ci.yaml

.gitlab-ci.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
stages:
  - build

build:
  stage: build
  image: golang:1.9.2
  before_script:
  script:
    # Compile and name the binary as `hello`
    - go build -o hello
    # Execute the binary
    - ./hello

將這個新的 .gitlab-ci.yaml 文件 commitpush 到 gitlab。然後檢查被觸發管道的狀態

構建失敗!

構建失敗!

該錯誤顯示在編譯時找不到所需套件的路徑。這是因為 GitLab CI 把該項目放置在 /builds/ykyuen/gitlab-ci-go-build 而該路徑並不在 $GOPATH 之下

解決方案

為了解決編譯錯誤,我們必須確保項目被放於 $GOPATH 下。這可以透過在開始編譯之前創建一個 symbolic link(符號連結)來把項目的根文件夾掛到 $GOPATH 。以下是更改後的 .gitlab-ci.yaml

.gitlab-ci.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
stages:
  - build

build:
  stage: build
  image: golang:1.9.2
  before_script:
    # Create a symbolic link under $GOPATH, this is needed for local build
    # i.e. /go/src/gitlab.com/ykyuen/gitlab-ci-go-build
    - 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
  script:
    # Compile and name the binary as `hello`
    - go build -o hello
    # Execute the binary
    - ./hello

把更改 push 到 gitlab 並再次檢查管道狀態

編譯成功!

編譯成功!

Summary

  • Go 項目文件夾總是要置於 $GOPATH 下。
  • vendor 文件夾放到代碼庫可以省去安裝和執行 glide install 這個動作。