Jenkinsfile `pipeline` 为不同的 `stage` 使用不同的 GitHub 凭据?

Jenkinsfile `pipeline` to use different GitHub credentials for different `stages`?

我有一个 Jenkins 管道 运行 在两个节点上并行进行两个测试,例如:

pipeline
{
    agent { label 'MASTER' }

    stages
    {
        stage('x86 and Arm tests')
        {
            parallel
            {
                stage('x86')
                {
                    agent
                    {
                        label ('x86')
                    }
                    steps
                    {
                        sh "something"
                    }
                }
                stage('arm')
                {
                    agent
                    {
                        label ('arm')
                    }
                    steps
                    {
                        sh "something"
                    }
                }
            }
        }
    }
}

问题是 GitHub 凭据:我需要两个不同的 GitHub 凭据来进行两次测试(x86 机器与 Arm 机器)。

目前我已经将我的作业配置为通过 x86 计算机的 SSH 密钥进行身份验证。但是这个密钥似乎不适用于Arm作业。

如何告诉 Jenkins pipelinestage 中使用特定的 GitHub clone/checkout 凭据?

Handling credentials.

当 运行 来自 SCM 的声明性管道时,对于在执行期间使用的每个代理,用于加载管道的存储库将自动签出到工作区。
如果您想更改此默认行为并手动控制每个代理的 SCM 配置,您必须首先使用 skipDefaultCheckout 选项禁用该行为。

skipDefaultCheckout
Skip checking out code from source control by default in the agent directive.
For example: options { skipDefaultCheckout() }

然后在每个代理中,您应该使用分支、存储库 URL 和凭据等所需参数检查您的存储库。为此,您可以使用通用 checkout step or you can use other SCM specific steps like the git 步骤,它是更强大的结帐步骤的一个子集的简化 shorthand。
如果在其中一个代理上,您想使用用于获取管道脚本的相同配置(如默认行为),您可以使用 checkout scm.
来实现 这是一个包含多个选项的示例:

pipeline {
    agent any
    options {
       skipDefaultCheckout()
    }
    stages {
        stage('Tests') {
            parallel {
                stage('x86') {
                    agent {
                        label 'x86'
                    }
                    steps {
                       // use the same configuration used for fetching the pipeline itself
                       checkout scm
                    }
                }
                stage('arm') {
                    agent {
                        label 'arm'
                    }
                    steps {
                        // use the checkout step - in this case for Git SCM
                        checkout([$class: 'GitSCM', branches: [[name: '*/master']],
                            userRemoteConfigs: [[credentialsId: 'my-private-key-credential-id', url: 'http://git-server/user/repository.git']]])
                    }
                }
                stage('x64') {
                    agent {
                        label 'x64'
                    }
                    steps {
                        // use the shortened git step
                        git branch: 'master', credentialsId: 'my-private-key-credential-id', url: 'https://github.com/jenkinsci/jenkins.git'
                    }
                }
            }
        }
    }
}

您现在可以选择在每个构建代理上定义不同的凭据,它们将在结帐过程中使用。另一种选择是使用 SCM 步骤具有的 credentialsId 选项,在 Jenkins 中定义 SCM 提供程序所需的凭据(用户名和密码或 ssh 密钥)并将它们传递给步骤 - 这样您就不需要任何pre-configuration 在代理上。
有关详细信息,请参阅 Using Credentials in Jenkins

此外,所有传递给 SCM 步骤(分支、url、credentialsId 等)的参数都可以定义为作业参数 - 让您更灵活、更轻松地执行不同的配置。