Jenkins通过FreeSSHd远程部署至windows

前言

前段时间成功通过Jenkins将一个必须运行在windows上的springboot项目部署到远程的windows7上,记录一下以备后查。Jenkins V2.204.1 , publish-over-ssh V1.20.1. FreeSSHd V1.3.1

1. 安装FreeSSHd

第一步,官网下载http://www.freesshd.com/?ctt=download,选择freeSSHd.exe。安装据说需要具有管理员权限,我使用的administrator账户登录的。安装时其他都是默认安装选项,只有最后两步会弹出对话框询问是否生成私钥和是否设置为系统服务,选择“yes"即可,因为没有生成私钥,SSH服务将不能启动,设置系统服务的话每次开机都会自动启动SSH服务。

第二步,结束掉进程里面的freesshdservice.exe进程,然后双击桌面的freesshd图标进行配置,先到User选项卡添加SSH用户,如图,添加默认的系统管理员帐号,authorization选择NT authentication,这样的话密码就是系统管理员帐号的密码。然后勾选shell,SFTP选项,确定添加。

第三步,选择SSH,配置如下,然后在SFTP中设置home path,该SFTP home path就是以后通过ssh上传文件的根目录。

第四步,选择Authentication选项卡,password authentication项选择Required项,Public key authentication选择Disabled项。如果不这样设置连接的时候将会出现Access denied的错误,导致ssh客户端不能连接。

第五步,右键点击任务栏下的freesshd图标点击Unload退出软件,然后重新打开freesshd软件。打开后点击Server status下的Click here to start 启动SSH服务

第六步,添加22端口的防火墙放行,>> 控制面板\系统和安全\Windows 防火墙\高级设置\入站规则\新建规则:

规则类型:端口,下一步;特定本地端口:22,下一步;允许连接,下一步;何是应用该规则选择全部,下一步;名称随便取,完成。

最后,可以找个测试机,利用putty使用ssh协议连接目标主机的22端口,使用administrator以及系统登录密码测试连接即可。

2. 配置Jenkins插件

第一步,安装Publish Over SSH插件,Jenkins > Manage Jenkins > Manage Plugins > 找到 Publish Over SSH插件安装重启Jenkins .

第二步,配置Publish Over SSH插件,菜单路径: Jenkins > Manage Jenkins > Configure System > Publish over SSH,添加一个SSH Servers,

Name随便取,Hostname是远程windows7的IP,Passphrase / Password填对应的administrator账户的密码,在Advanced中Port指定端口22. 填写完成之后可以使用Test Configuration测试连接是否成功。

3. 创建并启动Jenkins Slave节点

第一步,创建节点,菜单路径是Jenkins > Manage Jenkins > Manage Nodes > New Node:

 Node name随便取一个,选中Permanent Agent,点击OK进入详细页面,其中Labels 填写的名称一会要用在创建作业中,注意Launch method选择的选项:

 

创建完成之后,节点的状态是离线状态,需要在远程windows7上启动节点。可以在刚刚创建的节点status页面得到指导。

 

第二步,在windows7上登录到Jenkins管理界面,进入刚刚创建的节点的status页面(如下图),下载agent.jar到本地,然后在cmd命令运行图中的命令,之后下面的界面将会显示“Agent is connected.”

4. 准备启停bat脚本

 在springboot项目src\main\resources下创建两个bat脚本,如下所示:

@echo off
setlocal enabledelayedexpansion
set port=8885
for /f "tokens=1-5" %%a in ('netstat -ano ^| find ":%port%"') do (
 if "%%e%" == "" (
     set pid=%%d
 ) else (
     set pid=%%e
 )
 echo !pid!
 taskkill /f /pid !pid!
)
exit 0
@echo off
set BUILD_ID=dontKillMe
set JAVA_HOME=D:\jdk\jdk1.8.0_251
set classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
set path=%JAVA_HOME%\bin

java -jar xxxx-0.0.1-SNAPSHOT.jar
exit

第一个shudown.bat 脚本用于杀死占用8885端口的应用程序(因为这个项目部署之后是运行在8885端口),最后的exit 0是告诉Jenkins在进行作业编译的时候是成功结束的,因为可能有时候根本没有占用该端口的程序,脚本就会抛异常,从而Jenkins会认为任务执行失败。

第二个start.bat 脚本就是用于执行 springboot jar,这里还可以设置使用的jdk版本,并且这样的JAVA_HOME设置不会影响远程主机的环境变量。注意 set BUILD_ID=dontKillMe 是告诉Jenkins在执行任务完成之后不要杀死后台进程,这很重要!!!

5. 创建Jenkins作业

我创建了三个自由风格的任务,第一个任务执行shudown.bat,第二个任务执行 从git拉取代码maven打包之后通过Publish Over SSH将jar推送到远程windows7主机。第三个任务执行start.bat 启动项目,可以通过配置任务的上下游关系将它们关联起来。注意,Restrict where this project can be run 要选择之前创建的节点的label。

第一个作业:

Build -> Execute Windows batch command:

Command: start call "D:\xxxx\shudown.bat"

第二个作业:

省略git拉取代码,maven打包的过程。。。

Post Steps ->  Send files or execute commands over SSH > SSH Publishers -> Add Server, SSH Server 选择之前在Publish Over SSH插件中配置的Name,然后Add Transfer Set拷贝文件至远程windows7.

Transfer Set 中 :Source files 是要拷贝的源文件,可以使用通配符*, Remove prefix 是要移除的目录层次结构,Remote directory 是要上传到远程SFTP根目录下的那个文件夹。例如:

这样的配置将会上传springTest/src/main/resources目录下面所有的bat文件到SFTP根目录下的/bat文件夹下,如果Remove prefix 不设置,那么将会上传到/bat/springTest/src/main/resources目录下。

注意!!!如果有多个Transfer Set ,那么第二次操作的远程目录的当前目录位于上一次Transfer Set操作的目录下,例如上图这种情况,如果再Add Transfer Set一个Transfer Set ,那么第二次Transfer Set 时,Remote directory 指向的其实是/bat文件夹,因此如果第二个Transfer Set 的Remote directory 为 "/" 的话,将会把第二次上传的文件也放在远程的/bat文件夹下。

第三个作业:

Build -> Execute Windows batch command:

Command: start call "D:\xxxx\start.bat"

注意!!!,第一个作业与第三个作业中shudown.bat和start.bat文件的路径以及start.bat中jar文件的路径由第二个作业实际上传到远程windows7的路径为准。Command中的 start call XXXX表示要新开一个cmd窗口执行脚本,如果不使用start命令而用“cmd /c ” 则将会直接在Jenkins的任务build控制台执行,导致Jenkins无法退出,等到超时之后Jenkins会自动杀掉命令。而当新开cmd窗口之后,如果命令中不指定BUILD_ID=dontKillMe,在Jenkins执行作业成功退出之前也会杀死后台进程。

6. 运行测试

 没什么说的,依次build 这三个作业任务,发现成功在远程windows7主机上通过cmd命令启动了springboot项目。

posted @ 2020-06-02 17:13  莫待樱开春来踏雪觅芳踪  阅读(1512)  评论(0编辑  收藏  举报