在Jenkins的dockerfile代理中传递Gradle凭据

88次阅读
没有评论

问题描述

希望将新配置的Jenkins实例用于运行现有的dockerfile,该dockerfile执行Gradle构建并生成一个运行时镜像,然后将该镜像推送到内部Docker仓库。用户已经完成了以下工作:

pipeline {
    agent {
        dockerfile {
            additionalBuildArgs "--build-arg 'GIT_REPO=(git remote -v | head -1)' " +
                               "--build-arg 'JENKINS_BRANCH=$BRANCH_NAME' " +
                               "--build-arg 'JENKINS_BUILD_URL=$BUILD_URL' " +
                               "--build-arg 'GIT_SHA=(git rev-parse HEAD)' " +
                               "--build-arg 'ORG_GRADLE_PROJECT_artifactoryUsername=setnow' " +
                               "--build-arg 'ORG_GRADLE_PROJECT_artifactoryPassword=setnow'"
            registryCredentialsId "svc-artifactory"
            label 'set by us'
        }
    }
}

现在用户想要为Gradle构建提供正确的凭据,通过设置ORG_GRADLE_PROJECT_*变量来实现。要使用的凭据也是”svc-artifactory”。

用户询问如何处理这个问题。

解决方案

请注意以下操作可能因版本差异或安全问题而有所不同,建议谨慎操作。

步骤1:使用Docker密钥保护Gradle凭据

首先,我们可以使用Docker的密钥功能来保护Gradle凭据。这将确保凭据不会在镜像中以明文形式暴露。以下是如何执行的步骤:

  1. 在Jenkins主机上创建一个Docker密钥,用于存储Gradle凭据。假设密钥名称为gradle-credentials.
  2. 将Gradle凭据保存到Docker密钥中:
    bash
    echo "setnow" | docker secret create gradle-credentials -

    这将创建一个名为gradle-credentials的Docker密钥,并将凭据设置为setnow

步骤2:更新Jenkins Pipeline

现在,我们需要更新Jenkins Pipeline,以便在构建期间使用Docker密钥中的Gradle凭据。以下是更新后的Pipeline代码:

pipeline {
    agent {
        dockerfile {
            additionalBuildArgs "--build-arg 'GIT_REPO=(git remote -v | head -1)' " +
                               "--build-arg 'JENKINS_BRANCH=$BRANCH_NAME' " +
                               "--build-arg 'JENKINS_BUILD_URL=$BUILD_URL' " +
                               "--build-arg 'GIT_SHA=(git rev-parse HEAD)' " +
                               "--build-arg 'ORG_GRADLE_PROJECT_artifactoryUsername=setnow' " +
                               "--build-arg 'ORG_GRADLE_PROJECT_artifactoryPassword=setnow'"
            registryCredentialsId "svc-artifactory"
            label 'set by us'
        }
    }
    environment {
        GRADLE_CREDENTIALS = readFile('/run/secrets/gradle-credentials').trim()
    }
    stages {
        stage('Build') {
            steps {
                withCredentials([string(credentialsId: 'svc-artifactory', variable: 'ARTIFACTORY_CREDENTIALS')]) {
                    sh """
                    docker build \
                        --build-arg ORG_GRADLE_PROJECT_artifactoryUsername=\$ARTIFACTORY_CREDENTIALS_USR \
                        --build-arg ORG_GRADLE_PROJECT_artifactoryPassword=\$ARTIFACTORY_CREDENTIALS_PSW \
                        --build-arg ORG_GRADLE_PROJECT_gradleCredentials=\$GRADLE_CREDENTIALS \
                        -f Dockerfile .
                    """
                }
            }
        }
        // 其他阶段...
    }
}

在这个更新后的Pipeline中,我们首先使用readFile函数读取Docker密钥中的Gradle凭据。然后,在构建阶段中,我们使用withCredentials函数来注入Artifactory凭据。注意,我们还在docker build命令中添加了一个额外的--build-arg,用于传递Gradle凭据给Dockerfile中的环境变量。

这样,Gradle构建过程中将使用安全的Docker密钥中的凭据,确保敏感信息的安全性。

步骤3:完善其他参数

至此,你已经成功地实现了在Jenkins的Docker代理中传递Gradle凭据的目标。你还可以继续完善其他参数,如GIT相关参数,以满足你的需求。

请注意,这个解决方案可能因Docker版本、Jenkins版本以及具体情况而有所不同。在执行任何更改之前,务必备份重要数据,并在非生产环境中进行测试。

希望这个解决方案能帮助你成功地在Jenkins的Docker代理中传递Gradle凭据并完成构建过程。如果你有任何进一步的问题或疑问,请随时提问。

正文完