4

我在我们公司的 BitBucket 私有存储库中有一个作曲家包。要访问它,我需要使用存储在 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都是空的。

4

2 回答 2

1

TL;DR 使用 jenkinswithCredentials([sshUserPrivateKey()])并将私钥回显到容器中的 id_rsa 中。

编辑:删除了“以root身份运行”步骤,因为我认为这会导致问题。相反,在 docker 容器中创建了一个 jenkins 用户,其 UID 与构建 docker 容器的 jenkins 用户相同(不知道这是否重要,但我们需要一个具有主目录的用户,以便我们可以创建 ~/.ssh/id_rsa)

对于那些像我一样受苦的人......我的解决方案如下。这并不理想,因为:

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

所以谨慎使用...

在我的(旧版)git 项目中,一个简单的 php 应用程序具有基于内部 git 的作曲家依赖项,我有

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 文件中运行?¯_(ツ)_/¯

于 2021-03-25T12:52:07.470 回答
0

有一个类似的问题,据说在PR 327中修复,使用 pipeline-model-definition-1.3.9

所以开始检查你的插件的版本。

但也要注意Dockerfile 警告

不建议使用构建时变量来传递 github 密钥、用户凭据等机密信息。使用该命令
的映像的任何用户都可以看到构建时变量值。docker history

使用 buildkit with--secret是一种更好的方法。

于 2020-03-24T21:17:01.850 回答