如何将Jenkins Pipeline中的SSH密钥传递给Jenkins构建作业?

时间:2017-12-20 21:06:03

标签: jenkins jenkins-pipeline jobs credentials dsl

我正在处理一组作业,用相同的标签标记一堆相关的Git repos。目前,流程被分解为三种类型的作业:一个整体的Jenkins脚本管道,一个构建并在构建成功时删除标记的作业,以及执行最终版本构建的标记作业触发的作业。我的目的是允许用户运行整个管道或其下的一个作业,具体取决于他们是否需要重新运行流程中的步骤或执行整个发布。

我的一个要求是,所有这些都需要通过调用用户的凭据进行,然后将其传递给Git,以便更新(maven pom更改等)作为其用户登录到提交历史记录中。通过将用户范围的凭据与Authorize Project插件(因此作业可以访问用户范围的凭据),Build User Vars以在Git中设置user.name和user.email以及SSH代理插件,我成功地实现了这一点。向Git提供密钥,以便可以将提交和标记作为正确的用户推送。

我现在要做的是将带有凭证参数的用户SSH密钥收集到脚本化管道作业,然后将该凭证参数传递给下游标记作业(也采用凭证参数)。遗憾的是,当我这样做时,下游作业失败,因为下游作业中的SSH代理无法根据管道中的凭证参数传递给标记作业中的凭证参数的值来检索凭据。

我得到的错误是:

FATAL: 
java.io.IOException: [ssh-agent] Could not find specified credentials
at com.cloudbees.jenkins.plugins.sshagent.SSHAgentBuildWrapper.preCheckout(SSHAgentBuildWrapper.java:209)
at jenkins.scm.SCMCheckoutStrategy.preCheckout(SCMCheckoutStrategy.java:76)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:490)
at hudson.model.Run.execute(Run.java:1737)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:421)
FATAL: [ssh-agent] Could not find specified credentials
java.io.IOException: [ssh-agent] Could not find specified credentials
at com.cloudbees.jenkins.plugins.sshagent.SSHAgentBuildWrapper.preCheckout(SSHAgentBuildWrapper.java:209)
at jenkins.scm.SCMCheckoutStrategy.preCheckout(SCMCheckoutStrategy.java:76)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:490)
at hudson.model.Run.execute(Run.java:1737)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:421)

现在,我的管道作业的Job DSL看起来像这样:

parameters {
stringParam('sitePrefix',Projects.siteAbbr,"Three-character site code")
activeChoiceParam('modules'){
  choiceType('MULTI_SELECT')
  groovyScript{
    script("[${projectsAsGroovyString}]")
  }
  description("Modules to build")
}
credentialsParam('gitUser'){
type('com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey')
  required()
  description('Personal SSH Key for tagging and releasing')
}
stringParam('gitBranch','develop','Branch to tag')
stringParam('releaseVersion',null,'Version you want to release')
stringParam('developmentVersion',null,'Snapshot version to set after release. If unset, generates a new patch snapshot based on the release version')

}

我的实际管道代码包含这样的代码:

def tag_params = [
       [$class:'com.cloudbees.plugins.credentials.CredentialsParameterValue',name: 'gitUser',value:params.gitUser],
//  credentials(name:'gitUser',value:params.gitUser),
  string(name:'gitBranch',value:params.gitBranch),
  string(name:'releaseVersion',value:params.releaseVersion),
  string(name:'developmentVersion',value:params.developmentVersion),
  booleanParam(name:'buildRelease',value:false),
]


stage('Tag bom'){

        // Run tag job
        build job: "bom_tag_release", parameters: tag_params
        // Run release build
        build job: "bom_tag_build", parameters: build_params

}

下游作业只是使用另一个凭证参数来接收凭据,而不是Credentials Binding插件,因为它似乎只处理秘密文件而不是SSH代理所需的SSH密钥。是否可以将凭证ID从管道传递给作业,还是应该考虑另一种方法?

谢谢!

0 个答案:

没有答案