AIを使ってしたい100のこと

生成AIの可能性と、それを使って自分自身を表現する楽しさを伝えることを目指しています。

GitLabからJenkinsパイプラインへのパラメーターの渡し方

はじめに

仕事で、以下のようなCI/CDのCDを行う、Jenkinsパイプラインを作成中です。

  1. GitLabにHelmチャートをコミットしておく。
  2. my-values.yamlがコミットされると、WebhookでJenkinsのパイプラインを起動する。
  3. Jenkinsパイプラインの処理:
    1. GitLabへgit cloneし、Helmチャートをダウンロードする。
    2. helm install -f my-values.yamlを実行し、Helmチャートをインストールする。

Jenkinsパイプラインでパラメーターを受け付けるには、parameters{}セクションを作ればよいことはわかっていました。 しかし、GitLabからWebhookでJenkinsパイプラインを呼び出す際に、どのようにしてパラメーターをJenkinsパイプラインに渡すのかが分かりませんでした。

今回は、このことを生成AIを使って解決していきます。

GitLabのWebhook設定で、Webhookのペイロードにパラメーターを追加する方法

プロンプト

GitLabのWebhook設定で、Webhookのペイロードにパラメーターを追加する方法を教えてください。私は、GitLabからWebhookでJenkinsのパイプラインを起動します。

回答

GitLabのWebhookのペイロードにカスタムパラメーターを追加する方法は、直接GitLabの設定だけでは提供されていませんが、Jenkinsのパイプライン内でカスタムパラメーターを処理する方法があります。以下にその手順を示します。

  1. GitLabのWebhook設定:

    • GitLabのプロジェクト設定に移動します。
    • 「Settings」>「Webhooks」に移動し、新しいWebhookを追加します。
    • Webhook URLを指定します(例: http://your-jenkins-url/project/your-pipeline)。
  2. JenkinsでWebhookを受け取る:

    • Jenkins側でGitLabからのWebhookを受け取るジョブを設定します。
    • Jenkinsのジョブ設定に移動し、「このビルドはパラメーター化されている」をチェックします。
    • 必要なパラメーターを定義します(例: string, choice, booleanなど)。
  3. GitLabのWebhookペイロードを解析:

  4. カスタムパラメーターの処理:

    • GitLabのコミットメッセージやその他のペイロードデータを使って、必要なカスタムパラメーターを処理します。

以下は、JenkinsのDeclarative Pipelineの例です。

pipeline {
    agent any
    parameters {
        string(name: 'CUSTOM_PARAM', defaultValue: '', description: 'Custom parameter from GitLab')
    }
    triggers {
        GenericTrigger(
            genericVariables: [
                [key: 'CUSTOM_PARAM', value: '$.commits[0].message']
            ],
            genericRequestVariables: [
                [key: 'CUSTOM_PARAM', regexpFilter: '.*']
            ],
            token: 'your-webhook-token',
            printContributedVariables: true,
            printPostContent: true
        )
    }
    stages {
        stage('Build') {
            steps {
                script {
                    echo "Custom Parameter: ${params.CUSTOM_PARAM}"
                }
            }
        }
    }
}

この例では、GitLabのコミットメッセージをカスタムパラメーターとして取得し、それをビルドステージで使用しています。

注意点

  • Generic Webhook Trigger PluginをJenkinsにインストールする必要があります。
  • Webhookのトークンはセキュリティのために使用されますので、適切に設定してください。

これで、GitLabのWebhookを通じてカスタムパラメーターをJenkinsのパイプラインに渡すことができます。

Jenkinsで定義したパラメーターの値を、GitLabからWebhookに渡す方法

一つ目の回答で、Jenkinsパイプラインでパラメーターを受け付けるには、parameters{}セクションを作ればよいことが確認できました。

しかし、GitLabからWebhookでJenkinsパイプラインを呼び出す際に、どのようにしてパラメーターをJenkinsパイプラインに渡すのかが分かりません。これを確認していきます。

プロンプト

Jenkinsで定義したパラメーター(例: string, choice, booleanなど)の値を、GitLabからWebhookに渡すには、どうしたら良いのですか?

回答

Jenkinsで定義したパラメーターの値をGitLabからWebhookに渡すには、GitLabのWebhook URLにクエリパラメータとして渡す方法があります。この方法で、GitLabからJenkinsパイプラインにカスタムパラメーターを渡すことができます。以下にその手順を説明します。

1. Jenkinsのパイプライン設定

まず、Jenkinsのパイプラインで必要なパラメーターを定義します。

pipeline {
    agent any
    parameters {
        string(name: 'CUSTOM_STRING', defaultValue: '', description: 'Custom string parameter')
        booleanParam(name: 'CUSTOM_BOOLEAN', defaultValue: false, description: 'Custom boolean parameter')
        choice(name: 'CUSTOM_CHOICE', choices: ['Option1', 'Option2', 'Option3'], description: 'Custom choice parameter')
    }
    stages {
        stage('Build') {
            steps {
                script {
                    echo "Custom String: ${params.CUSTOM_STRING}"
                    echo "Custom Boolean: ${params.CUSTOM_BOOLEAN}"
                    echo "Custom Choice: ${params.CUSTOM_CHOICE}"
                }
            }
        }
    }
}

2. GitLabのWebhook設定

GitLabのWebhook設定で、JenkinsパイプラインをトリガーするためのURLを構築します。このURLには、必要なパラメーターをクエリパラメータとして追加します。

Webhook URLの例:

http://your-jenkins-url/job/your-pipeline/buildWithParameters?token=your-token&CUSTOM_STRING=example&CUSTOM_BOOLEAN=true&CUSTOM_CHOICE=Option1

3. GitLabでWebhookを設定する手順

  1. GitLabプロジェクトの設定に移動します。
  2. 「Settings」>「Webhooks」に移動します。
  3. 「Add webhook」をクリックします。
  4. 上記のようにクエリパラメータを含むWebhook URLを指定します。
  5. トリガーするイベントを選択します(例: Push events)。
  6. 「Add webhook」をクリックして設定を保存します。

4. GitLabのコミットメッセージやペイロードからパラメータを動的に設定

GitLabのWebhook URLを設定するときに、GitLabの変数を使用して動的にパラメーターを設定することもできます。

例:

http://your-jenkins-url/job/your-pipeline/buildWithParameters?token=your-token&CUSTOM_STRING=$CI_COMMIT_MESSAGE&CUSTOM_BOOLEAN=true&CUSTOM_CHOICE=Option1

この例では、$CI_COMMIT_MESSAGEはGitLabのコミットメッセージを参照しています。

まとめ

  1. Jenkinsのパイプラインで必要なパラメーターを定義する。
  2. GitLabのWebhook URLにクエリパラメータとしてJenkinsパラメーターを追加する。
  3. GitLabのプロジェクト設定でWebhookを設定し、適切なイベントに基づいてJenkinsパイプラインをトリガーする。

これにより、GitLabからJenkinsのパイプラインにカスタムパラメーターを渡すことができます。

やってみた感想

  • 「パラメーターの値をGitLabからWebhookに渡すには、GitLabのWebhook URLにクエリパラメータとして渡す方法があります。」
    • これです!欲しかった回答が得られました。
  • クエリパラメーター、すなわちこのような書き方ができるとは、目からうろこでした。(当たり前かもしれませんが)
    • http://your-jenkins-url/job/your-pipeline/buildWithParameters?token=your-token&CUSTOM_STRING=$CI_COMMIT_MESSAGE&CUSTOM_BOOLEAN=true&CUSTOM_CHOICE=Option1
  • この方法が分かってしまえば、GitLabからJenkinsにパラメーターを渡し放題です。