我有一个非常基本的Jenkins pipeline
,它构建了一个Java
项目并将该工件部署到EC2
实例。
构建部分工作正常,但部署不起作用,并给出与scp
相关的错误。
我将我scp
中存在的整个Jenkinsfile
命令粘贴到Windows
命令提示符上以查看它是否有效并通过jar复制到ec2
实例成功,它确实有效。
不知道为什么它不通过Jenkins
工作。
Jenkinsfile
pipeline {
agent any
tools {
maven "Maven3"
}
stages {
stage('Build and Deploy') {
steps {
script {
def os = System.properties['os.name'].toLowerCase()
echo "OS: ${os}"
if (os.contains("linux")) {
sh "mvn clean install -DskipTests"
} else {
bat "mvn clean install -DskipTests"
bat "scp -i C:\\Users\\Nital\\.ssh\\LightsailDefaultKey-us-east-1.pem target\\helloworld-rest-app.jar [email protected]:/home/ec2-user/app-deploys"
}
}
}
post {
success {
echo 'Build and Deploy - SUCCESS'
}
}
}
}
}
Windows命令提示符:
C:\Users\Nital>scp
usage: scp [-346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program] source ... target
詹金斯错误日志:
[INFO] Installing C:\Program Files (x86)\Jenkins\workspace\helloworld-rest-app-build\pom.xml to C:\Windows\system32\config\systemprofile\.m2\repository\com\example\helloworld-rest-app\0.0.1-SNAPSHOT\helloworld-rest-app-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.991 s
[INFO] Finished at: 2019-01-25T00:11:10-05:00
[INFO] ------------------------------------------------------------------------
[Pipeline] bat
C:\Program Files (x86)\Jenkins\workspace\helloworld-rest-app-build>scp -i C:\Users\Nital\.ssh\LightsailDefaultKey-us-east-1.pem target\hellworld-rest-app.jar [email protected]:/home/ec2-user/app-deploys
'scp' is not recognized as an internal or external command,
operable program or batch file.
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE
在执行任何命令(如scp等)之前添加此行。
PATH=/sbin:/usr/sbin:/usr/bin:/usr/local/bin
这是因为可执行文件位于Windows System32目录中,并且出于安全考虑,无法从脚本访问。如果你将ssh
和scp
可执行文件从windows目录中复制出来并将新目录放入你的路径中它应该可以工作。
如果你需要来自Windows的scp
,那么为什么不简单地使用pscp
来实现这一目标呢?
安装PuTTY,其中还包括PSCP(SCP for Windows)。
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
请为您的计算机选择最新版本的MSI('Windows Installer')(32位或64位)
如果你想在Java程序中使用它,那么这是一个例子:http://www.jcraft.com/jsch/examples/ScpFrom.java.html
Scp命令用于在两个Linux / Unix计算机系统之间安全地传输文件
scp命令的语法是:
scp [options] username1@source_host:directory1/filename1 username2@destination_host:directory2/filename2
并且为了在windows中使用scp命令,请使用pscp:
pscp c:\documents\info.txt [email protected]:/tmp/foo/info.txt
请通过关节
https://it.cornell.edu/managed-servers/transfer-files-using-putty