1

问题

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

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

环境

  • 詹金斯 2.223
  • Ansible 插件 1.0
  • 码头工人插件 1.1.9
  • Docker 管道 1.22

错误

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'
    )
}
4

1 回答 1

0

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

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

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

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

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

此代码使用以下内容。现在,当我们使用 withCredentials 时,它会将 cred 值注入到环境中(也许它总是如此,也许自从我写这篇文章后情况发生了变化——它可能是前者)。因此,这段代码两次设置环境变量违反了 DRY 原则,它覆盖了 USER 变量,这在 linux 上非常重要。

失败代码

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
}
于 2020-07-21T20:33:07.467 回答