【问题标题】:docker.image...inside with dir and ansiblePlaybook results in java.lang.ArrayIndexOutOfBoundsExceptiondocker.image...inside with dir 和 ansiblePlaybook 导致 java.lang.ArrayIndexOutOfBoundsException
【发布时间】:2020-07-22 04:40:46
【问题描述】:

问题

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

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

环境

  • 詹金斯 2.223
  • Ansible 插件 1.0
  • Docker 插件 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'
    )
}

【问题讨论】:

    标签: docker ansible jenkins-pipeline jenkins-docker


    【解决方案1】:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多