Jenkins主动选择插件 - 如何获取密码参数

时间:2016-03-02 16:46:20

标签: jenkins groovy

我有一个带有2个参数的参数化jenkins作业:

  • 第一个作业参数是类型'密码参数'
  • 的APIKEY
  • 第二个作业参数是“类型的服务”和“活动选择反应参数”#39; - 单选,引用参数APIKEY并使用以下groovy脚本代码在单选UI控件中返回APIKEY参数的值:

    [ APIKEY ]
    

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

这对我有用:

  1. 运行作业构建
    • 此时,SERVICE字段的groovy脚本代码中的APIKEY值未正确评估 - 它是乱码值
  2. 在APIKEY密码参数字段中输入正确的值 - 例如“ABC123”
  3. 将焦点切换到“服务”字段
  4. 现在执行SERVICE字段groovy代码并显示APIKEY的实际输入值:“abc123”
  5. 由于我的用例是每次创建作业时都必须输入APIKEY,这对我来说已经足够了。

答案 1 :(得分:0)

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

此Groovy脚本在“主动选择反应参数”中运行。任务是提供可从内部Artifactory存档中部署的构建版本的列表。 REST调用所需的API密钥作为秘密文本存储在我们的Jenkins实例中。因此,此代码从Credentials插件的存储库中读取以找到秘密文本,然后将其添加到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