是否可以在Jenkins共享库中使用构建用户vars插件?

lokaqttq  于 2022-11-02  发布在  Jenkins
关注(0)|答案(2)|浏览(255)

我正在实现向CD系统公开Jenkins管道的触发用户的功能,因此我获取了构建用户vars插件:https://plugins.jenkins.io/build-user-vars-plugin/
插件的工作方式似乎是你 Package 你需要暴露变量的代码,如下所示:

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

我在一个普通的管道上试过这个,只是附和了一下,一切都很好。
然后我尝试在我们的共享库中实现它,以便在所有对CD的调用中都发生这种情况,但我遇到了一个错误。

wrap([$class: 'BuildUser']) {
    jobBuildUrl ="${jobBuildUrl}&USER_ID=${env.BUILD_USER_ID}"
}

[2021-08- 19 T10:20:22.852Z]哈德逊.远程处理.代理异常:groovy.lang.MissingMethodException:无方法签名:wrap()适用于参数类型:(请参见第2章)值:[[$class:BuildUser],您可以在这里找到您想要的插件。
有没有办法在一个共享库中使用这个插件代码?如果有,怎么做?
我是领导不相信,但我认为这是值得一问的。作为参考,有这样一个突出的问题:https://issues.jenkins.io/browse/JENKINS-44741
边注,我试图做到这一点,而不触及每个人的管道本身。如果这是不可能的插件,我可能只是实现我自己的版本,它在共享库。

r7xajy2e

r7xajy2e1#

该插件很难使用,有很多问题,其中之一是与共享库。
相反,只需自己实现它,它相对容易,并允许您更多地控制所做的逻辑、错误处理和返回的参数。
您可以使用类似于以下的代码:

/**

* Get the last upstream build that triggered the current build
* @return Build object (org.jenkinsci.plugins.workflow.job.WorkflowRun) representing the upstream build
* /

@NonCPS
def getUpstreamBuild() {
   def build = currentBuild.rawBuild
   def upstreamCause
   while (upstreamCause = build.getCause(hudson.model.Cause$UpstreamCause)) {
       build = upstreamCause.upstreamRun
   }
   return build
}

/**

* Get the properties of the build Cause (the event that triggered the build)
* @param upstream If true (Default) return the cause properties of the last upstream job (If the build was triggered by another job or by a chain of jobs)
* @return Map representing the properties of the user that triggered the current build.
* Contains keys: USER_NAME, USER_ID
* /

@NonCPS
def getUserCauseProperties(Boolean upstream = true) {
   def build = upstream ? getUpstreamBuild() : currentBuild.rawBuild
   def cause = build.getCause(hudson.model.Cause$UserIdCause)
   if (cause) {
       return ['USER_NAME': cause.userName, 'USER_ID': cause.userId]
   }
   println "Job was not started by a user, it was ${build.getCauses()[0].shortDescription}"
   return [:]
}
zaqlnxep

zaqlnxep2#

我也无法使用wrap([$class:'BuildUser'])插入groovy方法。因此我想我找到了另一种方法,似乎可以做到这一点。您可以通过以下方法获得用户名和用户ID(可能会返回电子邮件,这取决于您的设置):

def build = currentBuild.rawBuild

def cause = build.getCause(hudson.model.Cause.UserIdCause.class)

def userName = cause.getUserName() // or use getUserId()

相关问题