docker+jenkins+pipeline+windowserver+freesshd+ssh 全自动部署到远程服务器,ssh 命令无法执行解决
运行环环境
docker:windows 10 docker
Jenkins:dokcer 拉的 enkinsci/blueocean
服务器:windows sever2008
SSH: freesshd
发现的问题
hostip为准备部署项目的安装了ssh服务器的windows 服务器 user为ssh配置的登录用户,用的时密钥免密登录的方式 如果时需要密码的好像要安装个 sshpass的服务
1.cmd 或powershell执行 ssh user@hostip 得到的返回结果部分无法正常显示,可能时freessh返回的结果字符集编码格式有问题吧 没有解决
2. 在Jenkins pipleline脚本中执行ssh user@hostip “d:/path/shell.sh” 根本不会执行且报错
测试通过的pipeline 代码
hostip为准备部署项目的安装了ssh服务器的windows 服务器
pipeline {
agent none
stages {
stage('MavenBuild') {
agent {
docker {
image 'maven:3.6.1-jdk-8-alpine'
args '-v /D/dcl/dockerdata/.m2:/root/.m2'
}
}
steps {
echo 'Building..'
sh 'pwd'
sh 'mvn --version'
sh 'java -version'
sh 'mvn -B -DskipTests clean package'
}
}
stage('copyandrestart'){
agent any
steps{
sh 'pwd'
echo 'copying'
sh 'scp target/app-v_1.0.0.jar hostip:app-v_1.0.0.jar'
echo 'backup and restart'
//远程服务器执行脚本命令
sh 'ssh hostip "powershell.exe D:\\path\\sshftp\\copysafe.sh"'
}
}
}
}
服务器上运行的脚本
#!/bin/sh
API_NAME=app-v_1.0.0
JAR_NAME=$API_NAME\.jar
PID=$API_NAME\.pid
usage() {
echo "Usage: sh bb.sh [start|stop|restart|status]"
exit 1
}
is_exist(){
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
start(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> ${JAR_NAME} is already running PID=${pid} <<<"
else
nohup java -jar $JAR_NAME > debug_console.log 2>&1 &
echo $! > $PID
echo ">>> start $JAR_NAME successed PID=$! <<<"
fi
}
stop(){
#is_exist
pidf=$(cat $PID)
#echo "$pidf"
echo ">>> api PID = $pidf begin kill $pidf <<<"
kill $pidf
rm -rf $PID
sleep 2
is_exist
if [ $? -eq "0" ]; then
echo ">>> api 2 PID = $pid begin kill -9 $pid <<<"
kill -9 $pid
sleep 2
echo ">>> $JAR_NAME process stopped <<<"
else
echo ">>> ${JAR_NAME} is not running <<<"
fi
}
status(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> ${JAR_NAME} is running PID is ${pid} <<<"
else
echo ">>> ${JAR_NAME} is not running <<<"
fi
}
restart(){
stop
start
}
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
exit 0