这是我的詹金斯管道:
pipeline {
agent {
docker {
image 'node:6-alpine'
args '-p 3000:3000'
}
}
environment {
CI = 'true'
}
stages {
stage('Build') {
steps {
sh 'npm install'
sh 'npm build'
}
}
stage('Deliver') {
steps {
sh './jenkins/scripts/deliver.sh'
input message: 'Finished using the web site? (Click "Proceed" to continue)'
sh './jenkins/scripts/kill.sh'
}
}
stage('Deploy') {
steps {
sh './jenkins/scripts/deploy.sh'
}
}
} }
我使用Docker和jenkinsci/blueocean
映像运行Jenkins。前两个阶段是构建NodeJS应用程序的一种标准,但是第三个阶段是Jenkins将新文件复制到服务器的部分。这是deploy.sh
个文件:
#!/usr/bin/env sh
set -x
scp -o StrictHostKeyChecking=no -r dist/* deviceappstore:/var/www/my_website/static/
有两个问题,第一个jenkinsci/blueocean
没有scp
(未设置),第二个,~/.ssh/config
在Jankins docker映像中不存在,因此SCP将无法进行身份验证。我的解决方案是从jenkinsci/blueocean
扩展自定义映像,设置SCP并将配置文件和SSH密钥复制到其中。
有些插件类似Publish Over SSH,但似乎对管道项目没有用。
有没有更好的解决方案?整个场景正确还是我做错了什么?我正在寻找针对此问题的最安全,标准的解决方案。
答案 0 :(得分:0)
好的,我想我找到了一个好的解决方案。 感谢SSH Agent plugin,我可以轻松地将凭据传递给SCP命令并将文件复制到服务器。像这样:
...
stage('Deploy') {
steps {
sshagent(['my SSH']) {
echo 'this works...'
sh 'scp -o StrictHostKeyChecking=no -r dist/* my_server:/var/www/my_site/static/'
}
}
}
...
这是完美的,因为所有凭据都在Jenkins服务器内部,并且在存储库中也没有任何内容。
只有一种解决方案可以使用。您需要在apk
(高山)图片中使用jenkinsci/blueocean
,并设置openssh:
apk add openssh
或更佳的解决方案是创建新的Dockerfile
并构建自己的版本。