GitLab CI で Go プロジェクトをビルドする

以前のブログ記事、Glide を使用した Go の依存関係管理では、Glide を使った依存関係管理を解説するためにシンプルな Go プロジェクトを使用しました。この記事では GitLab CI でプロジェクトをビルドしてみましょう。

はじめに

$GOPATH 以下に新しいプロジェクトを作成し、glide-example からすべてのファイルをコピーしておきました。含まれているものは以下の五つです。

  • .gitignore
  • glide.lock
  • glide.yaml
  • README.md(任意)
  • vendor/

ローカルでビルドして実行できることを確かめておきましょう。

パイプラインをセットアップしよう

以下のパイプラインファイルをプロジェクトのルートフォルダに追加するところからスタートしましょう。

.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 ファイルを gitlab にコミットしてプッシュしたら、 pipeline job をチェックします。

ビルドに失敗しました!

ビルドに失敗しました!

このエラーはビルドがベンダーパッケージを見つけることができなかったことを示しています。GitLab CI ジョブのプロジェクトチェックアウトパスが /builds/ykyuen/gitlab-ci-go-build で、$GOPATH の下になかったことが原因です。

ソリューション

ビルドエラーを修正するには、プロジェクトが $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

コミットしてプッシュし、 pipeline job を再度試します。

成功するビルド!

成功するビルド!

まとめ

  • Go プロジェクトは常に $GOPATH 以下になければいけない。
  • vendor のフォルダを確認すれば、glide install コマンドを実行する必要がなくなり、パイプラインを簡略化できる。