【问题标题】:Jenkins active choices plugin - how to get value of password parameterJenkins 主动选择插件 - 如何获取密码参数的值
【发布时间】:2016-03-02 16:46:19
【问题描述】:

我有一个带有 2 个参数的参数化詹金斯作业:

  • 第一个作业参数是“密码参数”类型的 APIKEY
  • 第二个作业参数是“Active Choices Reactive Parameter”类型的服务 - 单选,引用参数 APIKEY 并使用以下常规脚本代码,该代码在单选 UI 控件中返回 APIKEY 参数的值:

    [ APIKEY ]
    

当我开始构建此作业时,在单选 UI 控件中为参数 SERVICE 提供的值是乱码(加密?)APIKEY 值。

我想要的是能够在SERVICE参数的脚本代码中使用输入的APIKEY密码参数的实际(解密)值。

我尝试使用 hudson.util.Secret 解密 APIKEY 乱码值,如下所示,但没有成功:

   def apikey = hudson.util.Secret.fromString(APIKEY).getPlainText()

有没有办法从主动选择反应参数常规脚本代码中获取实际密码参数值?

【问题讨论】:

    标签: jenkins groovy


    【解决方案1】:

    经过多一点尝试后,事实证明这毕竟可以正常工作 - 但只有在手动输入密码参数时,而不是使用默认密码参数值(不确定这是错误还是功能)。

    第一次运行作业时,提供的默认密码参数值是乱码,但在密码字段中再次输入该值,然后在 groovy 脚本中给出正确的值。

    这对我有用:

    1. 运行作业构建
      • 此时 SERVICE 字段的 groovy 脚本代码中的 APIKEY 值未正确评估 - 它是乱码值
    2. 在 APIKEY 密码参数字段中输入正确的值 - 例如“abc123”
    3. 将焦点切换到 SERVICE 字段
    4. SERVICE 字段常规代码现在被执行并显示 APIKEY 的实际输入值:“abc123”

    由于我的用例是每次构建作业时都必须输入 APIKEY,这对我来说已经足够了。

    【讨论】:

      【解决方案2】:

      这是一个老话题,但我找到了一个解决方案,所以我会在这里添加它,以防其他人仍然需要它。这是工作代码,但我对其进行了清理以供发布。

      此 Groovy 脚本在 Active Choices 反应参数中运行。任务是提供可从内部 Artifactory 存档部署的构建版本列表。 REST 调用所需的 API 密钥作为机密文本存储在我们的 Jenkins 实例中。所以这段代码会从 Credentials 插件的 repo 中读取秘密文本,然后将其添加到 http 请求的标头中。

      这是一个笨拙的解决方案。 Groovy 有更优雅的 withCredentials 方法,但它可能只适用于 Jenkins 管道。我没有找到在这个参数中使用它的方法。 此解决方案也没有使用 HTTPBuilder,它本来会更简单,但在我们的 Groovy 插件中不可用。

      import org.apache.http.client.methods.*
      import org.apache.http.impl.client.*
      import groovy.json.JsonSlurper;
      
      def APP_FULL_NAME = "My.Project.Name"
      
      def request = new HttpGet("https://fakeDns/artifactory/api/search/versions?r=releases&a="+APP_FULL_NAME)
      
      def jenkinsCredentials = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
              com.cloudbees.plugins.credentials.Credentials.class,
              Jenkins.instance,
              null,
              null
      );
      def apiKey
      for (creds in jenkinsCredentials) 
      {
        //println creds.id
        //println creds.class
        if(creds.id == "my_target_api_key")
        {
          apiKey = creds.secret.toString(creds.secret);
          break
        }
      }
          
      request.addHeader("X-API-KEY", apiKey)
      def responseString = new DefaultHttpClient().execute(request, new BasicResponseHandler());
      def branchList = new JsonSlurper().parseText(responseString)
      //return branchList
      def myList= []
      branchList.results.each {  myList << it }
      return myList.version

      【讨论】:

        猜你喜欢
        • 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
        相关资源
        最近更新 更多