🫣

「GitLab Runnerの設定と管理: ユーザーごとのRunnerを使い分ける方法」

2024/08/14に公開

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:alpinegitlab/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の作成

  1. GitLab プロジェクトのページに移動
  2. サイドバーの「設定」>「CI/CD」を選択
  3. 「Runners」セクションで「新規プロジェクト Runner」をクリック
  4. ランナーにタグ[1]を設定し、ランナーを作成
  5. Runnerの登録画面のランナー認証トークンをコピー

3.3 Runnerの登録

以下のコマンドを実行して、GitLab Runner を登録します。

docker exec -it gitlab-runner gitlab-runner register

プロンプトに従って、以下の情報を入力してください:

  1. GitLab instance URL:

    https://YOUR_GITLAB_INSTANCE_URL
    
  2. Registration token:

    (GitLabから取得したランナー認証トークンを入力)
    

    トークンの取得方法は、「3.2 Runnerの作成」を参照してください。

  3. Runner name:

    YOUR_RUNNER_NAME
    
  4. Executor:

    docker
    
  5. Default Docker image:

    node:20
    

完了メッセージが表示され、設定が /etc/gitlab-runner/config.toml に保存されます。

これでRunnerの作成・登録が完了です。

4. ユーザーごとのRunnerを使い分けるための.gitlab-ci.yml設定

今回は、ユーザーA,Bで開発をすると仮定して、それぞれがpushした際に、ユーザーごとのRUNNERを使用するよう設定する。

以下は上記の要件の元考えたサンプル設定です:

.gitlab-ci.yml
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

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

dev-common.yml
## 開発環境で行う共通の処理(buildやdeploy等)
.dev-common:
  extends: .common
  variables:
    DOMAIN: google.co.jp
  script:
    - ping -c 1 $DOMAIN

2.3 pro-common.yml

pro-common.yml
## 本番環境で行う共通の処理(buildやdeploy等)
.pro-common:
  extends: .common
  variables:
    DOMAIN: yahoo.co.jp
  script:
    - ping -c 1 $DOMAIN

2.4 .gitlab-ci.yml

.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を使用して、.commonbefore_script.dev-commonscriptを実行する。
  • production_A:ユーザーAがmainブランチにpushしたら、AのRUNNERを使用して、.commonbefore_script.pro-commonscriptを実行する。
  • development_B:ユーザーBがdevブランチにpushしたら、BのRUNNERを使用して、.commonbefore_script.dev-commonscriptを実行する。
  • production_B:ユーザーBがmainブランチにpushしたら、BのRUNNERを使用して、.commonbefore_script.pro-commonscriptを実行する。

5. まとめ

この記事では、GitLab Runnerの導入から設定までの手順を解説しました。特に、各ユーザーが自身のコミットを自身のRunnerで実行する方法に焦点を当てました。これにより、プロジェクトのビルドやデプロイが効率的かつ個別に行えるようになると思います。

今回は、.gitlab-ci.ymlファイル内で$GITLAB_USER_LOGINを使用してユーザーを判別し、tagsで使用するRunnerを指定することで、ユーザーごとに異なるRunnerを使用する方法を紹介しました。GitLabには他にも多くの定義済み変数や、YAML構文があります。要件に合わせてご活用ください。詳細は以下をご覧ください。

もし、より良い方法や改善点があれば、ぜひコメントで教えてください。

脚注
  1. 一意のタグを最低1つ設定してください。(そのタグ名を使ってRunnerを使い分けます。) ↩︎

Discussion