Windows雲主機自動部署SpringBoot項目

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則是不等待指令返回,防止進程堵塞。(使用poweshell啓動腳本可以解決亂碼的問題)

PsExec64.exe -i 2  -u username -p password -d powershell 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 /t /pid %n%

::自動部署腳本啓動,設置標題
title=wechat
::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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章