前提

jenkins安装,参考:(一)jenkins+bonobo git server+windows系统自动化部署springboot项目(jenkins安装) 自动化部署,参考:(二)jenkins+bonobo git server+windows系统自动化部署springboot项目(自动化部署)

1.在需要部署程序的服务器上安装OpenSSH的服务端

注意:OpenSSH 在 2018 年秋季已添加至 Windows,并包含在 Windows 10 和 Windows Server 2019 中

1)首先通过powershell安装OpenSSH的服务端

在开始图标

jenkins操作远程主机工程 jenkins windows远程_jenkins


上点击右键,选择Windows PowerShell(管理员)(A)

在powershell中输入:

# 安装OpenSSH客户端		
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0		
					
#安装OpenSSH服务端		
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

在powershell中输入:

Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'

若返回为:

Name  : OpenSSH.Client~~~~0.0.1.0		
State : Installed		
					
Name  : OpenSSH.Server~~~~0.0.1.0		
State : Installed

则表示安装成功,若返回为:

Name  : OpenSSH.Client~~~~0.0.1.0		
State : NotPresent		
					
Name  : OpenSSH.Server~~~~0.0.1.0		
State : NotPresent

表示安装失败,再来一遍吧,注意全程需要管理员权限。

2启动SSH服务器

依然是以管理员身份打开PowerShell,然后运行以下命令来启动 sshd service

#启动sshd服务		
		Start-Service sshd		
				
		# 将sshd服务设置为自动启动,若不设置需要在每次重启后重新开启sshd		
		Set-Service -Name sshd -StartupType 'Automatic'		
				
		# 确认防火墙规则,一般在安装时会配置好		
		Get-NetFirewallRule -Name *ssh*

jenkins操作远程主机工程 jenkins windows远程_windows_02

# 若安装时未添加防火墙规则"“OpenSSH-Server-In-TCP”",则通过以下命令添加

New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

3开启密钥登录

这一步是重中之重,加强安全,减少麻烦!!!

首先在cmd命令窗口运行命令生成ssh秘钥:

运行:ssh-keygen -t rsa。要获得更安全的4096位密钥,请运行:ssh-keygen -t rsa -b 4096

在询问您要将密钥保存在何处时,按Enter键(这将使用默认位置)。

输入密钥密码。不输入则为无密码

jenkins操作远程主机工程 jenkins windows远程_jenkins_03


上图表示生成成功,秘钥默认生成位置:C:\Users\用户名.ssh

id_rsa.pub为公钥

id_rsa为私钥

jenkins操作远程主机工程 jenkins windows远程_windows_04

公钥 (~.ssh\id_rsa.pub) 的内容需放置在服务器上的一个名为authorized_keys的文本文件中,该文件位于 C:\Users\username.ssh\。 OpenSSH 客户端包括了 scp 来帮助实现此目的,这是一个安全的文件传输实用工具。

可以手动复制文件修改成authorized_keys,也可以用下面的命令生成

# 确保服务器上存在.ssh 文件夹,若不存在则使用下面命令创建		
ssh username@ip mkdir C:\Users\username\.ssh\		
		
#通过scp将本地的公钥上传到服务器上并重命名为authorized_keys,注意此方法会覆盖原有authorized_keys		
scp C:\Users\username\.ssh\id_rsa.pub user1@ip:C:\Users\username\.ssh\authorized_keys

查看是否生成成功:

jenkins操作远程主机工程 jenkins windows远程_jenkins操作远程主机工程_05


后续有多个客户端需要连接该服务器时,将authorized_keys以记事本的格式打开,将客户端生成的公钥另起一行粘贴到其中,如下图

如果authorized_keys文件不能直接修改,请复制到别的路径进行修改后再更新到C:\Users\username.ssh\

jenkins操作远程主机工程 jenkins windows远程_spring boot_06

在Windows OpenSSH中,默认的授权密钥存放位置为C:\ProgramData\ssh\administrators_authorized_keys,此位置对应为管理用户权限。因此需要修改默认授权文件位置。通过文本编辑器(推荐vscode)打开ProgramData\ssh\sshd_config,修改以下条目

#允许公钥授权访问,确保条目不被注释		
PubkeyAuthentication yes		
		
#授权文件存放位置,确保条目不被注释		
AuthorizedKeysFile      .ssh/authorized_keys		
		
#可选,关闭密码登录,提高安全性		
PasswordAuthentication no		
		
#注释掉默认授权文件位置,确保以下条目被注释		
#Match Group administrators		
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

注意修改sshd_config需要管理员权限,修改完成后保存并推出。
在PowerShell(管理员)中重启sshd服务

#重启sshd,需要管理员权限		
Restart-Service sshd

至此可以使用ssl登录windows了

最后附赠如何使用PowerShell卸载Windows OpenSSH

# 卸载 OpenSSH 客户端		
Remove-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0		
		
# 卸载 OpenSSH 服务端		
Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

4、jenkins配置

1在jenkins所在的服务器上生成ssl秘钥(生成方法参考上记步骤)
生成秘钥后,将公钥复制粘贴到系统部署服务器的authorized_keys文件中

2、jenkins系统配置

配置ssl连接,新增ssl服务器连接

jenkins操作远程主机工程 jenkins windows远程_windows_07


jenkins操作远程主机工程 jenkins windows远程_jenkins_08


点击高级

jenkins操作远程主机工程 jenkins windows远程_windows_09


填写上面步骤中生成的私钥的地址,设置端口:22,保存设置

jenkins操作远程主机工程 jenkins windows远程_spring boot_10


3、新建item,配置部署命令

部署的配置和部署到本机基本相同,只在构建的命令出有所区别

此处在构建处选择:Send files or execute commands over SSH

jenkins操作远程主机工程 jenkins windows远程_jenkins操作远程主机工程_11


填写要传送的文件以及命令

jenkins操作远程主机工程 jenkins windows远程_windows_12


注意1:

Source files:填写相对路径,此处默认根路径为:C:\Users\Administrator.WIN-C4VV3ILSN5P.jenkins\workspace\item名\

Remove prefix:表示传送时要去除的前缀,如果不去除,传送文件时会创建相应的目录

Remote directory:表示传送文件的路径,设置【/】表示根目录,因为在步骤2中设置了ssl登录的根目录为:【D:\001test】,所以此处表示传送到路径:【D:\001test】

Exec command:将启动程序等的命令放到批处理中,然后在此处调用bat文件,注意前面要加上【cmd /c】否则可能不会执行

bat命令内容说明
如果直接在bat中写执行jar包的命令【java -jar 】,那在ssl断开的时候,默认也会终止所有ssl启动的进程,所以在java程序启动后,又会被OpenSSH服务结束,最终导致无法启动
基于此问题,Linux下可以通过nohup来把启动的程序作为服务来长久运行;那么Windows下也是可以这么做的,有几种方法:

  1. 把程序变做Windows服务,然后shell中通过net start 命令启动服务
    但这种做法需要改变程序或者依赖其他程序把当前的程序变为服务
  2. 通过Windows的计划任务来实现
    创建一个启动程序的计划任务,然后通过以下命令来启动。
    “schtask /run /tn “”/任务目录/任务名字”" "
    此处采用第二种方法
    1.首先创建启动程序的bat:start.bat
  3. jenkins操作远程主机工程 jenkins windows远程_jenkins_13

@echo off

::把bat所在的目录设置成当前工作路径
cd /d %~dp0

"set titlename=""自动化测试"""
set jarfile=test
set port=9001
set copysource=D:\001test\
set copytargert=D:\001test\001\

::根据端口号关闭指定进程
"for /f ""tokens=1-5"" %%i in ('netstat -ano^|findstr "":%port%""') do ("
 echo kill the process %%m who use the port 
 taskkill /pid %%m -t -f
 goto q
)
:q

set CURRENT_DATE=-%date:~,4%%date:~5,2%%date:~8,2%
:: 时钟从第0位开始截取2位,分钟从第3位开始截取2位,秒钟从第6位开始截取2位  
set HOUR=%time:~0,2%
set MINUTE=%time:~3,2%
set SECOND=%time:~6,2%
:: 当时钟小于等于9时,前面有个空格,这时我们少截取一位,从第1位开始截取  
set TMP_HOUR=%time:~1,1%
set NINE=9
set ZERO=0
:: 处理时钟是个位数的时候前面补上一个0, LEQ表示小于等于  
if %HOUR% LEQ %NINE% set HOUR=%ZERO%%TMP_HOUR%
set CURRENT_TIME=%HOUR%%MINUTE%%SECOND%


::修改文件名
ren %jarfile%.jar %jarfile%%CURRENT_DATE%%CURRENT_TIME%.jar

::拷贝jar包
copy /y %copysource%%jarfile%.jar %copytargert%
::启动jar包
start %titlename% java -Dfile.encoding=UTF-8 -jar %copytargert%%jarfile%.jar --server.port=%port%
"::schtask /run /tn ""自动化部署"" "
exit

2创建一个启动程序的计划任务

jenkins操作远程主机工程 jenkins windows远程_git_14


jenkins操作远程主机工程 jenkins windows远程_git_15


3、创建启动任务的bat:start1.bat

jenkins操作远程主机工程 jenkins windows远程_spring boot_16

"schtasks /run /tn ""自动化部署"" "
exit

4、在jenkins中调用start1.bat启动计划任务

jenkins操作远程主机工程 jenkins windows远程_git_17

cmd /c "D:\001test\001\start1.bat"
至此即完成部署到远程windows的配置,push代码进行测试