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
- – Memory: 10GB
- – CPUs: 6
- 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のディスカッション全部追ったり謎の時間が過ぎてしまった.