「GitLab Runnerの設定と管理: ユーザーごとのRunnerを使い分ける方法」
GitLab Runnerとは
GitLab RunnerはGitLab CI/CDと連携してパイプラインでジョブを実行するアプリケーションです。
1. はじめに
本記事では、Mac上のDockerコンテナ内でGitLab Runnerを実行し、自分のコミットは自分のRunnerを使用する方法について紹介します。
2. 前提条件
- Docker
- GitLabアカウント
- GitLabプロジェクトへアクセス
3. 導入手順
3.1 Dockerイメージをインストールしてコンテナを起動
Mac の/Users/Shared
ディレクトリを使用して行います。以下のコマンドを実行します。また、gitlab/gitlab-runner:alpine
は gitlab/gitlab-runner:latest
に変更可能です。
$ docker run -d --name gitlab-runner --restart always \
-v /Users/Shared/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:alpine
3.2 Runnerの作成
- GitLab プロジェクトのページに移動
- サイドバーの「設定」>「CI/CD」を選択
- 「Runners」セクションで「新規プロジェクト Runner」をクリック
- ランナーにタグ[1]を設定し、ランナーを作成
- Runnerの登録画面のランナー認証トークンをコピー
3.3 Runnerの登録
以下のコマンドを実行して、GitLab Runner を登録します。
docker exec -it gitlab-runner gitlab-runner register
プロンプトに従って、以下の情報を入力してください:
-
GitLab instance URL:
https://YOUR_GITLAB_INSTANCE_URL
-
Registration token:
(GitLabから取得したランナー認証トークンを入力)
トークンの取得方法は、「3.2 Runnerの作成」を参照してください。
-
Runner name:
YOUR_RUNNER_NAME
-
Executor:
docker
-
Default Docker image:
node:20
完了メッセージが表示され、設定が /etc/gitlab-runner/config.toml
に保存されます。
これでRunnerの作成・登録が完了です。
4. ユーザーごとのRunnerを使い分けるための.gitlab-ci.yml設定
今回は、ユーザーA,Bで開発をすると仮定して、それぞれがpushした際に、ユーザーごとのRUNNERを使用するよう設定する。
以下は上記の要件の元考えたサンプル設定です:
stages:
- development
- production
## 全環境で行う共通の処理(setup等) ##
.common:
image: php:8.3-cli
before_script:
# Composer install
- php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
- php composer-setup.php
- php -r "unlink('composer-setup.php');"
# Nodejs install
- curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
- apt-get install -y nodejs zip unzip git iputils-ping net-tools
## 開発環境で行う共通の処理(buildやdeploy等)
.dev-common:
extends: .common
variables:
DOMAIN: google.co.jp
script:
## 本来はここにbuildやdeploy等のscriptを記述
- ping -c 1 $DOMAIN
## 本番環境で行う共通の処理(buildやdeploy等)
.pro-common:
extends: .common
variables:
DOMAIN: yahoo.co.jp
script:
## 本来はここにbuildやdeploy等のscriptを記述
- ping -c 1 $DOMAIN
############################
## ユーザーAのpush時のジョブ ##
############################
## devブランチ
development_A:
stage: development
extends: .dev-common
rules:
- if: '$CI_COMMIT_BRANCH == "dev" && $GITLAB_USER_LOGIN == "(Aのユーザー名)"'
when: manual
## 一意に設定したタグを使用する
tags:
- (AのRUNNERタグ名)
## mainブランチ
production_A:
stage: production
extends: .pro-common
rules:
- if: '$CI_COMMIT_BRANCH == "main" && $GITLAB_USER_LOGIN == "(Aのユーザー名)"'
when: manual
## 一意に指定したタグを使用する
tags:
- (AのRUNNERタグ名)
############################
## ユーザーBのpush時のジョブ ##
############################
## devブランチ
development_B:
stage: development
extends: .dev-common
rules:
- if: '$CI_COMMIT_BRANCH == "dev" && $GITLAB_USER_LOGIN == "(Bのユーザー名)"'
when: manual
## 一意に指定したタグを使用する
tags:
- (BのRUNNERタグ名)
## mainブランチ
production_B:
stage: production
extends: .pro-common
rules:
- if: '$CI_COMMIT_BRANCH == "main" && $GITLAB_USER_LOGIN == "(Bのユーザー名)"'
when: manual
## 一意に指定したタグを使用する
tags:
- (BのRUNNERタグ名)
.ymlファイルを分けて管理したい場合
1. 新しく下記のような構成でファイルを作成:
.
├── .gitlab-ci.yml
├── includes
│ ├── common.yml
│ ├── dev-common.yml
│ └── pro-common.yml
2. 各種.ymlファイルの記述:
2.1 common.yml
## 全環境で行う共通の処理(setup等) ##
.common:
image: php:8.3-cli
before_script:
# Composer install
- php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
- php composer-setup.php
- php -r "unlink('composer-setup.php');"
# Nodejs install
- curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
- apt-get install -y nodejs zip unzip git iputils-ping net-tools
2.2 dev-common.yml
## 開発環境で行う共通の処理(buildやdeploy等)
.dev-common:
extends: .common
variables:
DOMAIN: google.co.jp
script:
- ping -c 1 $DOMAIN
2.3 pro-common.yml
## 本番環境で行う共通の処理(buildやdeploy等)
.pro-common:
extends: .common
variables:
DOMAIN: yahoo.co.jp
script:
- ping -c 1 $DOMAIN
2.4 .gitlab-ci.yml
stages:
- development
- production
#############################
## includeを使用して呼び出し ##
#############################
include:
- local: 'includes/common.yml'
- local: 'includes/dev-common.yml'
- local: 'includes/pro-common.yml'
############################
## ユーザーAのpush時のジョブ ##
############################
## devブランチ
development_A:
stage: development
extends: .dev-common
rules:
- if: '$CI_COMMIT_BRANCH == "dev" && $GITLAB_USER_LOGIN == "(Aのユーザー名)"'
when: manual
tags:
- (AのRUNNERタグ名)
## mainブランチ
production_A:
stage: production
extends: .pro-common
rules:
- if: '$CI_COMMIT_BRANCH == "main" && $GITLAB_USER_LOGIN == "(Aのユーザー名)"'
when: manual
tags:
- (AのRUNNERタグ名)
############################
## ユーザーBのpush時のジョブ ##
############################
## devブランチ
development_B:
stage: development
extends: .dev-common
rules:
- if: '$CI_COMMIT_BRANCH == "dev" && $GITLAB_USER_LOGIN == "(Bのユーザー名)"'
when: manual
tags:
- (BのRUNNERタグ名)
## mainブランチ
production_B:
stage: production
extends: .pro-common
rules:
- if: '$CI_COMMIT_BRANCH == "main" && $GITLAB_USER_LOGIN == "(Bのユーザー名)"'
when: manual
tags:
- (BのRUNNERタグ名)
設定の説明
- stages: ジョブを実行するステージを定義します。
-
.common: 共通の設定をまとめたセクションです。すべてのジョブで共通の
before_script
を定義しています。 -
.dev-common: 開発環境に対して行う共通の
script
を定義しています。 -
.pro-common: 本番環境に対して行う共通の
script
を定義しています。 -
development_A:ユーザーAがdevブランチにpushしたら、
AのRUNNER
を使用して、.common
のbefore_script
と.dev-common
のscript
を実行する。 -
production_A:ユーザーAがmainブランチにpushしたら、
AのRUNNER
を使用して、.common
のbefore_script
と.pro-common
のscript
を実行する。 -
development_B:ユーザーBがdevブランチにpushしたら、
BのRUNNER
を使用して、.common
のbefore_script
と.dev-common
のscript
を実行する。 -
production_B:ユーザーBがmainブランチにpushしたら、
BのRUNNER
を使用して、.common
のbefore_script
と.pro-common
のscript
を実行する。
5. まとめ
この記事では、GitLab Runnerの導入から設定までの手順を解説しました。特に、各ユーザーが自身のコミットを自身のRunnerで実行する方法に焦点を当てました。これにより、プロジェクトのビルドやデプロイが効率的かつ個別に行えるようになると思います。
今回は、.gitlab-ci.yml
ファイル内で$GITLAB_USER_LOGIN
を使用してユーザーを判別し、tags
で使用するRunnerを指定することで、ユーザーごとに異なるRunnerを使用する方法を紹介しました。GitLabには他にも多くの定義済み変数や、YAML構文があります。要件に合わせてご活用ください。詳細は以下をご覧ください。
もし、より良い方法や改善点があれば、ぜひコメントで教えてください。
-
一意のタグを最低1つ設定してください。(そのタグ名を使ってRunnerを使い分けます。) ↩︎
Discussion