在Jenkinsfile中,我想使ssh key对管道中的所有阶段可见。

从官方文档中,我了解到:



environment伪指令用于拒绝在Jenkinsfile中使用的环境变量
定义的变量范围取决于environment伪指令的位置
借助以下命令,可以在environment伪指令中设置某些类型的凭据。 credentials帮助程序
帮助程序支持的凭据类型为:


机密文本
用户名和密码
机密文件



对于其他类型的凭据,该文档建议使用snippet generator,它会生成一个步骤。

ssh密钥步骤示例

withCredentials([sshUserPrivateKey(credentialsId: 'jenkins_aws_to_bitbucket', keyFileVariable: 'BITBUCKET_PRV_KEY')]) {
    // some block
}


这旨在用于以下阶段:

pipeline {
    agent {
        // define agent details
    }
    stages {
        stage('Example 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('Example stage 2') {
            steps {
                // 
            }
        }
    }
}


摘录源

问题


如果步骤在一个阶段内,则这些凭据在其他阶段是否可见s?
如果不是,如何使这些凭据在所有阶段都可以全局可见


#1 楼


否,凭据只能在传递给withCredentials的块内看到,而不能在此范围之外。
如果不切换到脚本管道,就无法使凭据全局可用。使用脚本,您可以将整个作业包装在withCredentials中。使用声明式是不可能的。


#2 楼

我在这样的声明性管道中全局设置凭据,然后我的詹金斯可以在各个阶段与Google Dataflow进行交流。例如,我使用了一个秘密文件(Google服务帐户)。


pipeline {
    agent any
    environment {
        //Secret File ID was defined in Jenkins -> Credentials -> System -> Global credentials
        GOOGLE_APPLICATION_CREDENTIALS = credentials('mySecretFileId')

        GCP_PROJECT_NAME = 'myProject'
    }
   stages {
             stage('step 1') {
              steps {
                sh "gcloud auth activate-service-account --key-file ${env.GOOGLE_APPLICATION_CREDENTIALS}"
                sh "gcloud config set project ${env.GCP_PROJECT_NAME}"

                // access google dataflow
                sh "gcloud dataflow jobs list --status=active"
                // ....
              }
             }
             stage('stage 2') {
               steps {
                  // access google dataflow
                  sh "gcloud dataflow jobs list --status=active"
               }
             }
             //...
   }
}