Jenkins连接Window服务器,上传jar并启动

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,然后输入仓库urlCredentials.

构建页签

选择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>

猜你喜欢

转载自blog.csdn.net/achenyuan/article/details/81181347
今日推荐