GitlabRunnerインストールしてGitlabCIを始める
この記事はGitLab Advent Calendar 2021の10日目の記事です
やりたかったこと
自動化関連の仕事を始めて、
AnsibleのPlaybookを管理するのにGitlabを利用することが増えてきました。
ただ、GitlabCIはあまり利用できていなかったので、勉強もかねて構築してみました。
環境
サーバ(AWSで構築)
- Ubuntu 20.04.3 LTS
- t2.large
Gitlab
- gitlab/gitlab-ee:
14.4.2-ee
- gitlab/gitlab-runner:
14.4.0
サーバーにGitlabのみ構築している状態です。
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に登録します。
事前にGitlab側でトークンを確認します。
管理者エリアのrunnerの設定にトークンが記載されています。
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が表示されます。
Runnerをクリックして、利用するプロジェクトを設定します。
有効化後
Gitlab runner設定変更
Runnerの登録が完了しましたが、このままCIを実行すると失敗してしまいます。 CIをするコンテナ(CIコンテナ)からGitlabのExternal IPへアクセスできないことが原因でした。
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も問題なくできるようになりました。
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が動くかを確認します。
プロジェクト -> CI/CD -> パイプラインを確認し、ステータスが成功し処理が動いていることを確認できました。
ちなみに、config.toml
でclone_urlの設定をしていないとExternal_IPにアクセスして失敗しているログは以下です。
clone_urlの設定見つけるまで時間がかかってしまって苦労しました・・
(そもそもちゃんとexternal_ipの設定をちゃんとしていないのも悪い)
まとめ
GitlabCIを動かしてみる!といった入門的な内容でしたが、それなりに苦労しました。
そもそも、GitlabRunnerはコンテナでさらにCIを動かす別のコンテナがあることも理解ができていなかったですが、作ってみることで少しは理解できたかなぁといったところです。
参考にさせていただいたサイト
今見るとやってることほぼ参考にさせてもらってる神ブログ
公式ドキュメント