オープンソースのウェブ型GitリポジトリマネージャーであるGitLabを、今回はDockerを使って構築してみたいと思います。本格的にGitLabを使う場合には専用のLinuxサーバを構築して、そこにGitLabをインストールするのが一般的ですが、今回はローカル環境でDockerを使ってGitLabを構築してCI/CDの動作確認を行っていきます。
環境
今回は次の環境でGitLabを構築しています。
環境 | バージョン | 備考 |
---|---|---|
Ubuntu | 22.04 LTS | WSL2で構築 |
Docker | 24.0.6 | https://get.docker.com/ でインストール |
Docker Compose | 2.21.0 | 標準にインストールされている |
GitLab | 16.4.1 | Docker Composeで構築 |
GitLab Runner | 16.4.0 | Docker Composeで構築 |
GitLabの構築
今回はGitLabをDocker Composeで構築します。次の手順で構築します。
- hostsの設定
- Dockerデーモンの設定変更
- Docker Composeファイルの作成
- GitLabの起動
hostsの設定
- IPアドレスの確認
まずは、DockerホストのIPアドレスを確認します。このIPアドレスは、GitLabの設定に使用します。
コマンド実行
hostname -I
次のように一番最初に表示されるIPアドレスをコピーしておいてください。
- hostsファイルの編集(ホストOS)
ホストOSのhostsファイルを編集します。(Macの場合は/etc/hosts
、Windowsの場合はC:\Windows\System32\drivers\etc\hosts
ファイルを編集します。)次の行を追加してください。<IPアドレス>
の部分は先に確認したIPアドレスを入れてください。
/etc/hosts
<IPアドレス> gitlab.local
Gitクライアントの設定
GitLabのリモートリポジトリをGitクライアントで操作するために、Gitクライアントの設定を行います。
- Gitの設定
Gitの設定を行います。次のコマンドを実行してください。
コマンド実行
git config --global user.name "<ユーザ名>"
git config --global user.email "<メールアドレス>"
<ユーザ名>
と<メールアドレス>
はGitLabにログインするときに使うものです。GitLabにログインするときに使うユーザ名とメールアドレスを入力してください。
Dockerデーモンの設定変更
今回GitLabはContainer RegistryをTLSで保護していないため、Dockerコマンドを使ったGitLab CI/CDジョブを実行するには次の設定を行う必要があります。
- Dockerデーモンの設定変更
- Dockerデーモンの設定変更
Dockerデーモンの設定を変更します。/etc/docker/daemon.json
を作成します。
コマンド実行
echo '{ "insecure-registries":["gitlab.local:5000"] }' | sudo tee /etc/docker/daemon.json
insecure-registries
にgitlab.local:5000
を設定しています。これはGitLabのContainer RegistryのURLで、TLSで保護されていないためinsecure-registries
に設定する必要があります。
- Dockerデーモンの設定変更
/etc/default/docker
を編集します。sed
コマンドで書き換えます。
コマンド実行
sudo sed -i 's/^#DOCKER_OPTS=.*/DOCKER_OPTS="--insecure-registry gitlab.local:5000"/' /etc/default/docker
DOCKER_OPTS
に--insecure-registry gitlab.local:5000
を設定しています。これはGitLabのContainer RegistryのURLで、TLSで保護されていないためDOCKER_OPTS
に設定する必要があります。
- Dockerデーモンの再起動
Dockerデーモンを再起動して設定を反映します。
コマンド実行
sudo systemctl restart docker
これでDockerデーモンの設定変更は完了です。
Docker Composeファイルの作成
次にdocker-compose.yml
を作成します。
- ディレクトリの作成
~/gitlab
ディレクトリを作成します。
- Docker Composeファイルの作成
Ubuntuのホームディレクトリの中にgitlab
ディレクトリを作成して、docker-compose.yml
ファイルを作成し、次の内容を記述します。
gitlab/docker-compose.yml
version: '3.7'
services:
web:
image: 'gitlab/gitlab-ce:16.4.1-ce.0'
restart: always
hostname: 'gitlab.local'
container_name: gitlab-ce
environment:
GITLAB_OMNIBUS_CONFIG: |
# GitLabのURLを設定
external_url 'http://gitlab.local:8090'
gitlab_rails['gitlab_host'] = 'gitlab.local:8090'
nginx['listen_port'] = 8090
# GitLab Container Registryを有効化
registry_external_url 'http://gitlab.local:5000'
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_api_url'] = "http://gitlab.local:5000"
registry['enable'] = true
registry_nginx['enable'] = false
registry['registry_http_addr'] = "gitlab.local:5000"
# リソース軽減するために不要な機能を停止
sidekiq['max_concurrency'] = 10
puma['worker_processes'] = 0
postgresql['shared_buffers'] = "512MB"
gitlab_rails['gitlab_kas_enabled'] = false
grafana['enable'] = false
prometheus_monitoring['enable'] = false
prometheus['enable'] = false
alertmanager['enable'] = false
ports:
- '8090:8090'
- '5000:5000'
volumes:
- ./gitlab/config:/etc/gitlab
- ./gitlab/logs:/var/log/gitlab
- ./gitlab/data:/var/opt/gitlab
networks:
- gitlab
extra_hosts:
- gitlab.local:host-gateway
gitlab-runner:
image: gitlab/gitlab-runner:alpine3.18-v16.4.0
container_name: gitlab-runner
restart: always
depends_on:
- web
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./gitlab-runner:/etc/gitlab-runner
networks:
- gitlab
extra_hosts:
- gitlab.local:host-gateway
networks:
gitlab:
name: gitlab-network
services.web.environment.GITLAB_OMNIBUS_CONFIG
は次の設定を行っています。
今回はGitLabのアクセスするURLをhttp://gitlab.local:8090
に設定したいため次の項目を設定しています。
external_url
:GitLabのURLgitlab_rails['gitlab_host']
:GitLabのホスト名nginx['listen_port']
:GitLabのポート番号
また、GitLabのメモリ使用量を調整するために次の項目を設定しています。
sidekiq['max_concurrency']
:Sidekiqの最大並列数puma['worker_processes']
:Pumaのワーカープロセス数prometheus_monitoring['enable']
:Prometheusの有効化postgresql['shared_buffers']
:PostgreSQLの共有バッファ
これでGitLabのDocker Composeファイルが作成できました。
GitLabの起動
それでは作成したdocker-compose.yaml
を使ってGitLabを起動します。
- コンテナの起動
docker-compose.ymlがあるディレクトリで次のコマンドを実行します。
コマンド実行
cd ~/gitlab
docker compose up -d
- コンテナの起動確認
次のようにコンテナが作成され起動します。
次のコマンドでコンテナの状態を確認します。
コマンド実行
docker compose ps
次のようにコンテナの状態が表示されます。STATUS
がUp
になっていることを確認します。
これでGitLabのコンテナが起動しました。
GitLabの起動が完了するまでには数分かかります。しばらくお待ちください。
GitLabの動作確認
次にGitLabの動作確認を行います。
- ブラウザでGitLabにアクセス
ブラウザで次のURLにアクセスします。
http://gitlab.local:8090
- GitLabのログイン画面の確認
次のようにGitLabのログイン画面が表示されることを確認します。
GitLabへのログイン
GitLabにログインします。
- 初期パスワードの確認
GitLabの初期状態で作成されているユーザはroot
です。初期設定のパスワードは次のコマンドで確認できます。
rootの初期パスワード確認コマンド
docker exec -it gitlab-ce grep 'Password:' /etc/gitlab/initial_root_password
次のように初期パスワードが表示されます。
- GitLabにログイン
このパスワードを使ってGitLabにログインします。
ログインが成功すると次のような画面が表示されます。
GitLabアカウントのパスワード変更
GitLabのアカウントのパスワードを変更します。
- パスワード変更画面の表示
GitLabのトップ画面の左上のアイコンをクリックして「Edit profile」をクリックします。
- パスワード変更画面の表示
User Settings画面が表示されますので、左の「Password」をクリックします。そして「Current password」に先に確認したパスワードを入力し、「New password」と「Password comfirmation」には新しいパスワードを入力して「Save password」ボタンをクリックします。
- パスワードが弱いとエラーになります。パスワードは8文字以上で、英字と数字を含めてください。(例:
fullness123
)
- 再ログイン
パスワード変更が完了すると再ログインが必要になります。再ログインしてください。
これでパスワード変更は完了です。
GitLab Runnerの登録
次にGitLab Runnerを登録します。GitLab RunnerはGitLabのCI/CDのジョブを実行するためのサービスです。GitLab RunnerはGitLabの管理画面から登録できます。
Resistration Tokenの確認
GitLab Runnerの登録にはResistration Tokenが必要です。Admin AreaのCI/CDのRunnersの画面から確認できます。
- Admin AreaのCI/CDのRunnersの画面にアクセス
GitLabのトップ画面にて/
を押して検索欄にadmin
と入力して「Admin Area / Dashboard」をクリックします。
- Resistration Tokenの確認
GitLabの管理画面で次の項目を確認します。
「CI/CD」->「Runners」の画面から「New instance runner」の左の「:」をクリックして「Resistration Token」を確認します。
GitLab Runnerの登録
確認したRegistration Tokenを使ってGitLab Runnerを登録します。
- 環境変数の設定
GitLab Runner登録時に必要な情報を環境変数に設定します。次のコマンドを実行してください。
まず、<Registration Token>
の部分には先に確認したRegistration Tokenを入れてください。
コマンド実行
export RUNNER_TOKEN=<Registration Token>
次にホストのIPアドレスを環境変数に設定します。次のコマンドを実行してください。
コマンド実行
export HOST_IP=$(hostname -I | cut -d' ' -f1)
- GitLab Runnerの登録
次のコマンドを実行してGitLab Runnerを登録します。<Registration Token>
の部分には先に確認したRegistration Tokenを入れてください。
コマンド実行
docker exec -it gitlab-runner gitlab-runner register \
--non-interactive \
--url http://gitlab.local:8090 \
--registration-token "$RUNNER_TOKEN" \
--executor docker \
--docker-image docker:latest \
--description "docker-runner" \
--tag-list "docker" \
--run-untagged \
--locked="false" \
--access-level="not_protected" \
--docker-extra-hosts "gitlab.local:$HOST_IP" \
--docker-privileged \
--docker-volumes "/cache" \
--docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \
--docker-volumes "/etc/default/docker:/etc/default/docker" \
--docker-volumes "/etc/docker/daemon.json:/etc/docker/daemon.json"
次のようにRegister runner succeeded
と表示されれば登録完了です。
ちなみに上記のコマンドは次のような設定を行っています。
--url
:GitLabのURL--registration-token
:Registration Token--executor
:実行環境(今回はDocker)--docker-image
:Job実行時のデフォルトのDockerイメージ--description
:GitLab Runnerの説明--tag-list
:GitLab Runnerに設定するタグ--run-untagged
:タグのないジョブを実行するかどうか--locked
:GitLab Runnerをロックするかどうか--access-level
:GitLab Runnerのアクセスレベル(not_protected
は誰でも使える)--docker-extra-hosts
:Dockerコンテナ内からGitLabにアクセスするための設定--docker-privileged
:Dockerコンテナを特権モードで実行するかどうか--docker-volumes
:Dockerコンテナのボリュームの設定
- GitLab Runnerの確認
GitLabのRunner画面にて登録したRunnerが表示されていることを確認します。
これでGitLab Runnerの登録が完了しました。
GitLabプロジェクトの作成
GitLabプロジェクトを作成します。
- GitLabプロジェクトの作成
GitLab画面の左上にある「+」をクリックして「New project/repository」をクリックします。
「Create blank project」ボタンをクリックします。
- プロジェクト設定の入力
次のように入力して「Create project」ボタンをクリックします。
- Project name:
test
- Project URL:
http://gitlab.local:8090/root
- Project Slug:
test
- Visibility Level:
Private
プロジェクトが作成されます。
「Clone」ボタンをクリックして表示されるURLをコピーします。
GitLabリポジトリをローカルにクローン
GitLabのリポジトリをローカルにクローンします。
- リモートリポジトリをクローン
ホームディレクトリ/home/ubuntu
で次のコマンドを実行します。
コマンド実行
cd /home/ubuntu
git clone <GitLabのリポジトリURL>
- ログイン
GitLabのログイン画面が表示されますので、先ほど変更したパスワードでログインします。
次のようにtest
ディレクトリが作成され、GitLabのリポジトリがローカルにクローンされます。
GitLab CI/CDパイプラインの作成
GitLab CI/CDパイプラインを作成します。
- GitLab CI/CIファイルの作成
それではGitLab CI/CDのジョブを作成してみましょう。GitLab CI/CDのジョブは.gitlab-ci.yml
というファイルに記述します。.gitlab-ci.yml
はGitLabプロジェクトのルートディレクトリに作成します。作成したら次の内容を記述します
test/.gitlab-ci.yml
build:
tags:
- docker
stage: test
image: openjdk:17
script:
- java -version
上記はopenjdk:17
のDockerイメージを使ってjava -version
を実行するジョブを定義しています。tags
にdocker
を設定しています。これはGitLab Runnerの設定でdocker
というタグを設定しているためです。tags
に設定したタグのRunnerがジョブを実行します。
- GitLab CI/CDジョブの実行
GitLab CI/CDジョブを実行します。ローカルリポジトリをコミットしてプッシュします。
コマンド実行
cd test
git add .
git commit -m "first commit"
git push origin main
- GitLab CI/CDジョブの実行確認
プッシュが完了するとGitLabのプロジェクト画面にてジョブが実行されます。矢印の箇所をクリックするとジョブの詳細を確認できます。
ジョブの詳細が表示されます。ジョブに成功していると次のように表示されます。矢印の箇所をクリックするとジョブのログが表示されます。
- ジョブのログの確認
ジョブのログが表示されます。ジョブのログにはjava -version
の実行結果が表示されています。
このようにGitLab CI/CDのジョブを作成して実行することができました。
Dockerコマンドを使ったGitLab CI/CDジョブの作成
それではDockerコマンドを使ったCI/CDジョブを作成します。
- GitLab CI/CDファイルの修正
.gitlab-ci.yml
を次のように編集します。
test/.gitlab-ci.yml
build:
tags:
- docker
stage: test
image: openjdk:17 script:
- java -version - docker run hello-world
上記はdocker
のDockerイメージを使ってdocker run hello-world
を実行するジョブを定義しています。
- GitLab CI/CDジョブの実行
GitLab CI/CDジョブを実行します。次のコマンドを実行します。
コマンド実行
cd /home/ubuntu/test
git add .
git commit -m "update .gitlab-ci.yml"
git push origin main
- GitLab CI/CDジョブの実行確認
プッシュが完了するとGitLabのプロジェクト画面にてジョブが実行されます。次のようにdocker run hello-world
が実行されていることが確認できます。
これでGitLab CI/CDのジョブでDockerコマンドを使うことができました。
まとめ
今回はGitLabをDocker Composeで構築してCI/CDの動作確認を行いました。GitLabをDocker Composeで構築することでローカル環境でGitLabを構築してCI/CDの動作確認を行うことができます。
GitLabを使ってCI/CDを実行することで、開発者はコードをリポジトリにプッシュするだけで自動的にテストやビルド、デプロイを行うことができます。GitLabを使ってCI/CDを実行することで開発者は開発に集中することができます。