欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Windows云主机自动部署SpringBoot项目

程序员文章站 2022-03-02 10:21:24
...

1. 运行环境

  • 服务器 :Windows Server 2016

  • 所需的软件:PsTools,PowerShell


2. 实现的功能

同时使用python的pywinrm,实现远程调用Windows主机上的批处理脚本,并且可以打开控制台窗口。


3. 具体环境配置

  • windwos主机上的powershell开启远程连接的教程可以直接参考pywinrm上的教程,网上的教程也很多,这里就不多赘述,可以在PowerShell使用winrm enumerate winrm/config/listener检查命令是否开启。
  • 安装PsTools(第四点会说明为什么需要这个软件),运行PsExec64.exe(只需要这一个程序,放在什么地方都可以),看看是否可以成功地调用命令,可以使用PsExec64.exe cmd进行简单的测试。
  • 在自己本地的主机上安装python3.6以及pywinrm ,python的执行脚本如下
# coding:utf-8
import winrm
import sys
try:
    s = winrm.Session('yourhostname', auth=('username', 'password'))
    # r = s.run_cmd('ipconfig')
    # r = s.run_cmd('ipconfig', ['/all'])
    # 执行bat文件
    get_dir = s.run_cmd('C:/Users/Administrator/Desktop/start_build.bat {0}'.format(sys.argv[1]))
except Exception as e:
    print(e)
  • 自动部署的批处理文件,需要使用两个文件,一个是调用PsTools的PsExec64程序执行自动部署的批处理脚本,一个是自动部署脚本。

这里解释一下PsExec64程序的几个参数的含义,-i是用来指定session的,至于这个session的值,不同的主机可能不同吧,没具体测试过,可以通过使用命令tasklist /v /fo csv查看控制台进程的session,其中"2"即为session的值。

C:\Users\Administrator>tasklist /v /fo csv | findstr "cmd"
"cmd.exe","6136","RDP-Tcp#7","2","2,476 K","Running","172_16_0_4\Administrator","0:00:00","管理员: C:\Windows\system32\cmd.exe - java  -jar demo-0.0.1-SNAPSHOT.jar"

而-u,-p则是指定运行指令的身份和密码,这里最好选择有高级权限的用户,不然可能还是会无法成功运行,至于-d则是不等待指令返回,防止进程堵塞。

PsExec64.exe -i 2  -u username -p password -d C:\Users\Administrator\Desktop\xxx.bat
  • 自动部署脚本的实现就只是简单的对项目进行同步打包,然后直接在控制台启动了,这里的脚本通过设置控制台的标题用于识别已经存在的项目进程并将其杀死。
::杀死进程
@echo off
for /f "tokens=2 delims=,*" %%i in ('tasklist /v /fo csv ^| findstr "wechat"') do (
    set n=%%i
)
taskkill /f /pid %n%

::自动部署脚本启动,设置标题
title=wechat
:: 设置控制台编码
chcp 65001
::git 同步
cd C:\Users\Administrator\Downloads\UniformSystemWechat
git pull
::调用maven
call mvn -f pom.xml clean package
cd target
java -jar uniformssystem-0.0.1-SNAPSHOT.jar --spring.profiles.active=test

4. 遇到的问题

  1. 运行脚本的时候突然退出
  2. 运行脚本的时候卡住
  3. 无法打开控制台窗口
  • 其中2,3点的原因是一样的(就我遇到的情况而言),由于使用winrm的远程连接,创建的批处理进程都是属于System这个Session,而GUI程序所需要的Session不是上面那一个Session,因此远程调用脚本之后会卡住,并且也看不到控制台窗口。至于解决方法,由于我对powershell的命令不是很熟悉,不知道要如何配置执行的命令的session,所以这里借助了一个微软提供的软件PsTools,该软件可以指定执行的命令的session。
  • 事实上应该是不需要PsTools来中转的,但是我一直没找到其它的实现方法。。。有知道的人欢迎留言分享一下。
  • 至于第1点则是我运行的脚本的某一个调用的命令里面含有退出命令,像是我调用了mvn进行打包,由于mvn本身就是批处理脚本,其运行结束之后会直接结束整一个进程,至于解决方法也很简单,只要在调用mvn前面加一个call就可以了。即call mvn pom.xml clean package
相关标签: 教程