IT

M1 Mac+DockerでGitLab+Runnerをローカル上に立ち上げてみた

こんにちは,shimasan0x00(@shimasan0x00)です.
ObsidianというGODエディタで記事を書きたくて久々に筆を執りました.

Dockerを使用してGitLab+GotLab Runnerをローカルで構築する記事は多く存在するのですが,M1・M2 Mac(arm64)で動作させた記事は少なかったので参考になればと思い,ドキュメントを残します.

基本戦略として,公式からはarm64イメージが配布されていないので外部のarm64対応イメージを使用します.

しかし,arm64イメージで記載されている手順ではまだ動作しないためdocker-compose.ymlの変更とコンテナ上でファイルの変更を行うことで対応していきます.

検証環境

  • Mac
    • – M1
    • – macOS Monterey
  • Docker Desktop
    • – v4.21.1
    • – Resources
      • – CPUs: 6
        • – Memory: 10GB
          • – Swap: 2.5GB
  • GitLab
    • – GitLab CE v16.2.1

スポンサーリンク

GitLab CEの構築

docker-compose.ymlの編集

version: '3.9'

services:
  gitlab-local:
    image: yrzr/gitlab-ce-arm64v8:latest
    platform: linux/arm64
    restart: unless-stopped
    hostname: 'gitlab-local'
    container_name: gitlab-local
    privileged: true
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab-local:12001'
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        registry_external_url 'http://gitlab-local:5555'
        gitlab_workhorse['enable'] = true
        gitlab_workhorse['listen_network'] = "unix"
        gitlab_workhorse['listen_addr'] = "/var/opt/gitlab/gitlab-workhorse/sockets/socket"
        nginx['enable'] = true
        nginx['listen_port'] = 12001
        puma['enable'] = true
        puma['port'] = 14444
        puma['socket'] = "/var/opt/gitlab/gitlab-rails/sockets/socket"
        gitaly['configuration'] = {
            runtime_dir: '/var/gitaly_run',
        }
    ports:
      - '12001:12001'
      - '4443:443'
      - '5555:5555'
      - '2222:22'
    volumes:
      - './gitlab_config:/etc/gitlab'
      - './gitlab_logs:/var/log/gitlab'
      - './gitlab_data:/var/opt/gitlab'
    shm_size: '2gb'

  cicd-runner:
    container_name: 'cicd-runner'
    hostname: 'cicd-runner'
    image: 'gitlab/gitlab-runner:latest'
    platform: linux/arm64
    restart: always
    depends_on:
      - gitlab-local
    volumes:
      - './gitlab_runner_config:/etc/gitlab-runner'
      - '/var/run/docker.sock:/var/run/docker.sock'
volumes:
  gitlab_config:
      external: true
  gitlab_logs:
      external: true
  gitlab_data:
      external: true
  gitlab_runner_config:
      external: true


上記のdocker-compose.ymlを任意のディレクトリを作成した場所に配置してください.

gitlab-localのportに十分に注意してください.
この設定ではlocalhost:12001でGitLabが立ち上がるようになっているので環境によって変更が必要です.

適当なポートでいいやと思ってポート番号を設定すると,GitLabで使用しているポートと被って立ち上がらない...ってことがありました.

docker-compose up


docker-compose upでコンテナを立ち上げます.

コンテナ上の操作

コンテナを立ち上げて10-20分たってアクセスすると,GitLabが立ち上がっています.

ここでは502エラーが発生していると思いますが問題ありません.

docker exec -it gitlab-local bashでコンテナに入り、以下のコマンドを実行します.

mkdir /var/opt/gitlab/gitlab-workhorse/sockets/  
chown -R git:gitlab-www /var/opt/gitlab/gitlab-workhorse/sockets/  
mkdir /var/gitaly_run  
chown git:git /var/gitaly_run/  
gitlab-ctl reconfigure


mkdirは失敗しても問題ありません.

次はコンテナ上でなく、VSCodeなどで自身のディレクトリにSyncされたredisの設定ファイル( gitlab_data/redis/redis.conf)を編集します.

最終行でコメントアウトされているignore-warnings ARM64-COW-BUGをコメントアウトから解除します.

編集後、コンテナ上でgitlab-ctl restartを実行する。

※ 上記のredis設定はgitlab_config/gitlab.rbでは編集できず、gitlab-ctl reconfigureを実行すると再度コメントアウトされるので対応を忘れないようにします.

初期設定

初期アカウントのusernameはrootでパスワードはgitlab_config/initial_root_passwordに記載されています.

GitLab Runnerを設定する場合はAdmin AreaでShared Runnersの項目があるので選択し、New instance runnerで登録します.

作成するとTokenが払い出されるので忘れずに保存しておきます.

スポンサーリンク

GitLab Runnerの構築

docker exec -it cicd-runner bash

でGitLab Runnerのコンテナに入り、Runnerの登録を行っていきます.

コンテナ上で以下のコマンドを実行し,指示に従って設定していきます.

gitlab-runner register


TOKENは先程GitLab側で入手したものです.

http://gitlab-local:12001/ 
TOKEN
{何も入力せずにエンター}
docker  
docker:latest


上記のコマンドによって結果が/etc/gitlab-runner/config.tomlに保存されるのでこれを追加で編集します(clone_url, volumes, custom_build_dir,privileged,network_mode).

concurrent = 1
check_interval = 0
shutdown_timeout = 0
[session_server]
  session_timeout = 1800
[[runners]]
  name = "cicd-runner"
  url = "http://gitlab-local:12001"
  clone_url = "http://gitlab-local:12001"
  id = 1
  token = "glrt-FxG5yEH5DJi18Ga8Sybu"
  token_obtained_at = 2023-07-29T13:38:09Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "docker"
  [runners.cache]
    MaxUploadedArchiveSize = 0
  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = [
      "/cache",
      "/var/run/docker.sock:/var/run/docker.sock"
      ]
    shm_size = 0
    network_mode = "host"
  [runners.custom_build_dir]
    enabled = true
    builds_dir = "/builds" 

解決できるまで

上記までで一旦動作する環境は確保できたのではないでしょうか.
私は以下に掲載している一部以外にも色々調査して何故か2日経っていました.

私みたいに時間を溶かさないことを願います.

ネットで調べても最終的に良い答えにたどり着けず,直接ソースコードを見たり,エラー原因箇所の過去PRのディスカッション全部追ったり謎の時間が過ぎてしまった.

ABOUT ME
しまさん
高専→大学編入→大学院→? / 計算社会科学,ウェブマイニングなど / グレープフルーツと本が好き / SNS(Twitter,YouTube,Twitch)やVTuberのデータ分析屋 詳しいプロフィールはこちら≫ 投げ銭はコチラ