在Jenkinsfile中如何使凭据在多个阶段中可见

75次阅读
没有评论

问题描述

在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 进行操作
        }
        // ...
    }
}

请根据你的实际情况选择适合的方案,确保凭据在你的流水线中可见并安全使用。

正文完