docker.image...内部目录和 ansiblePlaybook 结果 java.lang.ArrayIndexOutOfBoundsException

docker.image...inside with dir and ansiblePlaybook results in java.lang.ArrayIndexOutOfBoundsException

问题

如果我将 docker.image...inside 与 dir 和 ansiblePlaybook 结合使用,我会得到一个 java.lang.ArrayIndexOutOfBoundsException,因为我的 jenkins 代理没有使用 -XX:-OmitStackTraceInFastThrow,这就是我得到的全部内容。

关于为什么这是一个问题以及如何在不重新处理所有目录调用的情况下解决它的任何想法?

环境

错误

java.lang.ArrayIndexOutOfBoundsException

失败代码

docker.withRegistry("https://myregistry", 'credsId') {
    docker.image("myregistry/jenkins-node-devops-tools:2020-07-17").inside {
        dir('backend') {
            ansiblePlaybook(
                    playbook: 'deploy/kafka-topics/test.yml',
                    extras: '-vv'
            )
        }
    }
}

成功代码

docker.withRegistry("https://myregistry", 'credsId') {
    docker.image("myregistry/jenkins-node-devops-tools:2020-07-17").inside {
            ansiblePlaybook(
                    playbook: 'backend/deploy/kafka-topics/test.yml',
                    extras: '-vv'
            )
    }
}

额外成功代码

dir('backend') {
    ansiblePlaybook(
            playbook: 'deploy/kafka-topics/test.yml',
            extras: '-vv'
    )
}

docker命令行和环境是上下文的区别。获取它们并先检查它们。 Jenkins 凭据插件会屏蔽一些环境变量,因此您可能需要将它们定向到本地文件中以绕过 sh "env > file.txt"

注意: 只使用这种罕见的调试情况,然后彻底清理它,因为这是泄露秘密的一种方式。

问题更复杂,因为它不仅涉及这段代码,还涉及我遗漏的一些代码。这是根本原因

我有一个 withArtifactoryEnvAuth 函数,允许构建执行以下操作:

withArtifactoryEnvAuth('mycreds') {
    sh 'docker pull image'
}

此代码使用了以下内容。现在,当我们使用 withCredentials 时,它将 cred 值注入到环境中(也许它总是这样做,也许自从我写这篇文章后改变了 - 它可能是前者)。因此,这段代码设置了两次环境变量,违反了 DRY 原则,它覆盖了对 linux.

非常重要的 USER 变量

失败代码

def withArtifactoryEnvAuth(def credentialsId, closure) {

    def message = ""
    withCredentials([usernamePassword(
            credentialsId: credentialsId, passwordVariable: 'PASSWORD', usernameVariable: 'USER')]) {
        List envList = [
                "ARTIFACTORY_USER=${env.USER}",
                "ARTIFACTORY_PASSWORD=${env.PASSWORD}"
        ]
        withEnv(envList) {
            message = closure()
        }
    }

    return message
}

固定代码

def withArtifactoryEnvAuth(def credentialsId, closure) {

    def message = ""
    withCredentials([usernamePassword(
            credentialsId: credentialsId, passwordVariable: 'ARTIFACTORY_PASSWORD', usernameVariable: 'ARTIFACTORY_USER')]) {
        message = closure()
    }

    return message
}