当前位置: 首页 > 知识库问答 >
问题:

Git SCM触发的管道的Jenkins BUILD_USER_ID缺少PropertyException

郑景胜
2023-03-14

我需要从 Jenkins 管道中获取BUILD_USER_ID,并使用本教程成功实现:这里

它在用户手动触发时工作,但在GitSCM触发时返回错误。

groovy.lang.MissingPropertyException:类:groovy.lang.Binding没有这样的属性:BUILD_USER_ID

请帮帮忙。

共有1个答案

佴普松
2023-03-14

仅当生成具有UserIdCause时才设置BUILD_USER_ID:

https://github.com/jenkinsci/build-user-vars-plugin/blob/master/src/main/java/org/jenkinsci/plugins/builduser/BuildUser.java#L84-L88

UserIdCause userIdCause = (UserIdCause) build.getCause(UserIdCause.class);
        if(new UserIdCauseDeterminant().setJenkinsUserBuildVars(userIdCause, variables)) {
            return;
        }

https://github . com/Jenkins ci/build-user-vars-plugin/blob/master/src/main/Java/org/Jenkins ci/plugins/build user/var setter/impl/useridcausedeterminant . Java # L42

public boolean setJenkinsUserBuildVars(UserIdCause cause,
            Map<String, String> variables) {
        if(null != cause) {
            String username = cause.getUserName();
            UsernameUtils.setUsernameVars(username, variables);

            String userid = StringUtils.trimToEmpty(cause.getUserId());
            variables.put(BUILD_USER_ID, userid);

如果构建是由 SCMTrigger 触发的,您将没有BUILD_USER_ID,而是BUILD_USER:

https://github.com/jenkinsci/build-user-vars-plugin/blob/master/src/main/java/org/jenkinsci/plugins/builduser/BuildUser.java#L78

// set BUILD_USER_NAME to fixed value if the build was triggered by a change in the scm
        SCMTrigger.SCMTriggerCause scmTriggerCause = (SCMTrigger.SCMTriggerCause) build.getCause(SCMTrigger.SCMTriggerCause.class);
        if (new SCMTriggerCauseDeterminant().setJenkinsUserBuildVars(scmTriggerCause, variables)) {
            return;
        }

https://github.com/jenkinsci/build-user-vars-plugin/blob/master/src/main/java/org/jenkinsci/plugins/builduser/varsetter/impl/SCMTriggerCauseDeterminant.java#L15

public boolean setJenkinsUserBuildVars(SCMTriggerCause cause,
            Map<String, String> variables) {

        if (cause != null) {
            UsernameUtils.setUsernameVars("SCMTrigger", variables);

            return true;
        } else {
            return false;
        }
    }

https://github.com/jenkinsci/build-user-vars-plugin/blob/master/src/main/java/org/jenkinsci/plugins/builduser/utils/UsernameUtils.java#L28

public static void setUsernameVars(String username, Map<String, String> variables) {
        variables.put(BUILD_USER_VAR_NAME, username);
        variables.put(BUILD_USER_FIRST_NAME_VAR_NAME, getFirstName(username));
        variables.put(BUILD_USER_LAST_NAME_VAR_NAME, getLastName(username));
    }

为了克服这个问题,您可以在使用之前检查BUILD_USER_ID是否存在。

 类似资料:
  • 我对使用Jenkins文件和GIT插件的Jenkins多分支pipleline有一个问题。 问题是,每次向暂存分支推送都会触发master管道。所需的行为是,推送到暂存分支仅触发用于暂存的管道,而推送到主分支仅触发主管道 这是我的詹金斯档案 我将分享一些日志:这是主分支的日志 这是主分支的日志,但只有暂存有一个新的提交: 注意“已发现更改”,即使主分支上的头未更改 詹金斯·弗。2.190.1 Gi

  • 我有一个 Jenkins 管道工作,如下所示: 后来我有这样的条件逻辑: 然而,触发器没有被激活。也就是说,“not triggered by timerTrigger”即使在parameterizedCron运行时也似乎是真的。 我从这里的文档中得到了这个例子。 我的问题是,如果我希望我的构建/发布阶段仅在branch == master上执行,而不是在参数化Cron执行期间执行,我该怎么做?

  • 我正在使用詹金斯声明管道,不知道是否有任何方法可以定期触发特定阶段。 我的意思是,当我们签出SCM时,管道会触发,但阶段2对我们的一些项目来说太长了。因此,我不想等待这个阶段,我只想每天运行这个阶段,但仍然将这个阶段保存在Jenkins文件中。 有没有办法做到这一点?这样做的最佳方法是什么?

  • 寻找一种通过API触发Azure管道构建的方法,理想情况下是REST。如果REST是不可能的,也许我可以尝试通过Azure函数使用某种资源ID来调用构建。我希望我自己的存储库监视器发出一个API请求,当我的条件满足时触发构建。另一个问题--是否可以通过API设置“管道变量”--例如,我发出一个API调用,传递值作为管道变量的值,然后触发构建。 谢谢。

  • 我有一个Jenkins管道作业(不是多分支管道),管道内的逻辑之一是,当gitlab scm上有一个合并请求时,我想基于触发此生成的合并请求的源分支构建一些东西。 我的问题是,在Jenkinsfile中,我如何动态地获取这个源分支,签出代码,并创建一个工作区,以便在这个分支上运行构建?

  • 我希望在我的Jenkinsfile中添加一个条件阶段,该阶段根据构建的触发方式运行。目前,我们设置为构建由以下方式触发: 对 git 存储库的更改,这些更改是在分支索引中选取的 用户使用 UI 中的“立即生成”按钮手动触发生成。 是否有任何方法可以根据这些操作中的哪些操作触发了构建来运行不同的管道步骤?

  • 我有一个场景,但我有两个项目(a和B),都在Jenkins中配置了多分支管道作业,问题是项目B依赖于项目a。 所以我发现有时候当我在项目A中签入代码时,我也需要在项目A构建后构建项目B。现在,在我开始调查管道构建之前,我将每个分支都有一个作业,然后在Jenkins中为相应的分支触发项目B的适当作业。 我想在Jenkins文件中设置什么,这样当ProjectA/develop执行时,它就会触发Pro

  • 我的工作有两种方式: < li >如果有人提交github repo,则触发作业。 < li >如果有人手动创建作业。 在我的管道中,我需要直接(手动)或间接(SCM提交)获取触发构建的人的姓名/信息。我有以下代码: 这让我使用https://wiki.jenkins-ci.org/display/JENKINS/Build用户Vars插件插件的名称。 这在手动模式下有效,但通过SCM触发时,总是