Jenkins连接Window服务器,上传jar并启动
前言
有时候受限于公司和个人的技术水平,有些人喜欢用windows
当服务器,我们做技术的也没办法,只有迎头往上。这不,局域网用windows当部署服务器,同时我又喜欢弄自动化构建工具jenkins
,所以才有下面的文章。
windows服务器
如果用windows的话,windows服务器必需支持SSH
连接,这里,我使用powershell server
做中间件,让win服务器支持ssh
,使用方法见另一篇文章windows服务器里实现通过ssh工具SecureCRT
jenkins配置
jenkins
安装就不说了,如果你不会去百度或搜索我的文章,若拿linux
做为服务器,我们会配置,但若是windows呢?这毕竟比较小众,这里详细叙述windows服务器自动化构建配置。
我的项目使用gradle
做为构建工具,大部分项目使用maven
构建,其实就中间执行构建命令不一样,其它都一样。
配置gradle
系统管理->系统设置->Gradle
配置ssh
系统管理->全局工具配置->Publish over SSH
单击新增按钮,增加一个ssh server
Username
:就是服务器帐号,注意这个帐号就是屏幕锁屏帐号
Passphrase / Password
:就是帐号密码
Remote Directory
:必需填/
,虽然服务器是wins的,但也必需用/
新建项目
选择“构建一个自由风格的软件项目
”,输入项目名“Test”,如果你使用maven构建,则选择“构建一个maven项目
”,如果没有,是因为你没安装maven插件。
源码管理
页签
源码管理页签选择git,然后输入仓库url
和Credentials
.
构建
页签
选择Invoke Gradle script
构建后操作
页签
在服务器D盘上创建三个文件夹
d:\jar //存放当前执行jar
d:\jarNew //通过jenkins上传复制的文件,做为文件缓存
d:\jarOld //备份jar
下面配置比较关键
Source files
:要上传的文件,这里指定上传的是jar,build/libs/*.jar
Remove prefix
:指定需要过滤的文件夹,build/libs/
Remote directory
:指定将war上传到服务器哪个目录,由于服务器是win系统,所以这里只能填 /
,而它最终上传的目录在C:\Program Files\nsoftware\PowerShell Server 2016\sftproot
,即powershell server
安装目录下的sftproot
目录里。重点
Exec command
:上传完成后要执行的linux命令,这里执行cmd
命令或powershell
命令
下面是服务器上的可执行批处理文件
备份和处理jar文件backup.bat
::cd d:\jar
::从sftproot里拷贝传输的jar
copy C:\"Program Files"\nsoftware\"PowerShell Server 2016"\sftproot\*.jar d:\jarNew
::从jarnew拷贝jar到jar工作目录
copy d:\jarNew\DyoonPLM-1.6.4-SNAPSHOT.jar d:\jar
::备份jar文件到jarOld
copy d:\jar\DyoonPLM.jar d:\jarOld\
::按日期重命名
ren d:\jarOld\DyoonPLM.jar DyoonPLM%Date:~0,4%%Date:~5,2%%Date:~8,2%%Time:~0,2%%Time:~3,2%%Time:~6,2%.jar
::删除
del d:\jar\DyoonPLM.jar
::重命名
ren DyoonPLM-1.6.4-SNAPSHOT.jar DyoonPLM.jar
::超过10天的文件就删除
forfiles /p "d:\jarOld" /s /m *.jar /d -10 /c "cmd /c del @path"
刹java.exe进程killJar.bat
,其实杀进程有3种选择,不同选择对应不同情况
- 选择一
使用PID杀进程,它会把所以java.exe进程全部杀死,(下面的批处理java.exe是要杀死的进程目标)
::批处理杀java.exe进程
@ECHO OFF
:check java.exe
::将所有进程信息列入list.txt文件里面(这里默认当前目录)
tasklist >list.txt
::从list.txt文件里查找java.exe这个进程
find /i "java.exe" list.txt
::如果进程不存在,执行start处的代码;反之执行kill处的代码
if "%errorlevel%"=="1" (goto start) else (goto kill)
:kill
::杀掉进程
taskkill /f /im java.exe
- 选择二
按进程名称杀进程,同样,他会杀进指定名称的全部进程
taskkill /f /t /im java.exe
/f
:强制杀进程
/t
:结束进程树,是tree的缩写,/t不是必带的参数
/im
:是image name缩写,表示后面是进程名,当然/im
可以换成/pid
,如果/pid
,则后面是pid值
java.exe:
要杀死的进程名。
- 选择三
这是我推荐的方式,因为一台机器可以跑多个同样的java.exe,这样就不能通过名称云区分,但他们使用的端口肯定不一样。
使用端口杀进程方式好。
@echo off
setlocal enabledelayedexpansion
set port=8080
::set /p port=请输入端口号:
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!
)
pause
上面指定杀死占用8080
端口的进程,其他进程不受影响。
启动jar启动startJar.bat
java -jar DyoonPLM.jar
执行全部批处理tstartAll.bat
程序中注意call与start的区别,call类似同步调用,必需等待另一个批处理完成后才会继续执行,start类似异常执行,它不会等待另一个批处理完成。start不受影响,继续执行下一条命令。
call backup.bat
call killJar.bat
start startJar.bat
执行
执行自动构建,输入如下表示成功
BUILD SUCCESSFUL in 2m 59s
4 actionable tasks: 4 executed
Build step 'Invoke Gradle script' changed build result to SUCCESS
SSH: Connecting from host [1W3NYUMYSVUJ919]
SSH: Connecting with configuration [192.168.1.245] ...
SSH: EXEC: STDOUT/STDERR from command [cd C:\"Program Files"\nsoftware\"PowerShell Server 2016"\sftproot
copy *.jar d:\jar] ...
SSH: EXEC: completed after 601 ms
SSH: Disconnecting configuration [192.168.1.245] ...
SSH: Transferred 1 file(s)
Finished: SUCCESS
修改jenkins端口号
在C:\Users\Administrator\.jenkins
目录下有个jenkins.xml
文件,修改其中8080
即可
<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war"</arguments>