gpt4 book ai didi

docker - 将 Jenkins 凭据传递给 Docker 构建以供 Composer 使用

转载 作者:行者123 更新时间:2023-12-02 18:26:42 25 4
gpt4 key购买 nike

我在我们公司的 BitBucket 私有(private)存储库中有一个 Composer 包。要访问它,我需要使用存储在 Jenkins 中的凭据。目前整个构建基于声明式管道和 Dockerfile。要将凭据传递给 Composer,我需要 build 中的这些凭据阶段将它们传递给 Dockerfile。

我怎样才能实现它?

我试过了:

// Jenkinsfile
agent {
dockerfile {
label 'mylabel'
filename '.docker/php/Dockerfile'
args '-v /net/jenkins-ex-work/workspace:/net/jenkins-ex-work/workspace'
additionalBuildArgs '--build-arg jenkins_usr=${JENKINS_CREDENTIALS_USR} --build-arg jenkins_credentials=${JENKINS_CREDENTIALS} --build-arg test_arg=test'
}
}

// Dockerfile
ARG jenkins_usr
ARG jenkins_credentials
ARG test_arg

但是 args是空的。

最佳答案

TL;DR
使用 Jenkins withCredentials([sshUserPrivateKey()])并将私钥回显到容器中的 id_rsa 中。
已编辑:删除了“以 root 身份运行”步骤,因为我认为这会导致问题。相反,在 docker 容器中创建了一个 jenkins 用户,其 UID 与构建 docker 容器的 jenkins 用户相同(不知道这是否重要,但我们需要一个具有主目录的用户,以便我们可以创建 ~/.ssh/id_rsa)
对于那些像我一样受苦的人......我的解决方案如下。这并不理想,因为:

  • 如果你不小心,它可能会在构建日志中暴露你的私钥(下面是小心的,但很容易忘记)。 (尽管考虑到这一点,提取 jenkins 凭据似乎是 extremely easy 对于任何有顽皮意图的人?)

  • 所以谨慎使用...
    在我的(旧版)git 项目中,一个简单的 php 应用程序具有基于内部 git 的 Composer 依赖项,我有
    Dockerfile.build
    FROM php:7.4-alpine
    # install git, openssh, composer... whatever u need here, then:
    # create a jenkins user inside the docker image
    ARG UID=1001
    RUN adduser -D -g jenkins -s /bin/sh -u $UID jenkins \
    && mkdir -p /home/jenkins/.ssh \
    && touch /home/jenkins/.ssh/id_rsa \
    && chmod 600 /home/jenkins/.ssh/id_rsa \
    && chown -R jenkins:jenkins /home/jenkins/.ssh
    USER jenkins
    # I think only ONE of the below are needed, not sure.
    RUN echo "Host bitbucket.org\n\tStrictHostKeyChecking no\n" >> /home/jenkins/.ssh/config \
    && ssh-keyscan bitbucket.org >> /home/jenkins/.ssh/known_hosts
    然后在我的 Jenkinsfile 中:
    def sshKey = ''

    pipeline {
    agent any

    environment {
    userId = sh(script: "id -u ${USER}", returnStdout: true).trim()
    }

    stages {
    stage('Prep') {
    steps {
    script {
    withCredentials([
    sshUserPrivateKey(
    credentialsId: 'bitbucket-key',
    keyFileVariable: 'keyFile',
    passphraseVariable: 'passphrase',
    usernameVariable: 'username'
    )
    ]) {
    sshKey = readFile(keyFile).trim()
    }
    }
    }
    }

    stage('Build') {
    agent {
    dockerfile {
    filename 'Dockerfile.build'
    additionalBuildArgs "--build-arg UID=${userId}"
    }
    }
    steps {
    // Turn off command trace for next line, as we dont want to log ssh key
    sh '#!/bin/sh -e\n' + "echo '${sshKey}' > /home/jenkins/.ssh/id_rsa"
    // .. proceed with whatever else, like composer install, etc
    公平地说,我认为 docker 容器中的一些 RUN 命令甚至不是必需的,或者可以从 jenkins 文件中运行? ¯_(ツ)_/¯

    关于docker - 将 Jenkins 凭据传递给 Docker 构建以供 Composer 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60723060/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com