问题描述
在Jenkinsfile中,我想要使一个ssh key
在流水线的所有阶段中可见。根据官方文档,我了解到以下几点:
1. 使用environment
指令在Jenkinsfile中定义环境变量。
2. 所定义的变量的作用范围取决于environment
指令的放置位置。
3. 可以在environment
指令中使用credentials
辅助方法来设置某些类型的凭据。
4. 辅助方法支持的凭据类型有:秘密文本、用户名和密码、秘密文件。
5. 对于其他类型的凭据,文档建议使用snippet generator
,生成相应的步骤。
以下是一个ssh key步骤的示例:
withCredentials([sshUserPrivateKey(credentialsId: 'jenkins_aws_to_bitbucket', keyFileVariable: 'BITBUCKET_PRV_KEY')]) {
// 一些操作
}
该示例用于一个阶段,类似于:
pipeline {
agent {
// 定义代理
}
stages {
stage('示例阶段1') {
steps {
withCredentials(bindings: [sshUserPrivateKey(credentialsId: 'jenkins-ssh-key-for-abc', \
keyFileVariable: 'SSH_KEY_FOR_ABC')]) {
// 操作
}
withCredentials(bindings: [certificate(credentialsId: 'jenkins-certificate-for-xyz', \
keystoreVariable: 'CERTIFICATE_FOR_XYZ', \
passwordVariable: 'XYZ-CERTIFICATE-PASSWORD')]) {
// 操作
}
}
}
stage('示例阶段2') {
steps {
// 操作
}
}
}
}
解决方案
请注意以下操作可能存在版本差异,请根据你的实际情况和需要进行相应调整。
在Jenkinsfile中,凭据只能在传递给withCredentials
块内部可见,而在块之外是不可见的。因此,你的凭据不会在其他阶段中可见。为了使你的凭据在整个流水线中可见,有以下两种方法:
方案1:对于声明性流水线(Declarative Pipeline)
如果你在使用声明性流水线,可以将你的凭据放置在流水线顶部的environment{}
块中。这样可以使凭据在整个流水线中可见。以下是具体步骤:
1. 定义你的流水线,设置代理等。
2. 在environment{}
块中,使用credentials()
方法为你的凭据定义一个环境变量。
3. 在流水线的各个阶段中,可以直接使用这个环境变量来访问凭据。
以下是一个示例:
pipeline {
agent {
// 定义代理
}
environment {
MY_CREDENTIALS = credentials('your-credentials-id')
}
stages {
stage('示例阶段1') {
steps {
// 使用 MY_CREDENTIALS 进行操作
}
}
stage('示例阶段2') {
steps {
// 使用 MY_CREDENTIALS 进行操作
}
}
// ...
}
}
方案2:对于脚本式流水线(Scripted Pipeline)
如果你在使用脚本式流水线,可以将整个作业都包装在withCredentials
块中。这种方法在声明性流水线中不可行。
以下是一个示例:
node {
// 定义代理
withCredentials([sshUserPrivateKey(credentialsId: 'your-credentials-id', keyFileVariable: 'SSH_KEY')]) {
stage('示例阶段1') {
// 使用 SSH_KEY 进行操作
}
stage('示例阶段2') {
// 使用 SSH_KEY 进行操作
}
// ...
}
}
请根据你的实际情况选择适合的方案,确保凭据在你的流水线中可见并安全使用。