前提
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的服务端
在开始图标
上点击右键,选择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*
# 若安装时未添加防火墙规则"“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键(这将使用默认位置)。
输入密钥密码。不输入则为无密码
上图表示生成成功,秘钥默认生成位置:C:\Users\用户名.ssh
id_rsa.pub为公钥
id_rsa为私钥
公钥 (~.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
查看是否生成成功:
后续有多个客户端需要连接该服务器时,将authorized_keys以记事本的格式打开,将客户端生成的公钥另起一行粘贴到其中,如下图
如果authorized_keys文件不能直接修改,请复制到别的路径进行修改后再更新到C:\Users\username.ssh\
在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服务器连接
点击高级
填写上面步骤中生成的私钥的地址,设置端口:22,保存设置
3、新建item,配置部署命令
部署的配置和部署到本机基本相同,只在构建的命令出有所区别
此处在构建处选择:Send files or execute commands over SSH
填写要传送的文件以及命令
注意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下也是可以这么做的,有几种方法:
- 把程序变做Windows服务,然后shell中通过net start 命令启动服务
但这种做法需要改变程序或者依赖其他程序把当前的程序变为服务 - 通过Windows的计划任务来实现
创建一个启动程序的计划任务,然后通过以下命令来启动。
“schtask /run /tn “”/任务目录/任务名字”" "
此处采用第二种方法
1.首先创建启动程序的bat:start.bat
@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创建一个启动程序的计划任务
3、创建启动任务的bat:start1.bat
"schtasks /run /tn ""自动化部署"" "
exit
4、在jenkins中调用start1.bat启动计划任务
cmd /c "D:\001test\001\start1.bat"
至此即完成部署到远程windows的配置,push代码进行测试