TL;DR
使用 jenkinswithCredentials([sshUserPrivateKey()])
并将私钥回显到容器中的 id_rsa 中。
编辑:删除了“以root身份运行”步骤,因为我认为这会导致问题。相反,在 docker 容器中创建了一个 jenkins 用户,其 UID 与构建 docker 容器的 jenkins 用户相同(不知道这是否重要,但我们需要一个具有主目录的用户,以便我们可以创建 ~/.ssh/id_rsa)
对于那些像我一样受苦的人......我的解决方案如下。这并不理想,因为:
- 如果你不小心,它可能会在构建日志中暴露你的私钥(下面是小心的,但很容易忘记)。(尽管考虑到这一点,对于任何有顽皮意图的人来说,提取 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 文件中运行?¯_(ツ)_/¯