jenkins自动化部署项目1--下载安装启动(windows)
我的jenkins服务是是部署在windows上的
一.下载安装:
我安装的是当时最新版本的jenkins2.89.4,直接官网下载zip文件,解压之后点击jenkins.msi文件傻瓜式安装(这个msi文件不要删掉,后面如果jenkins遇到一些无法解决的插件安装问题等等,可以试着用它repair,会保留已有的job和配置)
Ps:jenkins是默认开机自启的,但是如果jenkins默认的8080端口被占用服务起不来,则需要更改默认端口。
1.网上找到的方法是在jenkins目录下执行java -jar jenkins.war --ajp13Port=-1 --httpPort=8082这条命令,我尝试了这种方法但是cmd命令窗口不能关闭,只要关闭服务就会停掉
针对此种方式可以start javaw -jar jenkins.war --ajp13Port=-1 --httpPort=8082 以后台服务的方式启动jenkins。但是每次重启都要指定端口
2.(推荐)直接找到jenkins\jenkins.xml文件修改第41行httpPort为8082,此时如果直接使用命令start javaw -jar jenkins.war,会发现启动的jenkins服务还是用的默认端口8080,正确的启动方式是:net start jenkins
jenkins自动化部署项目2 --插件的选择和安装
一.安装插件:
我选择的安装建议的插件,也可以自定义安装自己想要的插件,在不敢保证自己确定要用的插件是完全正确的情况下建议按推荐安装
我理解的jenkins+tomcat完成自动化部署maven项目需要如下插件:Maven Integration(安装此插件可以使用maven),Publish Over SSH(安装此插件可以使用ssh将代码部署到远程服务器上去),Deploy to container(ssh不能登录windows,因此如果项目需要部署在windows上时可以考虑使用这个插件或者ftp的插件),GitHub(此插件可以去git下载代码),SSH plugin(远程执行ssh命令)
Gitlab Hook(需要提交代码即可触发项目构建需要安装此插件,并在git服务器用管理员帐户在【设置-webhook】配置jenkins访问地址,由于我们的代码是放在外网git服务器上的,jenkins无法被外网访问,因此不考虑该构建方式)
*按照上面所说,后面在【系统管理-插件管理-可选插件】下搜索并安装如下几个插件(其他插件已经被推荐安装):Maven Integration(安装此插件可以新建maven风格的job) , Publish Over SSH(用来远程部署代码到linux服务器上,ssh不能远程登录到windows上)
Ps:1.我两次在不同的机器上安装jenkins第一次进入系统管理,都遇到如下图所示报错,这种情况,我通过运行jenkins.msi,repair之后重新进入就好了
2.有时候安装插件会失败,重新安装几次就好,大部分原因可能是网络问题:
jenkins自动化部署项目3 -- 安装和配置jdk、maven、git
Jenkins提供了自动安装jdk,maven,git的功能,在【系统设置-全局工具配置】里,但是我自动安装没反应,因此我是先手工安装和配置它们的环境变量然后再在【系统设置-全局工具配置】里配置:
1.jdk
2.git
3.maven
jenkins自动化部署项目4 -- 系统管理-系统设置ssh配置
【系统管理】-【系统设置】
如果应用服务(前端后台)要部署在linux服务器上,我选择的是用ssh
为了jenkins登录远程登录linux服务器可以免密登录,先配置公钥和私钥:
我是在windows上通过git的命令窗口先生成公钥和私钥
1.执行命令ssh-keygen -t rsa -P ''生成公钥和私钥
在jenkins所在服务器上面执行 ssh-keygen -t rsa -P '', -P后面两个单引号表示密码为空
之后会在/.ssh目录下创建两个文件id_rsa(私钥),id_rsa.pub(公钥)
2.接下来继续在jenkins所在windows服务器上通过git命令执行
ssh-copy-id -i /C/Users/yangyuan/.ssh/id_rsa.pub [email protected](注意路径格式,不然会报错),表示将公钥发给远程linux服务器xx.21.21.xxx的~/.ssh目录下
上面命令中root为我要ssh远程登录的linux服务器上的用户名,一开始我没有加上root@,一直提示输入密码,怎样都报错,后来尝试着改了,输入root用户密码就可以了
错误操作:
正确操作:
3.以上2步就配置好了ssh免密登录linux服务器了,接下来只需要在jenkins的【系统管理】-【系统设置】中配置好ssh就行如下图
4.配置完成后点击测试,成功就证明ok了,后面新建job时就可以在【Post Steps】&【构建后操作】那里选择使用ssh发送文件或者命令了
ps:关于Remote Directory
此配置的基本目录。
此目录必须存在,不会创建。
发布者只能将文件放在这个目录下面。
注意,没有任何东西阻止执行程序创建、删除或移动文件,只要用户有权限。
ps:也尝试过用ssh远程连接windows服务器,但是查阅很多资料都没有成功:https://www.cnblogs.com/chenmingjun/p/8535067.html
先在要连接的远程服务器上安装并启动ssh的服务,如链接的操作,之后再用随笔里的方法去配置公钥和私钥,最后还是失败了,和链接最后一张图一样,一直提示密码错误
也试过直接将注册的公钥authorized_keys放到指定目录下,还是不能正常链接,遂放弃(后来求证了一些同事,都没这么用过,死心)
jenkins自动化部署项目5 --STMP服务发送邮件配置
【系统管理】-【系统设置】里
1.系统管理员邮件地址:和后面SMTP配置认证的邮箱要一致,即发件箱 --------切记
2.配置SMTP认证的前提是需要在sohu搜狐邮箱开通SMTP/POP3,方法这里就不说了,贴个链接参考下,很简单:https://www.yiyisoft.com/news/457.html
做完以上操作之后,选择测试配置,成功即可
jenkins自动化部署项目6 -- 新建job(将服务代码部署在windows上)
关于构建结束后jenkins会kill所有衍生子进程的官方解决方案:https://wiki.jenkins.io/display/JENKINS/Spawning+processes+from+build
jenkins(windows)----------->应用服务(windows):2个服务部署在一台windows机器上
公司项目是前后端分离的。web前端+java后台服务,因此项目分为两类
1.前端使用tomacat启动服务:只有一些静态文件,因此新建项目的时候直接选择【构建一个自由风格的软件项目】
<1>项目名称根据需要填写,git源码配置如图,我点击add-jenkins后选择的是用户名和密码的方式去下载代码(kind处选择username and password,然后填上用户名和密码即可)
<2>构建:先关掉tomcat,再重启tomcat
ps:此处遇到的坑是,构建完成之后tomcat会随着构建结束被jenkins杀掉进程,为了解决这个问题,需要做下图的设置
另外,我在命令行里没有将jenkins下载的代码复制到tomcat的webapps目录下,是因为我在tomcat的配置文件里加了一行,server.xml
<Context path="" docBase="E:\Jenkins\workspace\sr_center\webapp" />
这里的命令可以根据需要做调整,只要注意以上标蓝的一点即可(sr_utils.bat脚本内容见下面java项目构建步骤)
2.后端通过java -jar命令行的方式启动服务
<1>新建的时候选择构建一个MAVEN项目(需要强调的是项目的pom.xml文件要能正常使用,我们的项目一开始是用eclipse启动的,后面更改启动服务方式时遇到一些问题)
源码管理如上面前端,构建触发器看业务需要自由选择,
<2>build:使用默认的pom.xml即可,不需要更改
(如果项目使用的一些jar包在maven中央仓库找不到。或者测试环境无法访问外网,无法在线下载一些jar包,有2点要注意:1.Goals and options处可以配置本地仓库路径;2.要提前手工下载安装一些jar包到本地maven仓库。具体操作方法见:https://www.cnblogs.com/yy-cola/p/9664598.html)
下图步骤是:杀掉要正在运行的此项目进程 ------ 删掉项目jar包(我特意新建了一个目录存放jar包,在此启动服务) ------ 将新下载打包的jar包复制到存放项目的目录 ------以后台启动的方式启动服务
杀进程的sr_utils.bat脚本是我自己写了之后放在jenkins目录下使用的:通过项目端口找到项目进程,找到则杀掉进程,找不到则忽略。脚本内容如下:
::demo @echo off ::延迟环境变量扩展 setlocal enabledelayedexpansion for /f "delims= tokens=1" %%i in ('netstat -aon ^| findstr %1') do ( set a=%%i) ::判断服务是否已经启动,如果启动则杀掉进程 if defined a (taskkill /F /pid "!a:~71,5!") else (echo Service does not exist) ::等待你按任意键结束 pause>nul ::执行时后面带上端口即可
ps:这里需要注意的是,如果将所有命令都写在一个步骤里,执行完一个bat脚本之后,后面的命令将不会被执行,因此这个地方我分了两步。
问题:
最近在使用jenkins部署服务过程中遇到一个问题,那就是通过start javaw -jar 以后台启动的方式启动服务,如果服务没有成功启动,这个时候jenkins还是显示构建成功,因为对于jenkins来说这个命令本身是成功执行完成了的,jenkins不会继续判断服务是否真的启动成功构建就结束了。
解决方案:
jenkins认为非零返回就是job失败
在启动服务之后新增一步检查服务是否真的成功启动的步骤,即通过端口查找该服务的进程,如果找到了在返回给jenkins 0表示服务正常启动,如果没找到该服务的进程,则返回给jenkins 1.具体的bat脚本如下:
@echo off setlocal enabledelayedexpansion for /f "delims= tokens=1" %%i in ('netstat -aon ^| findstr %1') do ( set a=%%i goto js ) :js ::判断服务是否已经启动,如果启动则返回给jenkins信号0 if defined a (exit 0) else (exit 1) pause>nul ::在执行bat脚本的时候在命令后加上参数也就是端口即可
另外在启动服务的命令执行之后,需要等待几秒再去判断进程是否存在。windows和linux不一样没有类似sleep这样的命令,查阅资料之后我用这一句实现
等待10秒 ping /n 10 127.1 >nul
部署java后端项目的时候可能会遇到一个问题,项目引用的jar包在maven中央仓库找不到,解决方法可以参考我另一篇随笔:
https://www.cnblogs.com/yy-cola/p/9664598.html
jenkins自动化部署项目7 -- 新建job(服务代码部署在linux上)
jenkins(windows) ----> 应用服务器(linux):
1。后台java服务:
与部署在windows上不同的是,这里我选择了在【构建后操作】中使用ssh向远程linux服务器传送jar包和需要执行的命令
sh /root/home/scripts/demo.sh 8007 cp -r /home/soft/project/sr_f5_manage/sr_f5_manage-0.0.1-SNAPSHOT.jar /home/soft/jarpackage #每次构建都会有日志,为了不越来越多,每次运行项目之前会清空下这个文件nohup.out cp /dev/null nohup.out cd /home/soft/jarpackage nohup java -jar sr_f5_manage-0.0.1-SNAPSHOT.jar & sleep 10 #此处之所以加上sleep 10 是因为一开始虽然构建成功,但是netstat -nlp | grep 8007查看进程发现找不到进程,因为项目启动需要时间,尝试着sleep发现就好了
BUILD_ID=dontKillMe:网上很多人说构建结束,服务进程会被kill,需要加上这个才行。我试了下,不要这个时进程也不会被kill
#这个就是上面的demo.sh脚本,根据项目端口查找进程,然后kill掉 port=$1 if [ "${port}" == "" ];then exit 1 fi #根据端口号查询对应的pid,端口号在执行脚本时做为参数 pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F "/" '{ print $1 }'); #杀掉对应的进程,如果pid不存在,则不执行 if [ -n "$pid" ]; then kill -9 $pid; fi
ps:这样配置之后,构建还是会有问题,如图。jenkins不会正常结束构建,而是直到超时:
这时就需要在【高级】选项那里勾选上Exec in pty,这样就可以正常了。参考地址: https://blog.csdn.net/u013066244/article/details/52788407
2.前端:我们前端使用tomcat,和后端没什么不一样,只有配置的脚本不一样。如图,因为比较简单,就不单独贴出来了
图中第一行命令是关掉tomcat服务,如果tomcat本身没有运行则构建会报错,因此需要先判断下tomocat服务是否正在运行,我直接用上面的demo.sh脚本去代替这一步
sh /root/home/scripts/demo.sh 8080
Source files的匹配规则可以了解下:
* matches zero or more characters, ? matches one character.
jenkins自动化部署项目8 --定时构建
举几个例子:
每隔5分钟构建一次
H/5 * * * *
每两小时构建一次
H H/2 * * *
每天中午12点定时构建一次
H 12 * * *
每天下午18点定时构建一次
H 18 * * *
在每个小时的前半个小时内的每10分钟
H(0-29)/10 * * * *
每两小时45分钟,从上午9:45开始,每天下午3:45结束
45 9-16/2 * * 1-5
每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午4:38)
H H(9-16)/2 * * 1-5
我设置的是每天凌晨3点定时构建