うさラボ

お勉強と備忘録

GitlabRunnerインストールしてGitlabCIを始める

この記事はGitLab Advent Calendar 2021の10日目の記事です

qiita.com

やりたかったこと

自動化関連の仕事を始めて、
AnsibleのPlaybookを管理するのにGitlabを利用することが増えてきました。
ただ、GitlabCIはあまり利用できていなかったので、勉強もかねて構築してみました。

環境

サーバ(AWSで構築)

Gitlab

  • gitlab/gitlab-ee: 14.4.2-ee
  • gitlab/gitlab-runner: 14.4.0

サーバーにGitlabのみ構築している状態です。
f:id:usage_automate:20211210091214p:plain

GitlabRunnerインストール

GitlabRunnerをインストールします。 公式ドキュメントを参考にdocker runを実施します。

# docker run -d --name gitlab-runner --restart always \
>      -v /srv/gitlab-runner/config:/etc/gitlab-runner \
>      -v /var/run/docker.sock:/var/run/docker.sock \
>      gitlab/gitlab-runner:latest

起動していることの確認

docker ps
CONTAINER ID   IMAGE                                 COMMAND                    CREATED        STATUS                    PORTS                       NAMES
23e7207ac5a8   gitlab/gitlab-runner:latest   "/usr/bin/dumb-init …"   3 weeks ago   Up 34 minutes                                         gitlab-runner

GitlabRunner登録

続いて、GitlabRunnerをGitlabに登録します。
f:id:usage_automate:20211210091647p:plain

事前にGitlab側でトークンを確認します。
管理者エリアのrunnerの設定にトークンが記載されています。

f:id:usage_automate:20211210085650p:plain

docker runコマンドでGitlab RunnerからGitlabへの登録を実施します。
登録時に、runner名やタイプ(docker,shellなど)、Dockerの場合は利用するImageなどを対話形式で入力します。 ★がついてるものが入力したもの (コマンド実行時にオプションで指定することもできるようです。)

# docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=7 revision=4b9e985a version=14.4.0
Running in system-mode.                            
                                                   
Enter the GitLab instance URL (for example, https://gitlab.com/):
http://XXXXXXXXXXX ★
Enter the registration token:
XXXXXXXXXXXXXXXXXX ★
Enter a description for the runner:
[fa6965628a91]: 
Enter tags for the runner (comma-separated):

Registering runner... succeeded                     runner=KxYfjwgb
Enter an executor: custom, docker, docker-ssh, shell, docker+machine, docker-ssh+machine, parallels, ssh, virtualbox, kubernetes:
docker ★
Enter the default Docker image (for example, ruby:2.6):
ubuntu ★
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 

successfullyが表示され登録が完了すると、Gitlabの管理者エリアのRunnerの設定(トークンを確認したページ)にRunnerが表示されます。 f:id:usage_automate:20211210085712p:plain

Runnerをクリックして、利用するプロジェクトを設定します。 f:id:usage_automate:20211210085817p:plain

有効化後 f:id:usage_automate:20211210085845p:plain

Gitlab runner設定変更

Runnerの登録が完了しましたが、このままCIを実行すると失敗してしまいます。 CIをするコンテナ(CIコンテナ)からGitlabのExternal IPへアクセスできないことが原因でした。 f:id:usage_automate:20211210090832p:plain

runnerの設定ファイルを編集します。

# cd /srv/gitlab-runner/config
# cp config.toml config.toml .org
# vi config.toml

clone_urlとpull_policyの設定を追加しました。
clone_urlは文字通りcloneする際に利用するurlになります。今回はこちらを内部IPに変更しました。
pull_policyはneverにすることでローカルのイメージを利用できます。

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "fa6965628a91"
  url = "http://XXXXXXXXXXXXX"
  token = "XXXXXXXXXXXXXXX"
  executor = "docker"
  clone_url = "http://YYYYYYYY" ★追記
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "ubuntu"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
    pull_policy = "never" ★追記

これでRunnerの設定は完了です。cloneも問題なくできるようになりました。 f:id:usage_automate:20211210090403p:plain

Dockerイメージの作成

ここからはDockerのイメージを作成し、GitlabCIを動かしてみます。

下記Dockerfileを用意したのでビルドします。

FROM ubuntu
RUN apt-get update -y
RUN apt-get install python-pip -y
RUN pip install ansible-core
RUN pip install ansible-lint
RUN pip install yamllint

ビルドのログ

# docker build . -t test_image
Sending build context to Docker daemon   25.6kB
Step 1/6 : FROM ubuntu
 ---> ba6acccedd29
Step 2/6 : RUN apt-get update -y
 ---> Using cache
~snip~
Successfully built fe72d7eaaf20
Successfully tagged test_image:latest

# docker images
REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
test_image             latest    fe72d7eaaf20   10 seconds ago   473MB
~ snip ~

ビルドが完了しローカルにDockerイメージがあることを確認出来たらgitlabにアップするリポジトリ内に.gitlan-ci.ymlを書いていきます。
.gitlab-ci.ymlはテストの内容を記載したYamlファイルです、stageなどを利用し分割したり条件分岐させたりすることも可能なようです。

.gitlab-ci.yml

image: test_image

stages:
  - lint

lint-job:
  stage: lint
  script:
    - echo "$GITLAB_USER_LOGIN!"

準備が完了したので、gitlabのプロジェクトを更新しCIが動くかを確認します。

f:id:usage_automate:20211210093810p:plain

プロジェクト -> CI/CD -> パイプラインを確認し、ステータスが成功し処理が動いていることを確認できました。

ちなみに、config.tomlでclone_urlの設定をしていないとExternal_IPにアクセスして失敗しているログは以下です。 f:id:usage_automate:20211210094316p:plain

clone_urlの設定見つけるまで時間がかかってしまって苦労しました・・
(そもそもちゃんとexternal_ipの設定をちゃんとしていないのも悪い)

まとめ

GitlabCIを動かしてみる!といった入門的な内容でしたが、それなりに苦労しました。
そもそも、GitlabRunnerはコンテナでさらにCIを動かす別のコンテナがあることも理解ができていなかったですが、作ってみることで少しは理解できたかなぁといったところです。

参考にさせていただいたサイト

今見るとやってることほぼ参考にさせてもらってる神ブログ

zaki-hmkc.hatenablog.com

公式ドキュメント

docs.gitlab.com

docs.gitlab.com