背景

  • 使用jenkins的pipeline构建流水线;
  • 由于使用场景,我们希望jenkins container run起来后,slave就可以读取到已经配置好的业务环境变量,而非在jenkins配置页面设置全局环境变量。故pipeline的groovy script需要将master的ENV传递到slave的脚本。

    1. #!/usr/bin/env groovy
    2. pipeline {
    3. agent {
    4. label 'TEST_AGENT'
    5. }
    6. environment {
    7. PATH = "/bin:/usr/bin:/usr/local/bin:$PATH"
    8. ANALYSE_WORKSPACE = "${workspace}"
    9. TEST_URL = "${System.getenv('TEST_URL')}"
    10. }
    11. }

    问题

    image.png

    解决

    1. 编写配置文件

    1. scriptApproval{
    2. approvedSignatures=[
    3. 'method groovy.util.ConfigSlurper parse java.lang.String',
    4. 'staticMethod java.lang.System getenv java.lang.String',
    5. 'method org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval approveSignature java.lang.String',
    6. 'staticMethod org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval get'
    7. ]
    8. }

    备注:不同的错误,需要不同的配置文件。上述配置仅适用本文case。

2. 脚本命令行

在jenkins页面【脚本命令行】,执行如下命令

  1. import org.jenkinsci.plugins.scriptsecurity.scripts.*
  2. ScriptApproval script = ScriptApproval.get()
  3. ConfigObject conf = new ConfigSlurper().parse(new File(System.getenv("JENKINS_HOME") + '/jenkins_config/scriptApproval.txt').text)
  4. conf.scriptApproval.approvedSignatures.each{ approvedSignature ->
  5. println("checking for new signature ${approvedSignature}")
  6. def found = script.approvedSignatures.find { it == approvedSignature }
  7. if (!found){
  8. println("Approving signature ${approvedSignature}")
  9. script.approveSignature(approvedSignature)
  10. }
  11. }

参阅文档