GitLabとGitLab runnerをDockerでセットアップ



CIしたいときに普段は手軽なので[GitHub Actions](https://docs.github.com/ja/actions)を使ってますが、公開リポジトリor有料プランじゃないと計算資源が限定的なので、ローカルでGitLab&GitLab runnerを構築してCIしてみます。
あとは会社で仲間内でGitとCI使いたいときも使ってます。
基本的に公式ドキュメント見ながら作っただけです。

ホストに細かくインストールするのは苦手なので、docker-compose使って一気に作ります。

# docker-compose

```yaml
version: '3.6'
services:
  lab:
    image: 'gitlab/gitlab-ee:latest'
    restart: always
    hostname: 'gitlab.my.com'
    container_name: gitlab
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.my.com'
        # Add any other gitlab.rb configuration here, each on its own line
    ports:
      - '8080:80'
      # - '443:443'
      # - '22:22'
    volumes:
      - 'gitlab-config:/etc/gitlab'
      - 'gitlab-logs:/var/log/gitlab'
      - 'gitlab-data:/var/opt/gitlab'
    shm_size: '256m'
    networks:
      - gitlab-network
  runner:
    image: gitlab/gitlab-runner:latest
    restart: always
    container_name: gitlab-runner
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - gitlab-runner-config:/etc/gitlab-runner
    networks:
      - gitlab-network

volumes:
  gitlab-config:
  gitlab-logs:
  gitlab-data:
  gitlab-runner-config:

networks:
  gitlab-network:
    name: gitlab-network
```
docker volumeは適宜バックアップをお願いします。
仲間内で使うだけなので、SSLなしです。

runner->GitLabが疎通できるようにしたいので、Docker networkを定義しています。


# 起動
普通に

```bash
docker-compose up -d
```

で起動します。
結構な時間がかかる（5分くらい）ので、お茶でも飲んで待ちます。
http://localhost:8080 にアクセスするとGitLabが起動しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207100/e1775d46-38d0-907b-9faa-a2efe1b22ff5.png)

アクセスできたら一旦ログインします。
Usernameはroot
パスワードは乱数で生成されるので、コンテナに入って確認します。

```bash
$ docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
Password: g21Y39lUkgwTelSv/vzm/VkBmzCgYrTwtqT3f+8cwns=
```

入手したPasswordでGitLabにログインします。

ユーザーをいい感じに作ったりリポジトリを作ったら、CIを設定してリポジトリとrunnerを接続します。

## CIの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207100/8a84a7a5-bb29-7969-a6b8-498e4d7a875a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207100/8774c1d1-e30d-018c-4e0c-575bf59e46aa.png)

CIの設定からRunnersに入ります。
まず、GitLabの公式リソースは使わずに100%ローカルパワーで実行するので、「Shared runners」はFalseにします。

次に、この画面はそのままにしておいて、runner側の設定をします。

```bash
docker exec gitlab-runner gitlab-runner register -n \
  --url http://gitlab.my.com/ \
  --registration-token C1xiCyrMox_f_q9EHE21 \
  --name myfirstci \
  --executor docker \
  --docker-image ubuntu:20.04 \
  --docker-network-mode gitlab-network
```

* registration-token: gitlabのregistration tokenをコピペします
* name: 好きにつけてください
* docker-image: 使うdocker imageです
* docker-network-mode: gitlabとrunnerが動いているネットワーク名です。CIのために生成したコンテナをこのネットワークに所属させないとGit Cloneが失敗します。わからなければdocker network lsで調べてください。


# CIを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207100/6ca0969c-ad61-c399-765e-6b891139e1bf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207100/a7adefdb-8e8b-72ab-f656-cc76a8e9d30f.png)


とりあえずサンプルから作ってみます。

```yaml
# This file is a template, and might need editing before it works on your project.
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/ee/development/cicd/templates.html
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml

# This is a sample GitLab CI/CD configuration file that should run without any modifications.
# It demonstrates a basic 3 stage CI/CD pipeline. Instead of real tests or scripts,
# it uses echo commands to simulate the pipeline execution.
#
# A pipeline is composed of independent jobs that run scripts, grouped into stages.
# Stages run in sequential order, but jobs within stages run in parallel.
#
# For more information, see: https://docs.gitlab.com/ee/ci/yaml/index.html#stages

stages:          # List of stages for jobs, and their order of execution
  - build
  - test
  - deploy

build-job:       # This job runs in the build stage, which runs first.
  stage: build
  script:
    - echo "Compiling the code..."
    - echo "Compile complete."

unit-test-job:   # This job runs in the test stage.
  stage: test    # It only starts when the job in the build stage completes successfully.
  script:
    - echo "Running unit tests... This will take about 60 seconds."
    - sleep 60
    - echo "Code coverage is 90%"

lint-test-job:   # This job also runs in the test stage.
  stage: test    # It can run at the same time as unit-test-job (in parallel).
  script:
    - echo "Linting code... This will take about 10 seconds."
    - sleep 10
    - echo "No lint issues found."

deploy-job:      # This job runs in the deploy stage.
  stage: deploy  # It only runs when *both* jobs in the test stage complete successfully.
  script:
    - echo "Deploying application..."
    - echo "Application successfully deployed."
```
サンプルで生成されたCIです。
時間稼ぎしているだけで特に何もしてないので、runnerとの接続に問題がなければ成功するはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207100/adf87d11-08d6-d859-dd28-f48d92a4057b.png)

コミットしてみます。

Pipelinesを見てみると、走り始めてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207100/c043aa56-c2fa-c4df-fa94-14d97838fe18.png)

全部正常終了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207100/99ddf470-7d71-9a04-4b96-9bfccd7d88d4.png)


これでGitLabとCIのセットアップをDockerを使ってサッと完了できました！