【问题标题】:In Jenkins, how do builds know who requested them?在 Jenkins 中,构建如何知道谁请求了它们?
【发布时间】:2011-08-19 15:13:00
【问题描述】:

我需要将构建请求者的用户名传递给实际执行工作的脚本。查看特定构建的控制台输出,第一行始终是“由用户 foo 启动”,因此 Jenkins 清楚地跟踪谁触发了构建。所以应该可以将这些信息传递给工作。问题是,怎么做?

【问题讨论】:

    标签: jenkins build request hudson


    【解决方案1】:

    用户30997

    请查看Jenkins Build User Vars plugin,它可以满足您的需求:

    用于设置以下用户构建变量:

    • BUILD_USER – 用户开始构建的全名,
    • BUILD_USER_FIRST_NAME - 用户开始构建的名字,
    • BUILD_USER_LAST_NAME – 用户开始构建的姓氏,
    • BUILD_USER_ID – 用户开始构建的 ID。

    【讨论】:

    【解决方案2】:

    用户名没有放在易于获取的环境变量中,但您可以使用 xml (or json or python) api 获取它 - 只要您开始构建,http://[jenkins-server]/job/[job-name]/[build-number]/api/xml 就会填充详细信息:

    <freeStyleBuild>
        <action>
            <cause>
                <shortDescription>Started by user foobar</shortDescription>
                <userName>foobar</userName>
            </cause>
        </action>
        <building>true</building>
        [...]
    

    【讨论】:

      【解决方案3】:

      我尝试使用 Jenkins Build User Vars plugin 并通知 HipChat 房间某个用户启动了构建,但 BUILD_USER 变量对 HipChat 插件不可用,可能是因为 HipChat 操作发生在 Build User Vars 插件注入变量之前.

      所以我安装了pre-scm-buildstep plugin 并添加了:

      ]

      // Inject environment variables using Groovy
      
      import hudson.model.*
      
      def build = Thread.currentThread().executable
      def userCause = build.getCause(hudson.model.Cause$UserIdCause)
      def userName = userCause?.userId ?: 'Jenkins'
      
      def envVars = ['BUILD_USER': userName]
      
      for (item in envVars) {
        build.addAction(new ParametersAction([
          new StringParameterValue(item.key, item.value)
        ]))
      }
      

      【讨论】:

      • 谢谢。詹金斯让这种方式变得比它应该的更难。我没有将“执行系统 ​​Groovy 脚本”视为“在 SCM 运行之前进行构建步骤”的选项之一。知道如何在没有 Groovy 的情况下获得它或做同样的事情吗?
      • 没关系,在这里找到 Groovy 插件:wiki.jenkins-ci.org/display/JENKINS/Groovy+plugin
      【解决方案4】:

      在你的 Job 中添加“执行系统 ​​Groovy 脚本”:

      def yourUserName = build.causes[0].userId
      

      【讨论】:

        【解决方案5】:

        我设法得到它(在 Jenkins 2.58 上):

        currentBuild.getRawBuild().getCauses()[0].getUserId()
        

        当然你需要在 Jenkins 中设置权限才能调用这些方法。 它并不总是您正在寻找的第 0 个原因对象,例如如果您重播另一个用户的构建(未对此进行测试),它可能是另一个。

        【讨论】:

          【解决方案6】:
          import os
          import jenkinsapi.build
          import jenkinsapi.jenkins
          
          #Required Environment variables example:
          #JENKINS_URL=http://jenkinsserver/
          #JOB_NAME=TEST_GT
          #BUILD_NUMBER=8
          
          jenkins_inst = None
          
          def get_jenkins_inst():
              if jenkins_inst == None:
                  jenkins_url = os.environ['JENKINS_URL']
                  print("Connect to jenkins " + jenkins_url)
                  jenkins_inst = jenkinsapi.jenkins.Jenkins(jenkins_url)
              return jenkins_inst
          
          def get_jenkins_job():
              jenkins_inst = get_jenkins_inst()
          
              jenkins_job_name = os.environ['JOB_NAME']
              print("Get jenkins job " + jenkins_job_name)
              return jenkins_inst.get_job(jenkins_job_name)
          
          def get_jenkins_user():
              jenkins_job = get_jenkins_job()
          
              jenkins_buildno = int(os.environ['BUILD_NUMBER'])
              print("Get jenkins job build " + str(jenkins_buildno))
              cur_build = jenkins_job.get_build(jenkins_buildno)
          
              return cur_build.get_actions()['causes'][0]['userId']
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多