web-dev-qa-db-ja.com

ジョブがタイマーでトリガーされたときにJenkinsでBUILD_USERを取得する方法は?

私は、Jenkinsジョブをトリガーしたユーザーをジョブ後のメールで表示したかったのです。これは、プラグインBuild User Vars Pluginおよびenv変数BUILD_USER。しかし、ジョブがスケジューラーによってトリガーされた場合、この変数は初期化されません。

どうすればこれを達成できますか? EnvInject Pluginというプラグインがあり、それを使用できることを知っています...

しかし、私はこれをどのように使用して解決策を達成できるかを知りたいだけです...

19
Musaffir Lp

これは、Jenkins Build User Vars Pluginビルドを開始したユーザーを含む一連の環境変数を公開します。 BUILD_USER_ID、EMAILなどの環境変数を提供します。

ログインしたユーザーがビルドを手動でトリガーすると、そのユーザーのユーザーIDはBUILD_USER_ID環境変数。

ただし、ビルドがJenkinsタイマー/スケジューラーによって自動的にトリガーされる場合、この環境変数は置換/初期化されません。

詳細については、スクリーンショットを添付 enter image description here

これは、Conditional Build Step Plugin/Run Condition Pluginを使用してジョブに条件を注入することで解決できます。各ジョブに、タイマーまたはスケジューラーによってビルドが発生またはトリガーされたときにのみ変数BUILD_USER_IDを初期化する条件を追加できます、正規表現を使用して条件を設定します。

15
Musaffir Lp

ビルドユーザーvarsプラグインが機能していなかったため、手っ取り早くハックしました。

BUILD_CAUSE_JSON=$(curl --silent ${BUILD_URL}/api/json | tr "{}" "\n" | grep "Started by")
BUILD_USER_ID=$(echo $BUILD_CAUSE_JSON | tr "," "\n" | grep "userId" | awk -F\" '{print $4}')
BUILD_USER_NAME=$(echo $BUILD_CAUSE_JSON | tr "," "\n" | grep "userName" | awk -F\" '{print $4}')
13
Kevin Brotcke

'Build User Vars Plugin'をインストールし、以下のように使用します。-[ https://plugins.jenkins.io/build-user-vars-plugin を参照

enter image description here

Jenkinsジョブの設定のSet jenkins user build variablesの下にあるBuild Environmentチェックボックスを必ずチェックしてください。

enter image description here

次のように、「Execute Shell」と「Env Inject」プラグインの組み合わせを使用しています。

  1. シェルパラメーター置換を使用して既定値を書き込み、その値をファイルにエコーする「シェルの実行」ビルドステップを作成します。以下のスクリーンショットで強調表示されている例。
  2. 「Env Inject」ファイルを使用して、設定するプロパティとしてそのファイルを読み取ります。

Jenkins build steps to default variables

3
bishop

email-extプラグイン からのトークン$ BUILD_CAUSEはあなたが探しているものです。

の直後にAttach build log電子メールコンテンツの構成のコンボボックス。

いくつかのトークンはプラグインによって追加されますが、これはデフォルトで使用可能になっているはずです。

編集:ビショップがコメントで指摘したように、 EnvInjectプラグイン を使用する場合、$ BUILD_CAUSEトークンは異なる動作をするように変更されます。

2
Dominik Gebhart

Slack/flockグループの1つにビルドイニシエーター情報をトリガーしたいので、次の方法でDeclarativeな方法で記述してビルドイニシエーターの電子メールと名前を取得しました。

私はここで印刷していますが、環境変数に保存したり、自分の都合に応じてファイルパスを指定して1つのファイルに書き込むことができます。

pipeline {
environment {
    BRANCH_NAME = "${env.BRANCH_NAME}"
    }
agent any

stages{
        stage('Build-Initiator-Info'){
                sh 'echo $(git show -s --pretty=%ae)'
                sh 'echo $(git show -s --pretty=%an)'
        }
           }

}

1
ShreePrakash

これは、Jenkinsパイプラインジョブで[今すぐビルド]をクリックしたユーザー名を取得します。

@NonCPS
def getBuildUser() {
    return currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
}
1
Andy

似ているが、実際にはJenkins 2.1.xで動作しており、理解しやすい方法であることがわかりました。そして、プラグインなしでも動作します。

if (currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')['userId']){
    // Will be run only if someone user triggers build
    // Because in other cases this contructions returns null
}

この構成では、 here で説明されているクラスを使用できます。それらは、使用可能な値を持つマップを返します。

0
Mike Pylypyshyn

ムサフィールLpの答え について詳しく説明します。 Conditional Build StepプラグインBuild Causeを直接サポートするようになりました- Run Condition Plugin が必要ですまた。

タイマーによってビルドが開始されたことを検出したい場合は、Run?値のBuild CauseBuild Causewith:TimerTrigger

enter image description here

これは、正規表現を使用するよりも少し単純で堅牢です。検出できる他のトリガーもあります。たとえば、ビルドがソース管理のコミットの結果であった場合、SCMTriggerを選択できます。

0
ptha