如何在构建中将注入的密码用作Active Choices Parameter中的环境变量

时间:2016-04-23 17:44:38

标签: jenkins groovy passwords jenkins-plugins

我在构建配置部分中定义了密码“将构建密码注入环境变量”:

MYVAR pasword injected into build

我想在我的主动选择中使用MYVAR(未加密的值)。不幸的是,它没有用。对MYVAR的引用失败了。

在下面的示例中,为了进行测试,我只是尝试将MYVAR的值显示为选项。您可以看到它失败,而是使用了回退活动选择脚本。

最终,我想使用此变量对服务进行身份验证,以构建一个选项列表,但无法在我的脚本中引用它。我被卡住了。

enter image description here

当我尝试“使用参数构建”时:

enter image description here

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我认为这不会起作用。为什么?好吧,EnvInject Plugin构建环境选项读取:

  

将环境变量注入构建过程

  

将构建密码作为环境变量注入

Active Choices Plugin发挥作用时,构建尚未开始,因此没有进行注射。

答案 1 :(得分:1)

受到@Bruno's评论的启发,我开发了以下内容:

  • ☑此构建已参数化
    • 有效选择参数
      • 脚本
        • ◉GroovyScript
          • 脚本

// From: How can i use passwords injected in the build as environment variables in Active Choices Parameter Groovy Script
//       https://stackoverflow.com/a/36821693/1744774

import static java.lang.System.out
import static java.lang.System.err

import hudson.model.Project

import org.w3c.dom.*;
import javax.xml.parsers.*
import javax.xml.xpath.*

// -----------------------------------------------------------
// Adapt these according to your environment
final String JENKINS_HOME = '< your Jenkins home >'
final String THIS_JOB_NAME = '< your job name >'
// -----------------------------------------------------------

//try (final PrintStream LOG = new PrintStream("${JENKINS_HOME}/jobs/${THIS_JOB_NAME}/activechoices.log")) { // doesn't work
final PrintStream LOG = new PrintStream("${JENKINS_HOME}/jobs/${THIS_JOB_NAME}/activechoices.log")

try {
  System.setOut(LOG)
  System.setErr(LOG)
  out.println("${JENKINS_HOME}/jobs/${THIS_JOB_NAME}/job.log")

  // groovy.lang.MissingPropertyException: No such property: Jenkins for class: Script1
  //final Project THIS_JOB = Jenkins.instance.getItem(THIS_JOB_NAME)
  //final String THIS_JOB_CONFIG = THIS_JOB.getRootDir().getPath() + '/config.xml'

  // static path to job config since the above doesn't work
  final String THIS_JOB_CONFIG = "${JENKINS_HOME}/jobs/${THIS_JOB_NAME}/config.xml"
  out.println(THIS_JOB_CONFIG)

  final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(THIS_JOB_CONFIG)

  final XPathExpression stringExpr = XPathFactory.newInstance().newXPath()
      .compile("//hudson.model.StringParameterDefinition/defaultValue/text()")
  final String STRING_PARAMETER = stringExpr.evaluate(doc, XPathConstants.NODE).getNodeValue()

  final XPathExpression pwdExpr = XPathFactory.newInstance().newXPath()
      .compile("//hudson.model.PasswordParameterDefinition/defaultValue/text()")
  final String PASSWORD_PARAMETER = pwdExpr.evaluate(doc, XPathConstants.NODE).getNodeValue()

  final List parameters = new ArrayList()
  parameters.add('static')
  parameters.add(THIS_JOB_NAME)
  //parameters.add(THIS_JOB)
  parameters.add(STRING_PARAMETER)
  parameters.add(PASSWORD_PARAMETER)
  return parameters
  }
catch (Exception e) {
  e.printStackTrace()
  }
finally {
  LOG.close()
  }

问题:

  • 为什么try-with-resources不起作用?
  • 如何获取Jenkins实例?

工作config.xml

  <properties>
    ...
    <hudson.model.ParametersDefinitionProperty>
      <parameterDefinitions>
        ...
        <hudson.model.PasswordParameterDefinition>
          <name>Password Parameter</name>
          <description>This is a Password Parameter.</description>
          <defaultValue>q2sZWfVMgQNyIi/pjY6yaE7DT9zRvnPv1mBcbydjlMQ=</defaultValue>
        </hudson.model.PasswordParameterDefinition>
        <hudson.model.StringParameterDefinition>
          <name>String Parameter</name>
          <description>This is a String Parameter.</description>
          <defaultValue>string value</defaultValue>
        </hudson.model.StringParameterDefinition>
        <hudson.model.StringParameterDefinition>
          <name>Another String Parameter</name>
          <description>This is another String Parameter.</description>
          <defaultValue>another string value</defaultValue>
        </hudson.model.StringParameterDefinition>
      </parameterDefinitions>
    </hudson.model.ParametersDefinitionProperty>
  </properties>

使用参数构建

  

Active Choices job config

在使用Node (..., XPathExpression.evaluate )时,如果有多个{{}}},我会将此作为挑战让读者重复XPathConstants.NODESET秒相同类型的参数。