Runnerの新しい登録ワークフロー、各種ランナータイプとタグ
(トップページはこちら) - (GitLab Runnerを始める)
GitLab CI/CD を効果的に運用するには、Runner の適切な登録と管理が不可欠です。本記事では、GitLab 15.10 以降で導入された新しい Runner 登録ワークフローと、ジョブの実行を制御するタグの活用方法について解説します。
1. Runner 登録の新しいワークフロー
1.1 従来の方法からの移行
GitLab 16.0 で、Runner の登録方法が大きく変わりました。従来の登録トークン方式は非推奨となり、新しい認証トークン方式への移行が推奨されています。
1.2 新しい登録方法の利点
新しいワークフローには、以下のような利点があります。
セキュリティの向上
- Runner の所有権記録が保持されます
- 認証トークンは
glrt-プレフィックスで識別可能です - トークンの追跡性が向上し、セキュリティリスクが低減します
運用の効率化
- 同じ認証トークンを複数のホストで再利用できます
- 各 Runner マネージャーには一意のシステム ID が付与されます
- UI 上で同一 Runner として表示されるため、管理が容易になります
1.3 実際の登録手順
1.3.1 インスタンス Runner の作成
管理者権限を持つユーザーは、以下の手順でインスタンス Runner を作成できます。
- Admin Area > CI/CD > Runners に移動します
- Create instance runner を選択します
- オペレーティングシステムを選択します
- タグを設定します(詳細は 3 章を参照)
- Create runner をクリックします
- 表示された認証トークンをコピーします(短時間のみ表示されます)
1.3.2 コマンドラインでの登録
Linux 環境での登録例
# インタラクティブモード
sudo gitlab-runner register
# 非インタラクティブモード
sudo gitlab-runner register \
--non-interactive \
--url "https://gitlab.com/" \
--token "$RUNNER_TOKEN" \
--executor "docker" \
--docker-image alpine:latest \
--description "本番環境用Runner"
Docker コンテナでの登録例
docker run --rm -it \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
gitlab/gitlab-runner register \
--non-interactive \
--url "https://gitlab.com/" \
--token "$RUNNER_TOKEN" \
--executor "docker" \
--docker-image alpine:latest \
--description "開発環境用Runner"
プロキシ環境での登録
プロキシ経由で接続する場合は、環境変数を設定します。
export HTTP_PROXY=http://proxy.example.com:3128
export HTTPS_PROXY=http://proxy.example.com:3128
sudo -E gitlab-runner register
2. Runner のスコープと種類
GitLab では、3 種類の Runner スコープが用意されています。それぞれの特性を理解し、用途に応じて使い分けることが重要です。
2.1 インスタンス Runner
すべてのプロジェクトで利用可能な Runner です。
特徴
- GitLab インスタンス全体で共有されます
- 公平使用キューアルゴリズムでジョブを処理します
- 複数のプロジェクトで同様の要件がある場合に効率的です
適用シーン
- 汎用的なビルド環境が必要な場合
- 多数のプロジェクトで共通の CI/CD 処理を行う場合
- リソースを効率的に活用したい場合
ジョブ割り当ての仕組み
公平使用キューは、実行中のジョブ数が最も少ないプロジェクトを優先します。これにより、特定のプロジェクトが Runner を独占することを防ぎます。
例えば、以下のジョブがキューにある場合を考えます。
- プロジェクト A: ジョブ 1、ジョブ 2、ジョブ 3
- プロジェクト B: ジョブ 4、ジョブ 5
- プロジェクト C: ジョブ 6
複数のジョブが同時実行される場合、以下の順序で処理されます。
- ジョブ 1(プロジェクト A、実行中ジョブ数: 0)
- ジョブ 4(プロジェクト B、実行中ジョブ数: 0)
- ジョブ 6(プロジェクト C、実行中ジョブ数: 0)
- ジョブ 2(プロジェクト A、実行中ジョブ数: 1)
- ジョブ 5(プロジェクト B、実行中ジョブ数: 1)
- ジョブ 3(プロジェクト A、実行中ジョブ数: 2)
2.2 グループ Runner
グループ内のすべてのプロジェクトで利用可能な Runner です。
特徴
- グループとそのサブグループ内のプロジェクトで共有されます
- FIFO(先入れ先出し)キューでジョブを処理します
- グループオーナーが管理します
適用シーン
- 特定のチームやプロジェクトグループ専用の環境が必要な場合
- グループ固有の設定やツールを使用する場合
- アクセス制御を細かく管理したい場合
作成手順
- グループの Build > Runners に移動します
- Create group runner を選択します
- タグと説明を設定します
- 必要に応じて Run untagged を有効化します
- Create runner をクリックします
2.3 プロジェクト Runner
特定のプロジェクト専用の Runner です。
特徴
- 1 つのプロジェクトに紐付けられます(複数プロジェクトで共有も可能)
- FIFO キューでジョブを処理します
- プロジェクトメンテナが管理します
適用シーン
- 特定の認証情報が必要なデプロイジョブ
- 大量の CI アクティビティがあるプロジェクト
- セキュリティ要件が厳しいプロジェクト
- 専用のハードウェアリソースが必要な場合
作成手順
- プロジェクトの Settings > CI/CD に移動します
- Runners セクションを展開します
- Create project runner を選択します
- タグと説明を設定します
- Create runner をクリックします
3. タグを使ったジョブ制御
タグは、特定の Runner でジョブを実行するための重要な仕組みです。適切なタグ戦略により、ジョブの実行環境を細かく制御できます。
3.1 タグの基本概念
タグの役割
- ジョブと Runner をマッチングさせます
- 実行環境の特性を表現します
- 複数のタグを組み合わせて、より詳細な条件を指定できます
タグのマッチング規則
- ジョブに指定されたすべてのタグを持つ Runner でのみ実行されます
- タグが指定されていないジョブは、Run untagged が有効な Runner で実行されます
3.2 基本的なタグの使用例
# 基本的なタグの使用例
build-job:
stage: build
tags:
- docker
- linux
script:
- echo "Docker と Linux タグを持つ Runner で実行"
deploy-production:
stage: deploy
tags:
- production
- aws
script:
- echo "本番環境の AWS Runner で実行"
environment: production
3.3 タグなしジョブの実行
Runner 作成時に Run untagged を有効にすると、タグが指定されていないジョブも実行できます。
# タグなしジョブの例
test-job:
stage: test
script:
- echo "タグなしジョブを実行可能な Runner で実行"
注意点
- タグなしジョブは、Run untagged が有効な Runner でのみ実行されます
- セキュリティ上、本番環境の Runner では Run untagged を無効にすることを推奨します
3.4 複数タグの活用
複数のタグを組み合わせることで、より細かい制御が可能です。
# 複数タグの組み合わせ例
integration-test:
stage: test
tags:
- docker
- postgres
- redis
script:
- echo "Docker、PostgreSQL、Redis が利用可能な Runner で実行"
services:
- postgres:latest
- redis:latest
3.5 実践的なタグ戦略
実際の運用では、以下のようなタグ戦略が効果的です。
推奨されるタグの分類
- 実行環境: docker, shell, kubernetes
- OS: linux, windows, macos
- 用途: build, test, deploy
- 環境: development, staging, production
- リソース: gpu, high-memory, ssd
- 依存サービス: postgres, redis, mysql
実装例
variables:
DOCKER_IMAGE: "ruby:3.1"
stages:
- build
- test
- deploy
# ビルドジョブ: Docker Runner を使用
build:
stage: build
tags:
- docker
- linux
- build
script:
- bundle install
- bundle exec rake assets:precompile
artifacts:
paths:
- public/assets/
expire_in: 1 day
# テストジョブ: Docker + データベース環境
test:
stage: test
tags:
- docker
- linux
- postgres
services:
- postgres:14
variables:
POSTGRES_DB: test_db
POSTGRES_USER: test_user
POSTGRES_PASSWORD: test_password
script:
- bundle exec rspec
coverage: '/\(\d+\.\d+\%\) covered/'
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage/coverage.xml
# ステージング環境へのデプロイ
deploy-staging:
stage: deploy
tags:
- staging
- shell
- linux
script:
- ./deploy.sh staging
environment:
name: staging
url: https://staging.example.com
on_stop: stop-staging
only:
- develop
# ステージング環境の停止
stop-staging:
stage: deploy
tags:
- staging
- shell
- linux
script:
- ./stop.sh staging
environment:
name: staging
action: stop
when: manual
only:
- develop
# 本番環境へのデプロイ
deploy-production:
stage: deploy
tags:
- production
- shell
- linux
script:
- ./deploy.sh production
environment:
name: production
url: https://example.com
only:
- main
when: manual
4. 設定テンプレートを使った高度な登録
複雑な設定が必要な場合、設定テンプレートを使用できます。これにより、コマンドラインでは指定できない詳細な設定が可能になります。
4.1 設定テンプレートの基本
テンプレートの利点
- コマンドライン引数では指定できない設定が可能です
- 設定の再利用が容易になります
- 複雑な設定を管理しやすくなります
注意事項
- テンプレートには 1 つの
[[runners]]セクションのみ含めることができます - グローバルオプションはサポートされていません
- テンプレートの設定とコマンドライン引数が競合する場合、コマンドライン引数が優先されます
4.2 Kubernetes Executor の例
# template.toml
[[runners]]
[runners.kubernetes]
[runners.kubernetes.volumes]
[[runners.kubernetes.volumes.empty_dir]]
name = "cache_dir"
mount_path = "/cache"
medium = "Memory"
登録コマンドです。
sudo gitlab-runner register \
--template-config /tmp/template.toml \
--non-interactive \
--url "https://gitlab.com" \
--token "$RUNNER_TOKEN" \
--name "k8s-runner" \
--executor kubernetes
4.3 Docker サービスの設定例
統合テスト用に複数のサービスを含む Runner を設定する例です。
# services-template.toml
[[runners]]
[runners.docker]
[[runners.docker.services]]
name = "mysql:latest"
[[runners.docker.services]]
name = "redis:latest"
登録コマンドです。
sudo gitlab-runner register \
--non-interactive \
--url "https://gitlab.com" \
--token "$RUNNER_TOKEN" \
--template-config /tmp/services-template.toml \
--description "統合テスト用Runner" \
--executor "docker" \
--docker-image ruby:3.1
4.4 環境変数を使った設定
テンプレートファイルのパスを環境変数で指定することもできます。
# .gitlab-ci.yml での設定例
variables:
TEMPLATE_CONFIG_FILE: "/path/to/template.toml"
この設定により、register コマンドで毎回ファイルパスを指定する必要がなくなります。
5. Runner の管理とメンテナンス
5.1 Runner のステータス管理
Runner は以下のステータスを持ちます。適切な監視により、問題を早期に発見できます。
| ステータス | 説明 | 対処方法 |
|---|---|---|
| online | 過去 2 時間以内に GitLab と通信し、ジョブを実行可能 | 正常な状態です |
| offline | 2 時間以上 GitLab と通信しておらず、ジョブを実行不可 | Runner の再起動や接続確認が必要です |
| stale | 7 日間以上 GitLab と通信していない | Runner の削除を検討してください |
| never_contacted | 一度も GitLab と通信していない | gitlab-runner run コマンドを実行してください |
5.2 Runner の一時停止と再開
Runner を一時的に停止することができます。メンテナンス作業時などに有用です。
UI での操作
- Admin Area > CI/CD > Runners に移動します
- 対象の Runner を検索します
- Pause アイコンをクリックします
再開する場合
- Resume アイコンをクリックします
注意点
- 一時停止中の Runner は新しいジョブを受け付けません
- 実行中のジョブは完了まで継続されます
5.3 Runner の削除
不要になった Runner は削除できます。
削除前の確認事項
- Runner が他のプロジェクトで使用されていないか確認します
- 実行中のジョブがないか確認します
- 削除は永続的で、元に戻せません
削除手順
- Admin Area > CI/CD > Runners に移動します
- 対象の Runner の Delete runner アイコンをクリックします
- Permanently delete runner を選択します
削除後の処理
Runner を削除した後、ホストマシンの config.toml から設定を削除することを推奨します。
# Runner の登録解除
sudo gitlab-runner unregister --name "runner-name"
# または、すべての Runner を登録解除
sudo gitlab-runner unregister --all-runners
5.4 Runner のアップグレード
Runner のバージョンは定期的にアップグレードすることを推奨します。
アップグレードの確認
UI で Runner のバージョンステータスを確認できます。
- Outdated - recommended: セキュリティ上の理由から、早急なアップグレードが推奨されます
- Outdated - available: 新しいバージョンが利用可能ですが、緊急性は低いです
アップグレード手順(Linux)
# パッケージリストの更新
sudo apt-get update
# GitLab Runner のアップグレード
sudo apt-get install gitlab-runner
# バージョンの確認
gitlab-runner --version
5.5 メンテナンスノートの活用
Runner にメンテナンスノートを追加することで、管理情報を記録できます。
設定例
sudo gitlab-runner register \
--non-interactive \
--url "https://gitlab.com/" \
--token "$RUNNER_TOKEN" \
--executor "docker" \
--docker-image alpine:latest \
--description "本番環境用Runner" \
--maintenance-note "担当者: 山田太郎、連絡先: yamada@example.com"
活用シーン
- 担当者の連絡先を記録します
- メンテナンススケジュールを記録します
- 特記事項や制約事項を記録します
6. 移行時の注意点
6.1 GitLab 17.0 以降での対応
GitLab 17.0 以降、登録トークンはデフォルトで無効化されています。
重要な変更点
- 新規 Runner の登録には認証トークンが必須です
- 既存の Runner は影響を受けません
- 登録トークンを継続使用する場合は、明示的な有効化が必要です
継続して使用する場合(GitLab.com)
トップレベルグループの設定で有効化できます。
- グループの Settings > CI/CD に移動します
- Runners セクションを展開します
- Allow members of projects and groups to create runners with runner registration tokens を有効化します
継続して使用する場合(GitLab Self-Managed)
Admin Area で設定します。
- Admin Area > Settings > CI/CD に移動します
- Runners セクションを展開します
- Runner registration の設定を変更します
6.2 既存 Runner への影響
重要なポイント
- 既存の Runner は引き続き動作します
- 新規登録のみが影響を受けます
- GitLab Runner Helm Chart を使用している場合は、設定の更新が必要です
移行計画の立案
段階的な移行を推奨します。
- フェーズ 1: 新規 Runner は認証トークン方式で登録します
- フェーズ 2: 既存 Runner の棚卸しを実施します
- フェーズ 3: 不要な Runner を削除します
- フェーズ 4: 残りの Runner を認証トークン方式で再登録します
6.3 Helm Chart での設定変更
GitLab Runner Helm Chart を使用している場合、Secret の設定を変更する必要があります。
従来の設定
apiVersion: v1
kind: Secret
metadata:
name: gitlab-runner-secret
type: Opaque
data:
runner-registration-token: "REDACTED"
runner-token: ""
新しい設定
apiVersion: v1
kind: Secret
metadata:
name: gitlab-runner-secret
type: Opaque
data:
runner-registration-token: "" # 空文字列にする(互換性のため残す)
runner-token: "REDACTED" # 認証トークンを設定
values.yaml の変更
# 以下のフィールドは認証トークン方式では使用されません
# これらの設定は UI または API で行います
# runnerRegistrationToken: ""
# locked: true
# tags: ""
# runUntagged: true
# protected: true
# 代わりに runnerToken を使用
runnerToken: "glrt-xxxxxxxxxxxxx"
注意事項
- runner-registration-token は空文字列に設定できない環境もあります
- その場合、任意の文字列を設定しても問題ありません(runner-token が優先されます)
6.4 既知の問題と回避策
Pod 名が表示されない問題
Helm Chart で新しいワークフローを使用すると、Runner 詳細ページに Pod 名が表示されません。この問題は既知の制限事項です。
トークンローテーション時の問題
複数の Runner マネージャーで同じ認証トークンを使用している場合、トークンローテーション時に最初の Runner マネージャーのみが新しいトークンを受け取ります。他の Runner マネージャーは手動で更新する必要があります。
回避策
- 各 Runner マネージャーに個別の認証トークンを使用します
- トークンローテーション後、すべての Runner マネージャーの設定を確認します
7. トラブルシューティング
7.1 よくあるエラーと対処法
7.1.1 エラー: Check registration token
エラーメッセージ
ERROR: Registering runner... failed
runner=xxxxx status=couldn't execute POST against https://gitlab.com/api/v4/runners:
403 Forbidden (check registration token)
原因
- 登録トークンが無効です
- GitLab インスタンスがトークンを認識できません
- トークンの有効期限が切れています
対処法
- トークンが正しいか確認します
- トークンをコピー&ペーストする際、余分な空白が含まれていないか確認します
- 管理者に登録が許可されているか確認します
- 新しいトークンを生成して再試行します
7.1.2 エラー: 410 Gone - runner registration disallowed
エラーメッセージ
ERROR: Registering runner... failed
runner=xxxxx status=couldn't execute POST against https://gitlab.com/api/v4/runners:
410 Gone - runner registration disallowed
原因
- 登録トークンによる登録が無効化されています
- GitLab 17.0 以降でデフォルト設定のままです
対処法
- 新しい認証トークン方式を使用します(推奨)
- または、管理者に登録トークンの有効化を依頼します
7.1.3 Runner が接続できない場合
確認項目
- URL の確認
# 正しい URL の例
https://gitlab.com
https://gitlab.example.com
# 誤った URL の例(プロジェクトパスを含めない)
https://gitlab.com/group/project
- ネットワーク接続の確認
# GitLab インスタンスへの接続確認
curl -I https://gitlab.com
# DNS 解決の確認
nslookup gitlab.com
- プロキシ設定
プロキシ経由で接続する場合は、環境変数を設定します。
export HTTP_PROXY=http://proxy.example.com:3128
export HTTPS_PROXY=http://proxy.example.com:3128
export NO_PROXY=localhost,127.0.0.1
sudo -E gitlab-runner register
永続的にプロキシを設定する場合は、config.toml に記述します。
[[runners]]
environment = ["HTTP_PROXY=http://proxy.example.com:3128", "HTTPS_PROXY=http://proxy.example.com:3128"]
7.1.4 ジョブが Runner で実行されない場合
原因と対処法
-
タグの不一致
- ジョブのタグと Runner のタグが一致しているか確認します
- Runner で Run untagged が有効になっているか確認します
-
Runner が一時停止中
- Runner のステータスを確認します
- 必要に応じて Resume します
-
Runner がオフライン
- Runner のステータスを確認します
- Runner プロセスが起動しているか確認します
# Runner の状態確認
sudo gitlab-runner status
# Runner の起動
sudo gitlab-runner start
7.2 ログの確認方法
問題の原因を特定するため、ログを確認します。
Runner のログ確認(Linux)
# systemd を使用している場合
sudo journalctl -u gitlab-runner -f
# ログファイルを直接確認
sudo tail -f /var/log/gitlab-runner/gitlab-runner.log
Docker コンテナのログ確認
# コンテナのログを確認
docker logs gitlab-runner -f
デバッグモードでの実行
より詳細なログを出力する場合は、デバッグモードで実行します。
sudo gitlab-runner --debug run
7.3 設定ファイルの確認
Runner の設定は config.toml に保存されています。
設定ファイルの場所
- Linux:
/etc/gitlab-runner/config.toml - macOS:
/Users/gitlab-runner/.gitlab-runner/config.toml - Windows:
C:\GitLab-Runner\config.toml
設定例
concurrent = 4
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "production-runner"
url = "https://gitlab.com"
token = "glrt-xxxxxxxxxxxxx"
executor = "docker"
[runners.docker]
image = "alpine:latest"
privileged = false
volumes = ["/cache"]
8. まとめ
GitLab Runner の新しい登録ワークフローは、セキュリティと管理性を大幅に向上させます。認証トークン方式への移行により、Runner の所有権が明確になり、トークンの追跡が容易になりました。
8.1 重要なポイント
セキュリティ
- 新規 Runner は認証トークン方式で登録してください
- 認証トークンは
glrt-プレフィックスで識別できます - トークンは短時間のみ UI に表示されるため、安全に保管してください
運用効率
- タグを効果的に活用し、ジョブの実行環境を制御してください
- Runner のスコープ(インスタンス、グループ、プロジェクト)を適切に選択してください
- 定期的に Runner のステータスを確認し、不要な Runner は削除してください
移行計画
- 既存の Runner は引き続き動作しますが、計画的に移行を進めてください
- GitLab 17.0 以降では、登録トークンがデフォルトで無効化されています
- Helm Chart を使用している場合は、設定の更新が必要です
8.2 次のステップ
短期的な対応(1〜2週間)
- 既存の登録トークンを使用している Runner を確認します
- 新しい認証トークン方式での Runner 作成を試します
- タグ戦略を見直し、命名規則を統一します
中期的な対応(1〜3ヶ月)
- 既存 Runner の棚卸しを実施します
- 不要な Runner を削除します
- Runner のアップグレード計画を立案します
長期的な対応(3〜6ヶ月)
- すべての Runner を認証トークン方式に移行します
- Runner の監視体制を整備します
- 定期的なメンテナンススケジュールを確立します
8.3 参考情報
公式ドキュメント
- GitLab Runner のインストール方法
- Executor の種類と選択基準
- 高度な設定オプション
コミュニティリソース
- GitLab フォーラムでの質問と回答
- ベストプラクティスの共有
- トラブルシューティング事例
GitLab CI/CD の効率的な運用には、適切な Runner 管理が不可欠です。本記事の内容を参考に、より安全で効率的な CI/CD 環境を構築してください。