web-dev-qa-db-ja.com

Jenkins Workflow(Pipeline)PluginからJenkinsにログインしているユーザー名を取得する

ClendbeesのJenkinsでPipelineプラグインを使用しています(以前はワークフロープラグインでした)。Groovyスクリプトでユーザー名を取得しようとしていますが、達成できません。

stage 'checkout svn'

node('master') {
      // Get the user name logged in Jenkins
}
19

Build User Vars plugin をインストールしようとしましたか?もしそうなら、あなたは実行することができるはずです

node {
  wrap([$class: 'BuildUser']) {
    def user = env.BUILD_USER_ID
  }
}

または類似。

40
Jesse Glick

Jenkins Pipelineで動作させるには:

インストール ユーザービルド変数プラグイン

次に、次を実行します。

pipeline {
  agent any

  stages {
    stage('build user') {
      steps {
        wrap([$class: 'BuildUser']) {
          sh 'echo "${BUILD_USER}"'
        }
      }
    }
  }
}
12

プラグインなしでこれを行うことは可能です(JOB_BASE_NAMEおよびBUILD_IDは環境内にあります):

def job = Jenkins.getInstance().getItemByFullName(env.JOB_BASE_NAME, Job.class)
def build = job.getBuildByNumber(env.BUILD_ID as int)
def userId = build.getCause(Cause.UserIdCause).getUserId()

また、ユーザーのフルネームを返すgetUserNameもあります。

11
Daan Bakker

環境変数を使用する必要のない、少し短いバージョンを次に示します。

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

rawBuildを使用するには、@NonCPSブロック。

10
Mark Vardy
def jobUserId, jobUserName
//then somewhere
wrap([$class: 'BuildUser']) {
    jobUserId = "${BUILD_USER_ID}"
    jobUserName = "${BUILD_USER}"
}
//then
println("Started By: ${jobUserName}")

このプラグインを使用していました: Build User Vars Plugin 。より多くの変数が利用可能です。

//Below is a generic groovy function to get the XML metadata for a Jenkins build.
//curl the env.BUILD_URL/api/xml parse it with grep and return the string
//I did an or true on curl, but possibly there is a better way
//echo -e "some_string \c" will always return some_string without \n char     
//use the readFile() and return the string
def GetUserId(){
 sh """
 /usr/bin/curl -k -s -u \
 \$USERNAME:\$PASSWORD -o \
 /tmp/api.xml \
 \$BUILD_URL/api/xml || true 

 THE_USERID=`cat /tmp/api.xml | grep -oP '(?<=<userId>).*?(?=</userId>)'`
 echo -e "\$THE_USERID \\c" > /tmp/user_id.txt                               
 """
def some_userid = readFile("/tmp/user_id.txt")
some_userid
}
2
JRova

編集:私は質問を読み直します-以下はあなたにビルドを実行しているユーザー(技術的にはより興味深い場合があります)、トリガーするものではありません)フロントエンドでのビルド(REST-APIまたはWebUI)。 Jenkinsのなりすましを有効にしている場合、結果は同等になるはずです。そうでない場合、ビルドマシンでjenkinsエージェントを所有しているユーザーのみが取得されます。

元の回答:

別の方法は

sh 'export jenkins_user=$(whoami)'

欠点:Linuxに依存し、単一のビルドで複数のエージェントに移植するのが難しい(ただし、認証コンテキストは各スレーブで異なる場合があります)

利点:プラグインをインストールする必要はありません(共有/大規模なJenkinsインスタンスでは注意が必要です)

1
Rick Moritz

@shawn derikレスポンスを変更して、パイプラインで動作するようにしました。

    stage("preserve build user") {
            wrap([$class: 'BuildUser']) {
                GET_BUILD_USER = sh ( script: 'echo "${BUILD_USER}"', returnStdout: true).trim()
            }
        }

その後、その変数を渡すことで、または$ {GET_BUILD_USER}と同じスコープでその変数を後で参照できます。参照した同じプラグインをインストールしました。

0
cgseller