GitLab 10.1 に GitLab CI + GitLab Pages + Sphinx でドキュメントビルド環境を整える

Pocket

ユニキャストの野口です。
これは GitLab Advent Calendar 2017 の 12/2 の記事です。

GitLab Advent Calendar 2017 – Qiita

先日丁度定期メンテナンスで GitLab 10.1 になりました。

この記事でやること

基本的に GitLab CI を使いまくることが目的で、 Sphinx のドキュメントを作るのはおまけです。
Sphinx はエンジニア向けのドキュメント作成ツールで、具体的な使い方については

概要 — Sphinx 1.5.6 ドキュメント

に譲ります。

  1. GitLab の機能を使いまくる。
  2. GitLab CI を使ってみる。
  3. GitLab CI で Sphinx ドキュメントのビルドをまわす。

きっかけ

先日 GitLab Meetup Tokyo #5: GitLab 10リリース記念 に行ってきて、GitLab のアップグレードをお題に登壇させていただきました。
ご提供の皆様をはじめ、登壇の機会をいただきました運営の皆様、どうもありがとうございました。

GitLab Meetup Tokyo #5: GitLab 10リリース記念 – connpass

そのときみなさんの発表を聞いていて印象的だったのが、思いの外 GitLab CI みんなナチュラルに使ってるんだなあということでした。
数年前社内で運用していたとき GitLab 3 系のときとか CI の項目があったのを覚えていて、
そのときは社内でちょこちょこ運用している Jenkins があったので、必要性をあまり感じませんでした。

今 GitLab CI を改めてみてみたら見た目も動きもpushしたらコンテナ連携とか意外と良さそうじゃない、 Auto DevOps とか Prometheus とか Kubernetes(k8s) 連携とかすごい可能性を感じました。
というかみんなめっちゃ活用していてやっぱいろんな知らないこといっぱいあるなーやっぱ勉強になるなという気持ちで大都会日立市に帰ってきました。

GitLab いろいろ使ってやっていこうなというモチベーションを胸にいだいたのですが、
ただよし GitLab CI やるぞ!っていっても「よーしうちもビッグデータだ!」って言ってるだけになってしまうので、 Advent Calendar ネタ用にもなんかないか探してみました。
最近私はインフラエンジニアよりでだいぶアプリサイドから離れていたのであまり開発っぽいことはすぐに手は出せない。

そこで私は手近なものとして Sphinx のドキュメントのビルドを Jenkins に設定して自動化しているのだが、これ、 GitLab Pages も併せて使えばこれだけで完結できるのでは?
という着想を得ました。

Key Terms

  1. GitLab CI
  2. GitLab Runner
  3. Docker
  4. GitLab Pages
  5. GitLab Container Registry
  6. Sphinx

やること

  1. Docker をインストール
  2. GitLab CI を有効にする
  3. Sphinx ビルドをする .gitlab-ci.yml を作成する
  4. GitLab Pages を有効にする
  5. Container Registry を有効にして予めビルド済み Sphinx イメージを使うようにする

前提条件

  1. Ubuntu Server 16.04 LTS がベースです。
  2. 1 つの GitLab インスタンス内ですべて稼働させます。
  3. GitLab CI を入れるところからすべてを始めるので長いです。
  4. あなたが GitLab をいじくれる権力者であること
  5. Omnibus パッケージ版であること

Docker のインストール

  1. Install Docker | Docker Documentation
  2. Get Docker CE for Ubuntu | Docker Documentation
  3. Post-installation steps for Linux | Docker Documentation

先に Docker 入れる

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce
sudo docker run hello-world

一般ユーザでも docker コマンド使えるようにする

sudo usermod -aG docker $USER

ログインし直す。

$ docker run hello-world

GitLab CI を有効にする

  1. GitLab Continuous Integration (GitLab CI) – GitLab Documentation
  2. Install GitLab Runner using the official GitLab repositories – GitLab Documentation

GitLab Runner のインストール

GitLab CI を利用するに先だって CI を動かすサーバ上に GitLab Runner というのをいれる必要があります。
つまり Runner さえインストールすれば Windows でも Mac 上でも CI が動かせるということらしい。
すげえ。

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
[fred@localhost]$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
Detected operating system as Ubuntu/xenial.
Checking for curl...
Detected curl...
Running apt-get update... done.
Installing apt-transport-https... done.
Installing /etc/apt/sources.list.d/runner_gitlab-runner.list...done.
Importing packagecloud gpg key... done.
Running apt-get update... done.

The repository is setup! You can now install packages.

10.1 のバージョン指定でインストールする。

[fred@localhost]$ sudo apt-get install gitlab-runner="10.1.*"

GitLab Runner を GitLab に登録する

  1. Configuring GitLab Runners – GitLab Documentation
  2. Registering Runners – GitLab Documentation
[fred@localhost]$ sudo gitlab-runner register
Running in system-mode.

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.example.com/
Please enter the gitlab-ci token for this runner:
************************ ← GitLab 管理ページ上で入手した CI のトークンを入力する(コピペ)
Please enter the gitlab-ci description for this runner:
[localhost]: shared-runner
Please enter the gitlab-ci tags for this runner (comma separated):
shared-runner ←タグを入力する(なんでもよい?)
Whether to run untagged builds [true/false]:
[false]: true ← タグ付けされていないビルドを実行するか(今回は実験用なのでとりあえず true)
Whether to lock the Runner to current project [true/false]:
[true]: false ← プロジェクトのロックはしない(?)
Registering runner... succeeded                     runner=********
Please enter the executor: docker, docker-ssh, ssh, virtualbox, kubernetes, parallels, shell, docker+machine, docker-ssh+machine:
docker ← Docker コンテナを起動するのでこのように入力
Please enter the default Docker image (e.g. ruby:2.1):
alpine:latest ← デフォルトで起動されるイメージは Alpine Linux とする
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

Sphinx ビルドをする .gitlab-ci.yml を作成する

  1. Alpine Linux入門 -内部構造とapkでパッケージインストール編- · tehepero note(・ω<) 2.0

ここでは GitLab Runner と Docker を連携して ビルドします。
既存の Sphinx ドキュメントリポジトリがあると仮定して、以下のような .gitlab-ci.yml を作成します。
これをコミットして push すると Sphinx のドキュメントビルドが走ります。
public ディレクトリに成果物が保存されます。

image: alpine
pages:
  script:
  - apk --no-cache add py2-pip python-dev zlib jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev libxml2-dev libxslt-dev libffi-dev gcc musl-dev libgcc openssl-dev curl make
  - pip install sphinx
  - pip install sphinxcontrib-blockdiag sphinxcontrib-nwdiag sphinx_rtd_theme
  - make html
  - mv _build/html/ public/
  artifacts:
    paths:
    - public
  only:
  - master

ビルドが成功しました。

GitLab Pages を有効にする

  1. GitLab Pages documentation – GitLab Documentation
  2. GitLab Pages administration – GitLab Documentation

ビルドされた成果物は分かったはいいですが、どこかにデプロイされたわけでもなければテスト結果が見れるわけでもないので何も面白くありません。
そこで GitLab Pages を有効化します。
GitLab Pages は GitHub Pages と似たようなもので、プロジェクトに紐付いたリポジトリの静的ページをホストすることができるという意外とイカしたやつです。

DNS ゾーンの設定

ワイルドカードリソースレコードを設定します。

*.pages.example.local. 3600 IN A    172.16.0.123
$ sudo vim /etc/gitlab/gitlab.rb

下記あたりを編集します。
詳しくはドキュメント参照。
pages_nginx['listen_addresses'] の部分では listen するアドレスを限定して社内からしか見れないようにしています。

pages_external_url "http://pages.example.local/"
pages_nginx['listen_addresses'] = ['172.16.0.123']

そして

$ sudo gitlab-ctl reconfigure

これで使えるようになりました。
ちょっと変更して push してみてください。

ちゃんとビルドされて成果物も GitLab Pages で見えるようになりました。
グループが awesome-group プロジェクトが awsome-webapp という名前だったら

http://awesome-group.pages.example.local/awsome-webapp/

という URL で見れます。

Container Registry を有効にして予めビルド済み Sphinx イメージを使うようにする

  1. GitLab Container Registry administration – GitLab Documentation
  2. GitLab Container Registry – GitLab Documentation
  3. About Registry | Docker Documentation

ここまでで Alpine Linux の Docker イメージベースでコンテナを起動して Sphinx ドキュメントのビルドを行えるようになりました。
おわかりの方もいらっしゃると思いますが、毎回ビルドしていてはインターネットトラフィックも浪費しますし、コンピューティングリソースがもったいないです。

ネットワーク環境にも左右されますが、おおよそ 1 分~ 2 分、ひどいと 3 分弱かかります。

コンテナは起動したら Sphinx のビルドだけに集中してもらいたいものです。
ここでは GitLab Container Registry を有効化して予めビルド済みの Sphinx 入りのコンテナを起動するように変更してみます。

せっかくあるものは有効化しなきゃもったいないです。

GitLab Container Registry を有効化する

いくつかオプションがありますが、ここでは完全にセパレートした GitLab Container Registry 用のDNSリソースレコードを用意します。
特に理由のない限りはプライベートレジストリでも SSL を使用することが強く推奨されています。

gitlab-registry.example.com

FQDN で用意した SSL 証明書は /etc/gitlab/ssl/ に crt, key のペアを配置したら

/etc/gitlab/gitlab.rb

# registry_external_url 'https://registry.gitlab.example.com'
↓
registry_external_url 'https://gitlab-registry.example.com'

そして

sudo gitlab-ctl reconfigure

GitLab Container Registry を使う

  1. GitLab Container Registry – GitLab Documentation

Docker イメージを格納するプロジェクトを作成

これで有効化されたので心置きなく使うことができます。
まずは Internal または Public で使える Dockerfile を含んだプロジェクトを作成しましょう。
新しく作られるプロジェクトはデフォルトで有効になっています。
既存のリポジトリは設定ページから GitLab Container Registry 機能をプロジェクト単位で有効にする必要があります。

クライアント側の PC で Docker を入れてコンテナイメージをビルドします。
親切に手順が書いてあるので簡単なはずです。

GitLab にログインする

ログイン ID、パスワードで docker login できるはずです。
2 段階認証(2FA) を設定している場合にはパーソナルアクセストークンを取得する必要があります。

✘╹◡╹✘  src
% docker login gitlab-registry.example.com
Username: fred
Password:
Login Succeeded

YubiKey をバックアップキーまで登録して非常に意識が高い。

リポジトリクローン

✘╹◡╹✘  src
% git clone git@gitlab.example.com:awesome-docker-containers/sphinx.git
Cloning into 'sphinx'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
✘╹◡╹✘  src
% cd sphinx

Dockerfile 書く

Dockerfile はこんな感じです。
さっきの .gitlab-ci.yml から毎回やる必要のない処理を引っ張ってくる感じですね。
パッケージのインストールとか。

FROM alpine:latest

MAINTAINER Wataru NOGUCHI <fred@example.com>

RUN apk --no-cache add py2-pip python-dev zlib jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev libxml2-dev libxslt-dev libffi-dev gcc musl-dev libgcc openssl-dev curl make
RUN pip install sphinx
RUN pip install sphinxcontrib-blockdiag sphinxcontrib-nwdiag sphinx_rtd_theme

コミットして push します。

Sphinx コンテナイメージをビルドする

✘╹◡╹✘  sphinx git:(master) ✗
% docker build -t gitlab-registry.example.com/awesome-docker-containers/sphinx .
Sending build context to Docker daemon  32.77kB
Step 1/5 : FROM alpine:latest
latest: Pulling from library/alpine
b56ae66c2937: Pull complete
Digest: sha256:d6bfc3baf615dc9618209a8d607ba2a8103d9c8a405b3bd8741d88b4bef36478
Status: Downloaded newer image for alpine:latest
 ---> 053cde6e8953
Step 2/5 : MAINTAINER Wataru NOGUCHI <fred@example.com>
 ---> Running in caf8e85435ab
 ---> dc1431d35fca
Removing intermediate container caf8e85435ab
Step 3/5 : RUN apk --no-cache add py2-pip python-dev zlib jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev libxml2-dev libxslt-dev libffi-dev gcc musl-dev libgcc openssl-dev curl make
 ---> Running in 701747ba8b5c
fetch http://dl-cdn.alpinelinux.org/alpine/v3.6/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.6/community/x86_64/APKINDEX.tar.gz
(1/83) Installing ca-certificates (20161130-r2)
(2/83) Installing libssh2 (1.8.0-r1)
(3/83) Installing libcurl (7.56.1-r0)
(4/83) Installing curl (7.56.1-r0)
(5/83) Installing libbz2 (1.0.6-r5)
(6/83) Installing libpng (1.6.29-r1)
(7/83) Installing freetype (2.7.1-r1)
(8/83) Installing pkgconf (1.3.7-r0)
(9/83) Installing zlib-dev (1.2.11-r0)
(10/83) Installing libpng-dev (1.6.29-r1)
(11/83) Installing freetype-dev (2.7.1-r1)
(12/83) Installing binutils-libs (2.28-r3)
(13/83) Installing binutils (2.28-r3)
(14/83) Installing gmp (6.1.2-r0)
(15/83) Installing isl (0.17.1-r0)
(16/83) Installing libgomp (6.3.0-r4)
(17/83) Installing libatomic (6.3.0-r4)
(18/83) Installing libgcc (6.3.0-r4)
(19/83) Installing mpfr3 (3.1.5-r0)
(20/83) Installing mpc1 (1.0.3-r0)
(21/83) Installing libstdc++ (6.3.0-r4)
(22/83) Installing gcc (6.3.0-r4)
(snip)
(78/83) Installing expat-dev (2.2.0-r1)
(79/83) Installing fontconfig-dev (2.12.1-r0)
(80/83) Installing renderproto (0.11.1-r2)
(81/83) Installing libxrender-dev (0.9.10-r1)
(82/83) Installing libxft-dev (2.3.2-r1)
(83/83) Installing tk-dev (8.6.6-r1)
Executing busybox-1.26.2-r7.trigger
Executing ca-certificates-20161130-r2.trigger
OK: 222 MiB in 94 packages
 ---> 591352150a64
Removing intermediate container 701747ba8b5c
Step 4/5 : RUN pip install sphinx
 ---> Running in c8210db28cd4
Collecting sphinx
  Downloading Sphinx-1.6.5-py2.py3-none-any.whl (1.9MB)
Collecting snowballstemmer>=1.1 (from sphinx)
  Downloading snowballstemmer-1.2.1-py2.py3-none-any.whl (64kB)
Collecting alabaster<0.8,>=0.7 (from sphinx)
  Downloading alabaster-0.7.10-py2.py3-none-any.whl
Collecting Jinja2>=2.3 (from sphinx)
  Downloading Jinja2-2.10-py2.py3-none-any.whl (126kB)
Collecting imagesize (from sphinx)
  Downloading imagesize-0.7.1-py2.py3-none-any.whl
Requirement already satisfied: setuptools in /usr/lib/python2.7/site-packages (from sphinx)
(snip)
Collecting idna<2.7,>=2.5 (from requests>=2.0.0->sphinx)
  Downloading idna-2.6-py2.py3-none-any.whl (56kB)
Installing collected packages: snowballstemmer, alabaster, MarkupSafe, Jinja2, imagesize, pytz, babel, Pygments, docutils, chardet, certifi, urllib3, idna, requests, six, typing, sphinxcontrib-websupport, sphinx
  Running setup.py install for MarkupSafe: started
    Running setup.py install for MarkupSafe: finished with status 'done'
Successfully installed Jinja2-2.10 MarkupSafe-1.0 Pygments-2.2.0 alabaster-0.7.10 babel-2.5.1 certifi-2017.11.5 chardet-3.0.4 docutils-0.14 idna-2.6 imagesize-0.7.1 pytz-2017.3 requests-2.18.4 six-1.11.0 snowballstemmer-1.2.1 sphinx-1.6.5 sphinxcontrib-websupport-1.0.1 typing-3.6.2 urllib3-1.22
 ---> 7f742069dc3d
Removing intermediate container c8210db28cd4
Step 5/5 : RUN pip install sphinxcontrib-blockdiag sphinxcontrib-nwdiag
 ---> Running in 0c7de1c94836
Collecting sphinxcontrib-blockdiag
  Downloading sphinxcontrib_blockdiag-1.5.5-py2.py3-none-any.whl
Collecting sphinxcontrib-nwdiag
  Downloading sphinxcontrib_nwdiag-0.9.5-py2.py3-none-any.whl
Collecting blockdiag>=1.5.0 (from sphinxcontrib-blockdiag)
  Downloading blockdiag-1.5.3-py2.py3-none-any.whl (2.7MB)
Requirement already satisfied: Sphinx>=0.6 in /usr/lib/python2.7/site-packages (from sphinxcontrib-blockdiag)
Collecting nwdiag>=1.0.3 (from sphinxcontrib-nwdiag)
  Downloading nwdiag-1.0.4-py2.py3-none-any.whl (7.7MB)
Collecting funcparserlib (from blockdiag>=1.5.0->sphinxcontrib-blockdiag)
  Downloading funcparserlib-0.3.6.tar.gz
Requirement already satisfied: setuptools in /usr/lib/python2.7/site-packages (from blockdiag>=1.5.0->sphinxcontrib-blockdiag)
Collecting webcolors (from blockdiag>=1.5.0->sphinxcontrib-blockdiag)
  Downloading webcolors-1.7.tar.gz
Collecting Pillow (from blockdiag>=1.5.0->sphinxcontrib-blockdiag)
  Downloading Pillow-4.3.0.tar.gz (13.9MB)
(snip)
Requirement already satisfied: urllib3<1.23,>=1.21.1 in /usr/lib/python2.7/site-packages (from requests>=2.0.0->Sphinx>=0.6->sphinxcontrib-blockdiag)
Requirement already satisfied: idna<2.7,>=2.5 in /usr/lib/python2.7/site-packages (from requests>=2.0.0->Sphinx>=0.6->sphinxcontrib-blockdiag)
Installing collected packages: funcparserlib, webcolors, olefile, Pillow, blockdiag, sphinxcontrib-blockdiag, nwdiag, sphinxcontrib-nwdiag
  Running setup.py install for funcparserlib: started
    Running setup.py install for funcparserlib: finished with status 'done'
  Running setup.py install for webcolors: started
    Running setup.py install for webcolors: finished with status 'done'
  Running setup.py install for olefile: started
    Running setup.py install for olefile: finished with status 'done'
  Running setup.py install for Pillow: started
    Running setup.py install for Pillow: finished with status 'done'
Successfully installed Pillow-4.3.0 blockdiag-1.5.3 funcparserlib-0.3.6 nwdiag-1.0.4 olefile-0.44 sphinxcontrib-blockdiag-1.5.5 sphinxcontrib-nwdiag-0.9.5 webcolors-1.7
 ---> 5641233497d5
Removing intermediate container 0c7de1c94836
Successfully built 5641233497d5
Successfully tagged gitlab-registry.example.com/awesome-docker-containers/sphinx:latest

ビルド完了しました。

Sphinx コンテナイメージを push する

push 中

✘╹◡╹✘  sphinx git:(master) ✗
% docker push gitlab-registry.example.com/awesome-docker-containers/sphinx
The push refers to a repository [gitlab-registry.example.com/awesome-docker-containers/sphinx]
445b7e654755: Pushing [============>                                      ]  11.28MB/46.57MB
7b296506c4c1: Pushing [===========>                                       ]  13.23MB/57.94MB
728c4ffc3146: Pushing [===>                                               ]  14.67MB/206.9MB
2aebd096e0e2: Pushing [==================================================>]   4.22MB

push 完了

✘╹◡╹✘  sphinx git:(master) ✗
% docker push gitlab-registry.example.com/awesome-docker-containers/sphinx
The push refers to a repository [gitlab-registry.example.com/awesome-docker-containers/sphinx]
445b7e654755: Pushed
7b296506c4c1: Pushed
728c4ffc3146: Pushed
2aebd096e0e2: Pushed
latest: digest: sha256:47774baeff8bf701f2009a8f6bd46fc7a3adea838fdc2054ca67a853d8b08e76 size: 1164

みてみましょう。
いい感じですね。

Registry に登録したコンテナイメージを使ってビルドする

.gitlab-ci.yml を以下のように書き換えて push します。
スッキリしましたね。

image: gitlab-registry.example.com/awesome-docker-containers/sphinx:latest
pages:
  script:
  - make html
  - mv _build/html/ public/
  artifacts:
    paths:
    - public
  only:
  - master

1発目は内部的に pull するのでちょっと時間かかります。 53 秒ぐらい。

GitLab Runner のログ

Running with gitlab-runner 10.1.0 (c1ecf97f)
  on shared-runner (9b02294c)
Using Docker executor with image gitlab-registry.example.com/awesome-docker-containers/sphinx:latest ...
Using docker image sha256:516181c16fd5bb958bebca78527007938e83379bfc42128fecf5e8e9a91bd910 for predefined container...
Pulling docker image gitlab-registry.example.com/awesome-docker-containers/sphinx:latest ...
Using docker image gitlab-registry.example.com/awesome-docker-containers/sphinx:latest ID=sha256:5641233497d5fac8f76beb1293f8abd1604a1fbf55bbc97cfae6fac0b72a1979 for build container...
Running on runner-9b02294c-project-718-concurrent-0 via localhost...
Cloning repository...
Cloning into '/builds/example-com/doc-sphinx'...
Checking out 888dce2f as master...
Skipping Git submodules setup
$ make html
sphinx-build -b html -d _build/doctrees   . _build/html
Running Sphinx v1.6.5
making output directory...
loading translations [ja]... done
loading pickled environment... not yet created
building [mo]: targets for 0 po files that are out of date
building [html]: targets for 9 source files that are out of date
updating environment: 9 added, 0 changed, 0 removed
reading sources... [100%] test/scenario

looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
writing output... [100%] test/scenario

generating indices... genindex
writing additional pages... search
copying static files... WARNING: html_static_path entry u'/builds/example-com/doc-sphinx/_static' does not exist
done
copying extra files... done
dumping search index in Japanese (code: ja) ... done
dumping object inventory... done
build succeeded, 1 warning.

Build finished. The HTML pages are in _build/html.
$ mv _build/html/ public/
Uploading artifacts...
public: found 62 matching files
Uploading artifacts to coordinator... ok            id=39 responseStatus=201 Created token=2L8xFLwA
Job succeeded

1 発目以降は runner 内にあるのでロバストにほぼ 34 秒で終わりました。

Running with gitlab-runner 10.1.0 (c1ecf97f)
  on shared-runner (9b02294c)
Using Docker executor with image gitlab-registry.example.com/awesome-docker-containers/sphinx:latest ...
Using docker image sha256:516181c16fd5bb958bebca78527007938e83379bfc42128fecf5e8e9a91bd910 for predefined container...
Pulling docker image gitlab-registry.example.com/awesome-docker-containers/sphinx:latest ...
Using docker image gitlab-registry.example.com/awesome-docker-containers/sphinx:latest ID=sha256:5641233497d5fac8f76beb1293f8abd1604a1fbf55bbc97cfae6fac0b72a1979 for build container...
Running on runner-9b02294c-project-692-concurrent-0 via localhost...
Fetching changes...
Removing _build/
Removing public/
HEAD is now at 2759b8a Link scenario test.
From https://gitlab.example.com/example-com/doc-sphinx
   2759b8a..8a12b57  master     -> origin/master
Checking out 8a12b574 as master...
Skipping Git submodules setup
$ make html
sphinx-build -b html -d _build/doctrees   . _build/html
Running Sphinx v1.6.5
making output directory...
loading translations [ja]... done
loading pickled environment... not yet created
building [mo]: targets for 0 po files that are out of date
building [html]: targets for 30 source files that are out of date
updating environment: 30 added, 0 changed, 0 removed
reading sources... [  3%] bcp/design/architecture/index

課題

まだできていないこと。

GitLab に push したら自動的にコンテナイメージをビルドするようにしたい

  1. Using Docker Build – GitLab Documentation

以下は中途半端なエラーで終わってます。

.gitlab-ci.yml

services:
  - docker:dind

variables:
  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME

before_script:
  - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY

build:
  stage: build
  script:
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG
Running with gitlab-runner 10.1.0 (c1ecf97f)
  on shared-runner (9b02294c)
Using Docker executor with image alpine:latest ...
Starting service docker:dind ...
Pulling docker image docker:dind ...
Using docker image docker:dind ID=sha256:2b5312e84355e6e50dd36c61663df237e8f0431f5af003710a7b3d10cd73b6bc for docker service...
Waiting for services to be up and running...

*** WARNING: Service runner-9b02294c-project-719-concurrent-0-docker-0 probably didn't start properly.

Error response from daemon: Cannot link to a non running container: /runner-9b02294c-project-719-concurrent-0-docker-0 AS /runner-9b02294c-project-719-concurrent-0-docker-0-wait-for-service/runner-9b02294c-project-719-concurrent-0-docker-0

2017-11-28T06:27:23.409564422Z mount: permission denied (are you root?)
2017-11-28T06:27:23.409716801Z Could not mount /sys/kernel/security.
2017-11-28T06:27:23.409741817Z AppArmor detection and --privileged mode might break.
2017-11-28T06:27:23.468673591Z mount: permission denied (are you root?)

*********

Using docker image sha256:516181c16fd5bb958bebca78527007938e83379bfc42128fecf5e8e9a91bd910 for predefined container...
Pulling docker image alpine:latest ...
Using docker image alpine:latest ID=sha256:053cde6e8953ebd834df8f6382e68be83adb39bfc063e40b0fc61b4b333938f1 for build container...
Running on runner-9b02294c-project-719-concurrent-0 via localhost...
Cloning repository...
Cloning into '/builds/awesome-docker-containers/sphinx'...
Checking out d8ec2182 as master...
Skipping Git submodules setup
$ docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
/bin/sh: eval: line 51: docker: not found
ERROR: Job failed: exit code 127

蛇足

こないだのスライドです。
よかったら読んで下さい!
Omnibus パッケージ版はHA構成もいけるということを予めお断りしておきます。

最後に

以上、長々と書きましたが GitLab CI を入れるととても便利だし、 GitLab の可能性は無限大だなと感じました。
ユニキャストでは一緒に働ける仲間を募集しています。
それではみなさんハッピー GitLab !

投稿者紹介

Wataru Noguchi
* Bio: Software Engineer, Network and Server Engineer
* Certification:
IPA: FE, AP, Network Specialist
Cisco: CCNA R&S, CCNP R&S
LPI: LPIC Level1, Level2, LPIC-3 Specialty LPI-304 Virtualization &High Availability

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください