免密钥一键发布脚本
开发环境没有jenkins等CI/CD工具,又不想或者没有资源搭建,就采用本地构建打包推到远程
1.本地打包
以windows环境,springboot单体项目为例,其他语言或者springcloud多模块项目根据需要修改
git拉取最新代码 --git-dir
.git
文件夹所在的位置,一般是项目根目录,--work-tree
当前工作目录,也用项目根目录就好
git --git-dir=.git --work-tree=./ pull
springboot项目用maven打包
mvn clean package -DskipTests
2.远程执行命令
由于ssh或scp都采用交互式的密码验证方式,不能通过参数输入密码
为了省去输入密码的过程,可以选择配置密钥 免密登录,免密登录配置可以参考文章
这里主要讲述另一种方式,通过参数的方式验证密码
linux或mac,可以安装使用sshpass
sshpass -p '你的密码' ssh 用户名@主机名 -c 你想要远程执行命令
sshpass -p '你的密码' scp 本地文件路径 用户名@主机名:远程文件路径
windows这里推荐一个跨平台的sshpass,是通过java实现的sshpass,觉得好用可以点个star
这里给的是一个jar包,有需要也可以根据平台打成二进制的可执行文件或exe
java -jar sshpass.jar -h 远程地址 -u 登录用户名 -p 登录密码 -c 你想要执行的命令
java -jar sshpass.jar -h 远程地址 -u 登录用户名 -p 登录密码 --scp 本地文件路径 远程文件路径
3.远程推送发布
具体流程根据实际修改
把远程的包根据时间日期备份一下
java -jar ../sshpass.jar -h %remote_host% -u %remote_host_user% -p %remote_host_passwd% -c "cp %deploy_dir%/start.jar %deploy_dir%/backup/start-$(date +%%Y%%m%%d%%H%%M%%S).jar -f"
把本地包scp到远程
java -jar ../sshpass.jar -h %remote_host% -u %remote_host_user% -p %remote_host_passwd% --scp -i target/start.jar -o %deploy_dir%
重启项目
java -jar ../sshpass.jar -h %remote_host% -u %remote_host_user% -p %remote_host_passwd% -c "cd %deploy_dir% && sh shutdown.sh"
java -jar ../sshpass.jar -h %remote_host% -u %remote_host_user% -p %remote_host_passwd% -c "cd %deploy_dir% && sh startup.sh"
4.完整
下面是我一个实际项目的案例,用的是windows开发,所以是一个cmd脚本
这里是一个多服务项目,根据不同的参数选择发布不同的包
if "%1"=="" goto :eof
set project=""
if "%1" EQU "service1" set project="%1"
if "%1" EQU "service2" set project="%1"
if "%1" EQU "service3" set project="%1"
if %project% EQU "" goto :eof
git --git-dir=../framework-parent/.git --work-tree=../framework-parent pull
git --git-dir=../service1/.git --work-tree=../service1 pull
git --git-dir=../service2/.git --work-tree=../service2 pull
git --git-dir=../service3/.git --work-tree=../service3 pull
set deploy_dir=/opt/backend/%project%
call mvn -f ../framework-parent/pom.xml clean install -DskipTests
@echo on
call mvn clean package -DskipTests
@echo on
set remote_host=xxx.xxx.xxx.xxx
set remote_host_user=root
set remote_host_passwd=xxxxxxxxx
java -jar ../sshpass.jar -h %remote_host% -u %remote_host_user% -p %remote_host_passwd% -c "cp %deploy_dir%/start.jar %deploy_dir%/backup/start-$(date +%%Y%%m%%d%%H%%M%%S).jar -f"
java -jar ../sshpass.jar -h %remote_host% -u %remote_host_user% -p %remote_host_passwd% --scp -i start/target/start.jar -o %deploy_dir%
java -jar ../sshpass.jar -h %remote_host% -u %remote_host_user% -p %remote_host_passwd% -c "cd %deploy_dir% && sh shutdown.sh"
java -jar ../sshpass.jar -h %remote_host% -u %remote_host_user% -p %remote_host_passwd% -c "cd %deploy_dir% && sh startup.sh"
java -jar ../sshpass.jar -h %remote_host% -u %remote_host_user% -p %remote_host_passwd% -c "ps -ef | grep java"