Gitlab-CI で自動ビルドしよう。

Gitlab-CI

Gitlab-CI とは

gitlab.com についてくるサービスです。
特に追加料金等は発生せずに、無料で利用することができます。
何かしらの登録作業も必要ありません。

用意するのは、.gitlab-ci.yml というファイルだけ。

Gitlab-CI を活用すると、
git push したあとや、タグを付けたタイミングで自動で設定したビルドスクリプトを実行してくれます。

実行環境は、もちろんGitlabが用意してくれていて、GitLab Runner と呼ばれています。
いろんな形式がありますが、Dockerイメージを利用するのが良いでしょう。

自動ビルド

ビルドといっても実際には、自分の好きなスクリプトを実行する事が出来るので、
ユニットテストだとか、その他の使い方にも利用出来ます。

ざっくり言うと、CIサーバー上で、特定のコマンドが実行できる。
しかも、変更に合わせて自動に、という事です。

成果物 (アーティファクト)

ビルドスクリプト等で出来た成果物はアーティファクトという形で、gitlab上に保存されます。
コミットIDや、ブランチ、タグなどに紐付いて管理され、いつでもダウンロードする事が可能になります。

配布して利用してもらうようなものであれば、
git clone してから、ビルドコマンド叩いてねとかお願いしなくても
使ってもらう時に既にビルド済みのアーティファクトをダウンロードして使ってね。と言って済ませる事ができます。

ダウンロード > artifacts というところからダウンロードする事ができる。

CI設定

gitlab.com のリポジトリトップにアクセスすると、CIを設定というボタンがあるんですが、
これをポチると、.gitlab-ci.yml というファイルの追加画面になります。

Apply a GitLab CI Yaml template から、プロジェクトにあわせたテンプレートを選択することができます。

ある程度の意味は理解しておかないといけないですが、
ここを必要に応じてちょいと書き換えるだけで設定できます。

テンプレート

Go言語用のテンプレートはこんな感じになっています。

# This file is a template, and might need editing before it works on your project.
image: golang:latest

variables:
  # Please edit to your GitLab project
  REPO_NAME: gitlab.com/namespace/project

# The problem is that to be able to use go get, one needs to put
# the repository in the $GOPATH. So for example if your gitlab domain
# is gitlab.com, and that your repository is namespace/project, and
# the default GOPATH being /go, then you'd need to have your
# repository in /go/src/gitlab.com/namespace/project
# Thus, making a symbolic link corrects this.
before_script:
  - mkdir -p $GOPATH/src/$(dirname $REPO_NAME)
  - ln -svf $CI_PROJECT_DIR $GOPATH/src/$REPO_NAME
  - cd $GOPATH/src/$REPO_NAME

stages:
    - test
    - build

format:
    stage: test
    script:
      - go fmt $(go list ./... | grep -v /vendor/)
      - go vet $(go list ./... | grep -v /vendor/)
      - go test -race $(go list ./... | grep -v /vendor/)

compile:
    stage: build
    script:
      - go build -race -ldflags "-extldflags '-static'" -o $CI_PROJECT_DIR/mybinary
    artifacts:
      paths:
        - mybinary

サンプル

先程のテンプレートを元に、自分が設定した内容はこちら。
ほとんどコメントを削除して、最後に実行するコマンドを変更したくらいです。

実際のビルドコマンドは、プロジェクト側にビルドスクリプトを用意しておいて、
CI設定にはそれをコールするだけにしておけば、柔軟に対応できるようになります。

image: golang:1.9

variables:
  REPO_NAME: gitlab.com/tyabuta/go-excel-sheets

before_script:
  - mkdir -p $GOPATH/src/$(dirname $REPO_NAME)
  - ln -svf $CI_PROJECT_DIR $GOPATH/src/$REPO_NAME
  - cd $GOPATH/src/$REPO_NAME
  - make dep

stages:
    - build

compile:
    stage: build
    script:
      - make build-all
    artifacts:
      paths:
        - bin/

用語解説

用語 説明
image dockerイメージ
variables 実行時の環境変数を設定できる
before_script 実行環境構築時に必ず一回行われる処理
stages 自分ですきなステージを定義できる
job ステージに紐づくジョブ、scriptにコマンドを列挙していく
artifacts 成果物として扱われる

image
実行環境は、dockerイメージを使用する事ができるので、
自分で自作したDockerイメージをDockerHubにあげておいて使用する事もできるみたい。

このコンテナ上で、実行される事になる。
Go言語なら、golangというイメージを使えばOKだ。

stages 自分で好きなステージを定義できる
複数ある場合は、上から順に実行される事になるのかな?

artifacts に指定したディレクトリやファイルが成果物としてダウンロードできるようになります。

おしまい

git push とか、タグをつけたりすると、
CIのPipeline画面で設定したDockerコンテナが起動してビルドスクリプトが実行されているのが見れるかと思います。

このGitlab-CI、無料で使えるところがすごくないですか??
しかも、ビルドに失敗した場合、メールで通知がくるんです!!笑

Github にも無料で使えるCIとかあるのかな??
無いような気がするんですが、
やっぱり個人リポジトリは全部gitlab.com に移していっても良さそうです。

コメントを残す