【Gitlab】gitlab-runnerを構築してCI/CDを動かす

# はじめに
オンプレミスで構築したGitlab環境からCI/CDを動かして、Ansibleを自動化してみたくなったので、gitlab-runnerを導入してみました。
本記事では、gitlab-runner実行環境の構築～GitlabのCI/CD設定までの手順をご紹介します。

※gitlab-runnerとは、Gitlab上でコードを実行する際に使用する実行環境です。
　詳しくは[GitLab Runnerで始める継続的インテグレーション](https://www.fujitsu.com/jp/products/software/resources/feature-stories/cloud/gitlab-runner-cicd/#:~:text=GitLab%20Runner%20%E3%81%AF%E3%80%81GitLab%20CI,%E6%A9%9F%E8%83%BD%E3%82%92%E6%8C%81%E3%81%A4%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%A7%E3%81%99%E3%80%82)等の記事をご確認ください。

# 1. 環境イメージ
構築する環境のイメージは以下の通りです
1. Gitlabにコードをpushする
1. Gitlabでmaster(main)ブランチにコードをマージする
1. Gitlabがgitlab-runnerに指示
1. gitlab-runnerがansibleコードを実行し、リモートサーバに対して設定を行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698496/1d8c7e25-988a-f0a2-76b9-88a03b990182.png)

# 2. 開発環境
VirtualBoxを使用した仮想環境で構築しております
※パッケージについては、主要なもののみ記載し、依存パッケージについては省略しています
- ホストOS
    - Windows 11
- 仮想化ソフトウェア
    - VirtualBox（7.0.8 r156879）
- ゲストOS
    - Ubuntu 24.04 #Gitlab
        - Gitlab 17.4
    - Ubuntu 24.04 #Docker
        - docker 27.1.2
            - Ubuntu 24.04 #Docker container
                - gitlab-runner 17.3.0
                - ansible-core 2.17.3

# 3. Dockerサーバ構築
gitlab-runnerはdockerコンテナで構築する方法を採用したため、まずはdockerサーバを構築します
OSはUbuntuを採用しました
※gitlab-runnerの公式リポジトリで公開されているDockerfileがUbuntu、almalinux、ubi-fipsの三つだったため、Gitlabサーバと同じOSのUbuntuを使用しました
　なお、Gitlabサーバと同じOSを使用しなければならないという制約は記載がなかったので、お好みのOSで構築しても問題ないものと思います

## 3-1. Ubuntuサーバ構築

 [【Ubuntu】ubuntu24.04をインストールしてみた](https://qiita.com/rittan_girla/items/a01df929796a2d36485f)の記事を参考にUbuntuサーバを構築します
ただし、Dockerはディスクをかなり消費するため、ストレージサイズはデフォルト(25GB)より大きくした方が良いです（筆者の環境では25GBだと容量不足になったので、50GBくらいあっても良かったかなという感じでした）

## 3-2. dockerインストール
### 3-2-1. インストール要件確認
※今回は新規構築のため、前提条件部分は対応不要でしたので、本記事では割愛します

https://docs.docker.com/engine/install/ubuntu/

### 3-2-2. dockerリポジトリ設定
aptを使ってインストールしていきます

①パッケージリスト更新
```
# apt-get update
```

②必要パッケージインストール
```
# apt-get install -y ca-certificates curl
```

③GPGキー格納先ディレクトリ作成
```
# install -m 0755 -d /etc/apt/keyrings
```

④GPGキーダウンロード
```
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
```

⑤GPGキー権限変更
```
# chmod a+r /etc/apt/keyrings/docker.asc
```

⑥リポジトリ情報登録
```
# echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null
```

⑦パッケージリスト更新
```
# apt-get update
```

## 3-2-3. dockerインストール
①dockerインストール
※今回は最新版をインストールしています
　特定のバージョンをインストールしたい場合は、バージョンを指定して実行してください
```
# apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
②dockerインストール確認


【コマンド】
```
# docker --version
```
【結果】※2024/8/19時点で最新の27.1.2がインストールされています
```
Docker version 27.1.2, build d01f264
```
③docker動作確認
実際にイメージをダウンロードして起動してみます
【コマンド】
```
# docker run hello-world
```
【結果】
下記のような結果が表示されていれば問題ありません
```
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:53cc4d415d839c98be39331c948609b659ed725170ad2ca8eb36951288f81b75
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
 ```

# 4. gitlab-runner導入
gitlab-runnerの導入は、先ほどのhello-worldのようにリモートリポジトリからイメージを引っ張ってきて、dockerコンテナ上でセットアップする方法と、Dockerfileを使ってローカルイメージを作成して起動するパターンがあります
ただ、前者の場合はdockerを使用するメリットが無くなるため、後者の方法を取ります

## 4-1. Dockerfile作成
dockerhubとGitlabに公式のリポジトリがあったので、こちらを参考に作成します
dockerhubの方は内容が古いようで、GPGキーの設定で失敗してしまったので、後者のGitlabの方法を採用することにしました

https://hub.docker.com/r/gitlab/gitlab-runner/dockerfile

https://gitlab.com/gitlab-org/gitlab-runner/-/tree/main/dockerfiles/runner/ubuntu?ref_type=heads

- Dockerfile
  - イメージのバージョン設定の部分はARG指定した際に下記エラーが発生したため、カスタマイズしました
`WARN: InvalidDefaultArgInFrom: Default value for ARG $BASE_IMAGE results in empty or invalid base image name`
参考：https://docs.docker.com/reference/build-checks/invalid-default-arg-in-from/
  - ansibleではsudoが必要になるため、パッケージとして必要になるものは追加しています
  - dockerのベストプラクティスに合わせて、インストールするパッケージはアルファベット順に変更しています
  - Ansibleのインストールを追加で設定しています（apt-getを使ったインストールでも問題ありませんが、Ansibleの[ベストプラクティス](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#pipx-install)に合わせてpipxを使用する方法を取りました）
  - Ansibleは最新版ansible-coreをインストールしています。（https://github.com/ansible/ansible）
  - Ansibleコマンドのパス設定で、当初は`pipx ensurepath`を使用していましたが、パス設定が保存されなかったため、.bash_profileに書き込む方法を採用しました（※.bashrcだとCI/CDでは読み込まれないので注意）

```text:Dockerfile
ARG BASE_IMAGE_VERSION

FROM ubuntu:${BASE_IMAGE_VERSION:-24.04}

ARG TARGETPLATFORM
ARG TARGETARCH
ARG ARCH=${TARGETARCH}

ENV DEBIAN_FRONTEND=noninteractive
# hadolint ignore=DL3008
RUN apt-get update -y && \
    apt-get install -y --no-install-recommends \
        apt-transport-https \
        ca-certificates \
        curl \
        git git-lfs \
        openssh-client \
        sudo \
        tzdata \
        vim \
        wget \
    && rm -rf /var/lib/apt/lists/*

COPY gitlab-runner /etc/sudoers.d/

ARG DOCKER_MACHINE_VERSION
ARG DUMB_INIT_VERSION

COPY gitlab-runner_*.deb checksums-* install-deps install-gitlab-runner /tmp/
RUN /tmp/install-deps "${TARGETPLATFORM}" "${DOCKER_MACHINE_VERSION}" "${DUMB_INIT_VERSION}"
RUN rm -rf /tmp/* /etc/gitlab-runner/.runner_system_id

ARG ANSIBLE_VERSION
RUN apt-get update -y && \
    apt-get install -y pipx && \
    pipx ensurepath && \
    rm -rf /var/lib/apt/lists/*

USER gitlab-runner
RUN pipx install ansible-core=="${ANSIBLE_VERSION:-2.17.3}"
RUN echo "export PATH=\"$PATH:/home/gitlab-runner/.local/bin\"" >> ~/.bash_profile && \
    . ~/.bash_profile

FROM ubuntu:${BASE_IMAGE_VERSION:-24.04}

COPY --from=0 / /
COPY --chmod=755 entrypoint /

STOPSIGNAL SIGQUIT
VOLUME ["/etc/gitlab-runner", "/home/gitlab-runner"]
ENTRYPOINT ["/usr/bin/dumb-init", "/entrypoint"]
CMD ["run", "--user=gitlab-runner", "--working-directory=/home/gitlab-runner"]
```

- gitlab-runner
/etc/sudoers.d/配下に格納するファイルです
sudo使用時にパスワードを求められないように設定しています
こちらはカスタマイズで設定を追加しています

```text:gitlab-runner
gitlab-runner    ALL=(ALL:ALL) NOPASSWD: ALL
```

- install-deps
`RUN /tmp/install-deps "${TARGETPLATFORM}" "${DOCKER_MACHINE_VERSION}" "${DUMB_INIT_VERSION}"`で実行しているスクリプトです
dump-initのインストールに必要なプラットフォーム情報の設定、`install-gitlab-runner`スクリプトの実行(gitlab-runnerのインストール)、ディレクトリ作成等、gitlab-runnerをセットアップするスクリプトです
こちらはカスタマイズしていません

```text:install-deps
#!/usr/bin/env bash

set -eEo pipefail

SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"

TARGETPLATFORM="$1"
DOCKER_MACHINE_VERSION="$2"
DUMB_INIT_VERSION="$3"

case "${TARGETPLATFORM}" in
    "linux/arm64")
        ARCH=arm64
        DOCKER_MACHINE_ARCH=aarch64
        DUMB_INIT_ARCH=aarch64
        ;;
    "linux/amd64" | "")
        ARCH=amd64
        DOCKER_MACHINE_ARCH=x86_64
        DUMB_INIT_ARCH=x86_64
        ;;
    "linux/s390x")
        ARCH=s390x
        DOCKER_MACHINE_ARCH=s390x
        DUMB_INIT_ARCH=s390x
        ;;
    "linux/ppc64le")
        ARCH=ppc64le
        DOCKER_MACHINE_ARCH=ppc64le
        DUMB_INIT_ARCH=ppc64le
        ;;
    *)
        echo "Unexpected TARGETPLATFORM value: ${TARGETPLATFORM}"
        ;;
esac;

"${SCRIPTPATH}/install-gitlab-runner" "${ARCH}"
rm "${SCRIPTPATH}/install-gitlab-runner"
gitlab-runner --version

mkdir -p /etc/gitlab-runner/certs
chmod -R 700 /etc/gitlab-runner

if grep 'docker-machine' "${SCRIPTPATH}/checksums-${ARCH}"; then
  curl -L "https://gitlab.com/gitlab-org/ci-cd/docker-machine/-/releases/${DOCKER_MACHINE_VERSION}/downloads/docker-machine-Linux-${DOCKER_MACHINE_ARCH}" \
    -o /usr/bin/docker-machine
else
  echo "No checksum specified for docker-machine, skipping."
fi
curl -L "https://github.com/Yelp/dumb-init/releases/download/v${DUMB_INIT_VERSION}/dumb-init_${DUMB_INIT_VERSION}_${DUMB_INIT_ARCH}" \
  -o /usr/bin/dumb-init


if [[ -f /usr/bin/docker-machine ]]; then
  chmod +x /usr/bin/docker-machine
  docker-machine --version
fi

chmod +x /usr/bin/dumb-init
dumb-init --version
```

- install-gitlab-runner
文字通りgitlab-runnerをインストールしています
dpkgでインストールしているため、依存関係にあるモジュールがインストールされないことから、`apt-get -f install`で依存関係にあるモジュールをインストールしています
こちらもカスタマイズしていません

```text:install-gitlab-runner
#!/usr/bin/env bash

set -eEo pipefail

ARCH=$(if [ "$1" == "ppc64le" ]; then echo "ppc64el"; else echo "$1"; fi)

dpkg -i "/tmp/gitlab-runner_${ARCH}.deb"
apt-get update
apt-get -f install -y
rm -rf /var/lib/apt/lists/*
rm "/tmp/gitlab-runner_${ARCH}.deb"
```
- checksums-${ARCH}
docker-machineをインストールする場合、必要になるファイルですが、今回は不要なので作成していません
<br />

- entrypoint
カスタムCA証明書がある場合、更新を行った上でgilab-runnerを起動するスクリプトです
こちらもカスタマイズしていません

```text:entrypoint
#!/bin/bash

# gitlab-runner data directory
DATA_DIR="/etc/gitlab-runner"
CONFIG_FILE=${CONFIG_FILE:-$DATA_DIR/config.toml}
# custom certificate authority path
CA_CERTIFICATES_PATH=${CA_CERTIFICATES_PATH:-$DATA_DIR/certs/ca.crt}
LOCAL_CA_PATH="/usr/local/share/ca-certificates/ca.crt"

update_ca() {
  echo "Updating CA certificates..."
  cp "${CA_CERTIFICATES_PATH}" "${LOCAL_CA_PATH}"
  update-ca-certificates --fresh >/dev/null
}

if [ -f "${CA_CERTIFICATES_PATH}" ]; then
  # update the ca if the custom ca is different than the current
  cmp --silent "${CA_CERTIFICATES_PATH}" "${LOCAL_CA_PATH}" || update_ca
fi

# launch gitlab-runner passing all arguments
exec gitlab-runner "$@"
```

# 4-2. ファイル配置
①ホームディレクトリ（home/ユーザー名/）にDockerfileを格納するディレクトリを作成して、そのディレクトリに移動します
※格納先は特に決まりはありませんが、Dockerfile一式があるパスでdocker buildを実行するので、ユーザー管理のディレクトリで良いと思います

②4-1で作成したファイルを格納します


③gitlab-runnerのdepファイルをダウンロードします
```
# curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb"
```
参考：[GNU/LinuxにGitLab Runnerを手動インストールします- deb/rpm パッケージの使用](https://gitlab-docs.creationline.com/runner/install/linux-manually.html#%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)

④`install-deps`と`install-gitlab-runner`のパーミッションを変更します
　実行権限が付与されていない場合、`docker build`が失敗します
 ※どうやらホスト側のファイルのパーミッションが継承されるようです
 ※もし、docker-machineをインストールする場合は、`checksums-*`ファイルが必要です
.
┣ Dockerfile
┣ entrypoint
┣ gitlab-runner
┣ gitlab-runner_amd64.deb
┣ install-deps
┗ install-gitlab-runner

## 4-3. dockerイメージ作成

docker imageの作成の詳細は下記を参考にしています

- dockerイメージ作成

https://docs.docker.com/build/concepts/context/

- --build-argオプション

https://docs.docker.jp/engine/reference/commandline/build.html#build-arg


### 4-3-1. dockerイメージ作成
Dockerfileで変数として指定している部分は指定してあげます
- TARGETPLATFORM：linux/amd64
- TARGETARCH：x86_64
- BASE_IMAGE_VERSION：任意のバージョン
- ANSIBLE_VERSION：任意のバージョン
- DOCKER_MACHINE_VERSION：任意のバージョン
- DUMB_INIT_VERSION：任意のバージョン

【コマンド例】
※BASE_IMAGE_VERSIONおよびANSIBLE_VERSIONは指定しなかった場合、デフォルト値が適用されるため省いています
※DOCKER_MACHINE_VERSIONは今回導入しないため省いています
※DUMB_INIT_VERSIONは最新版です。（https://github.com/Yelp/dumb-init/releases）
```
# docker build -t local-gitlab-runner-1:latest -f Dockerfile --build-arg TARGETPLATFORM=linux/amd64 --build-arg TARGETARCH=x86_64 --build-arg DUMB_INIT_VERSION=1.2.5 .
```

### 4-3-2. dockerイメージ確認

【コマンド】
```
# docker images
```
【結果】
```
# docker images
REPOSITORY              TAG       IMAGE ID       CREATED         SIZE
local-gitlab-runner     latest    975f02dbf2fd   23 hours ago    995MB
hello-world             latest    d2c94e258dcb   15 months ago   13.3kB
```

## 4-4. dockerコンテナ作成
公式サイト「[オプション2: Dockerボリュームを使用してランナーコンテナを起動する](https://docs.gitlab.com/runner/install/docker.html#option-2-use-docker-volumes-to-start-the-runner-container)」のコマンドを参考に実行していきます

### 4-4-1.dockerボリューム作成

【コマンド】
```
# docker volume create gitlab-runner-config
```
【結果】

```
# docker volume create gitlab-runner-config
gitlab-runner-config
```

### 4-4-2. dockerボリューム確認

【コマンド】
```
# docker volume ls
```
【結果】
※ボリューム作成しないと上段のような名称となり、管理しにくくなります
```
# docker volume ls
DRIVER    VOLUME NAME
local     707b546ec7b712803216f75b0aac09ce51622e192857f6bd79d1431f7eea6db5
local     gitlab-runner-config
```
### 4-4-3. dockerコンテナ作成

【コマンド】
  - name：コンテナ名
  - restart always：コンテナが停止したら再起動する（手動で停止した場合は停止状態）
  - env：コンテナに設定する環境変数
  - v：マウント設定（ホストで持っているgitlab-runner-configをコンテナ上の/etc/gitlab-runnerにマウントする）
  - 最終行：使用するイメージ名

```
# docker run -d --name local-gitlab-runner --restart always --env TZ=Asia/Tokyo \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v gitlab-runner-config:/etc/gitlab-runner \
    local-gitlab-runner:latest
```
【結果】
```
# docker run -d --name local-gitlab-runner --restart always --env TZ=Asia/Tokyo \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v gitlab-runner-config:/etc/gitlab-runner \
    local-gitlab-runner:latest
a41d636418b209bcf41f16f77e9f6ec46819322d378d710bc6fcad68a3aa98fc
```

### 4-4-4. dockerコンテナ確認

【コマンド】
```
# docker ps
```
【結果】
```
# docker ps
CONTAINER ID   IMAGE                        COMMAND                  CREATED        STATUS        PORTS     NAMES
a41d636418b2   local-gitlab-runner:latest   "/usr/bin/dumb-init …"   20 hours ago   Up 20 hours             local-gitlab-runner
```

## 4-5. dockerコンテナ接続
作成したコンテナに接続してみます

### 4-5-1. dockerコンテナ接続
【コマンド】
```
# docker exec -it local-gitlab-runner bash
```
ざっくりキーボード入力と画面表示ができるみたいな感じですね
- i：アタッチしていなくても、標準入力を開き続ける※
- t：疑似（pseudo） TTY を割り当て※
- bash：bashシェル実行

※引用：https://docs.docker.jp/engine/reference/commandline/exec.html
<br />

【結果】rootでコンテナに接続したことがわかります（@以降はコンテナIDです）
```
# docker exec -it local-gitlab-runner bash
root@a41d636418b2:/#
```

### 4-5-2. ソフトウェア確認

- gitlab-runner
```
root@a41d636418b2:/# gitlab-runner --version
Version:      17.3.0
Git revision: 071ba93d
Git branch:   17-3-stable
GO version:   go1.22.5
Built:        2024-08-14T23:23:10+0000
OS/Arch:      linux/amd64
```

- ansible
gitlab-runnerユーザにパッケージをインストールしたため、gitlab-runnerで実行できれば期待通りの結果です
    - root
    ```
    # root@a41d636418b2:/# ansible --version
    bash: ansible: command not found
    ```
    - gitlab-runnerユーザ
    ```
    gitlab-runner@a41d636418b2:/$ ansible --version
    ansible [core 2.17.3]
      config file = None
      configured module search path = ['/home/gitlab-runner/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
      ansible python module location = /home/gitlab-runner/.local/share/pipx/venvs/ansible-core/lib/python3.12/site-packages/ansible
      ansible collection location = /home/gitlab-runner/.ansible/collections:/usr/share/ansible/collections
      executable location = /home/gitlab-runner/.local/bin/ansible
      python version = 3.12.3 (main, Jul 31 2024, 17:43:48) [GCC 13.2.0] (/home/gitlab-runner/.local/share/pipx/venvs/ansible-core/bin/python)
      jinja version = 3.1.4
      libyaml = True
    ```
### 4-5-3. sudo動作確認

sudoでapt-get updateが実行できており、かつパスワードを求められていません
期待通りの結果です

```
gitlab-runner@a41d636418b2:/$ sudo apt-get update
Get:1 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
Get:2 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [354 kB]
Get:3 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
Get:4 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Packages [12.7 kB]
Get:5 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [404 kB]
Get:6 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
Get:7 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]
Get:8 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [337 kB]
Get:9 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]
Get:10 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]
Get:11 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]
Get:12 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]
Get:13 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [449 kB]
Get:14 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [518 kB]
Get:15 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [16.9 kB]
Get:16 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [354 kB]
Get:17 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [11.5 kB]
Fetched 24.7 MB in 8s (3150 kB/s)
Reading package lists... Done
```

# 4-6. Gitlab CI/CD登録
gitlab-runnerが準備できましたので、次にGitlabのCI/CDで使用できるようにしていきます
GIltabサーバは「[【Gitlab】Gitlabサーバーを構築してみた（インストール～初期設定）](https://qiita.com/rittan_girla/items/8ad9746975ce57b11936)」で構築したサーバーを使用します

gitlab-runnerの登録方法は[Continuous Integration and Deployment Admin area settings](https://docs.gitlab.com/ee/administration/settings/continuous_integration.html)を参考にしています。

①Adimin Area＞Ruunersにて、[New instance runner]を押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698496/f9e4a85b-f86b-016e-97c4-591b452cc0a8.png)

②New instance runner画面にて、設定を入力して、[create runner]を押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698496/8fa23a8a-906d-075b-0856-a1573b50ddb7.png)

③runnerの設定画面にて、Operating systemを選択し、Step1の内容を確認します
　※ここに記載されているコマンドを用いて、gitlab-runnerの認証を行っていきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698496/2da60169-95cf-8c4b-ba93-93a2e3e494f5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698496/9b3ca56b-1484-ecf4-c805-935c7433e855.png)

④gitlab-runnerのdockerコンテナ上で、コマンドを実行します

【コマンド】
```
# gitlab-runner register  --url http://[設定したIPアドレス]  --token ******************
```
対話モードになるので、下記のように入力していきます
- [http://xxx.xxx.xxx.xxx]：URLがあっていればEnterキー
- [*******]：runner名を入力してEnterキー
- Enter an executor: ssh, virtualbox, docker, docker-windows, docker+machine, custom, shell, parallels, kubernetes, docker-autoscaler, instance:：shellを入力してEnterキー

【結果】
```
# gitlab-runner register  --url http://xxx.xxx.xxx.xxx  --token ******************
Runtime platform                                    arch=amd64 os=linux pid=210 revision=071ba93d version=17.3.0
Running in system-mode.

Enter the GitLab instance URL (for example, https://gitlab.com/):
[http://xxx.xxx.xxx.xxx]:
Verifying runner... is valid                        runner=rWfdzsnjU
Enter a name for the runner. This is stored only in the local config.toml file:
[7e4665737e19]: local-gitlab-runner
Enter an executor: ssh, virtualbox, docker, docker-windows, docker+machine, custom, shell, parallels, kubernetes, docker-autoscaler, instance:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"
```
⑤認証されると画面下部に認証成功したことが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698496/a31188a5-9ef7-94b4-76d7-2d0f23695d7c.png)

⑥[View runners]を確認すると、登録したgitlab-runnerの情報が記載されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698496/0ce3347c-9178-7ff7-858c-f6e350fb3451.png)

# 5. Gitlab CI/CDを動かす
①Git for Windowsを使って、任意の作業ディレクトリにプロジェクトをクローンします
```
git clone "プロジェクトのURL"
```
②クローンされたディレクトリに移動します

③簡易的なコードを作成します
　gilab-runnerのユーザーとAnsibleコマンドが打てることを確認する内容です
```text:.gitlab-ci.yml
stages:
  - test

test-code-job:
  stage: test
  script:
    - echo "Check user:"
    - whoami
    - echo "Check the ansible version:"
    - ansible --version
```
※gitlab-ci.ymlの詳細は下記をご確認ください。

https://gitlab-docs.creationline.com/ee/ci/yaml/gitlab_ci_yaml.html


④プロジェクトに`.gitlab-ci.yml`をpushします

```
git add .gitlab-ci.yml
git commit -m "コメントを記載"
git push origin main
```
⑤対象のプロジェクト＞Jobsにて、jobを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698496/748ee910-18d3-9437-867e-5a74c2b99ca0.png)

③下記のような実行結果が表示されていればOKです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698496/a3bd3813-318b-845d-71dc-c36e1f19db4a.png)

以上でgitlab-runnerおよびCI/CDの設定完了です！

# おわりに
Gitlab CI/CDの構築自体は二度目なのですが、バージョン違いでかなり操作が異なっており、戸惑う点がありました。以前は、Setting＞CI/CD画面に認証コマンドが記載されていましたが、Runnersで設定するよう変更されていたんですね。。。参考：[Migrating to the new runner registration workflow](https://docs.gitlab.com/ee/ci/runners/new_creation_workflow.html)
また、今回はAnsibleが使えるようにカスタマイズに挑戦してみましたが、Ansibleが動くようになるまでとても時間がかかり苦労しました。
ただ、そのおかげでだいぶDockerfileの書きっぷりや内容を理解できたような気がします。
何度もdocker環境のお掃除もしたので、dockerのディスク管理の仕方も覚えられて勉強になりました。
何度もきれいな環境を作れるので検証しやすいのがdockerのメリットだなと改めて感じました。
Gitlab+dockerあたりは以前使ったことはあるものの、使い方や仕組みを全然理解できていなかったので、今だったらわかることがあるのにな…とか思いをはせたりしています。
AWSとの連携したパイプライン等、もう少し深いところも勉強していきたいです。

# 参考
- Docker
[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)
[Build context](https://docs.docker.com/build/concepts/context/)
[docker build - Docker-docs-ja 24.0 ドキュメント](https://docs.docker.jp/engine/reference/commandline/build.html#build-arg)
[オプション2: Dockerボリュームを使用してランナーコンテナを起動する](https://docs.gitlab.com/runner/install/docker.html#option-2-use-docker-volumes-to-start-the-runner-container)
[docker exec - Docker-docs-ja 24.0 ドキュメント](https://docs.docker.jp/engine/reference/commandline/exec.html)
[Dockerに占領されたディスク領域を解放する方法](https://zenn.dev/motoishimotoi/articles/e5b8a5f29a9e45)

- Gitlab
[dockerfiles/runner/ubuntu](https://gitlab.com/gitlab-org/gitlab-runner/-/tree/main/dockerfiles/runner/ubuntu?ref_type=heads)
[GNU/LinuxにGitLab Runnerを手動インストールします- deb/rpm パッケージの使用](https://gitlab-docs.creationline.com/runner/install/linux-manually.html#%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)
[Continuous Integration and Deployment Admin area settings](https://docs.gitlab.com/ee/administration/settings/continuous_integration.html)
[.gitlab-ci.yml ファイル](https://gitlab-docs.creationline.com/ee/ci/yaml/gitlab_ci_yaml.html)