Jenkins持续构建打包后端服务流程详解
背景运用场景及思路
1、为响应后端开发人员需求,提升项目开发过程效率,选择Jenkins持续构建,进行导包启动一键持续集成
思路:
使用jenkins自带,立即构建->SVN拉取代码,通过Jenkins安装的mvn编译进行打包,并自动化启动后端服务
致谢:
工作岗位的上一任,留给我很多资料进行查阅,感蟹!!
Jenkins搭建部署
1、下载tomcat软件,gz压缩包,存放到需要配置的Linux服务器上
2、 官网下载jenkins,将jenkins压缩包,解压后,放置到tomcat-->webapp目录下
3、 进入tomcat-->bin目录-->./startup.sh启动命令
配置时需注意事项:
1、需要修改tomcat-->config文件夹-->server.xml
(启动tomcat时,需要netstat查看tomcat启动的默认8080端口是否已经被占用,如果已经被占用,vim编辑server.xml文件,找到8080端口,进行修改,如下所示:)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
修改后:
<Connector port="3030" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
2、如启动tomcat后,进入127.0.0.1:3030检查,Tomcat是否正常启动起来 ,如果无法正常查看,则需要执行以下命令,关闭防火墙服务
service iptables stop
配置系统环境
1、Linux需安装jdk_1.8,这里可以按照自己的喜好进行下载
2、下载解压安装jdk成功后,需要进入etc/profile环境配置如下变量
(我这里下载解压后的jdk,是放置到了/opt目录下)
JAVA_HOME=/opt/jdk1.8.0_141
JAVA_BIN=$JAVA_HOME/bin
JRE_HOME=$JAVA_HOME/jre
JRE_BIN=$JAVA_HOME/bin
PATH=$JAVA_BIN:$JRE_BIN:$PATH
export JAVA_HOME JRE_HOME PATH
安装Jenkins插件
1、 Tomcat起来后进入访问页面:服务器IP地址:端口号/jenkins
2、访问Jenkins成功,进行默认选择进行下一步,下一步安装
3、安装插件时,可以根据自己的喜好进行安装的啦,这里就不概述啦
配置JDK,MAVEN安装
一、配置后台服务Maven打包时需要的jdk/maven
二、配置前端服务npm打包时所需nodeJs
配置SSH连接服务器
创建Maven项目
SVN打包构建及SSH远程部署
启动脚本
source /etc/profile # 应ssh远程连接是no-login状态,则需要每次执行source /etc/profile配置
pid=`ps -ef |grep "other"|grep -v 'grep'|awk '{print $2}'`
if [ $pid ]; then #如果存在已启动的项目进程,则kill掉,没有则不进行处理
kill -9 $aa
fi
cd /data/
if [ $? -eq 0 ]; then
rm -rf /data/xqb-other-1.0.0.jar
else
mkdir -p /data/
fi
setsid java -jar xxxx.jar > nohup.out
遇到的问题
1、安装jenkins时,出现大部分插件,自动下载失败,重新retry后,仍是如此,待解决
2、昨天一天晚上,自信满满的认为自己可以很快的能解决好Jenkins持续构建打包后端服务,结果折腾了差不多半天时间,端午放假的最后一天班,还一个人加班到了最晚,这就是技术人,没有技术的加班血泪史鸭
其中遇到的问题有自身的问题、以及技术方面欠缺的问题,总结如下:
(1)、细节没有注意到,编写构建脚本时,每个Maven项目,写的目录因copy现有的,导致存在很多小字眼写错了,这里需要面壁思过了,细节决定成败,细节决定成败呀,都是血泪史~~
(2)、Mvn编译打包后,在PostStep下,Jenkins没有将打包好后的xxx.jar包,正常远程传输到制定的路径下
(3)、打包完成后,脚本启动命令,没有正常被执行,导致传输后的jar包,无法正常启动起来
1.打包后无法传输到指定的目标服务器路径
遇到这个问题时,思考的方向是SSH配置用户名和密码是否正确,检查没有问题后,才第一时间是,查询了jenkins 项目中的poststep中各个输入框的用法,毕竟还是知识理论更重要
配置POST STEP
编译打包文成后,就需要配置post step,该模块是在你Jenkins编译打包完成后,执行的动作
需要介绍的点是:
SSH Server:用户需要ssh传输jar包的服务器
Source files:传输的源文件,这里按照Jenkins的默认路径是当前的job项目的工作路径,比如:
jenkins中创建的每个job工程项目,对应会在Jenkins安装目录下的workspace空间下自动创建
如:
jenkins在linux下默认的安装路径是以下路径
/root/.jenkins/
我创建的Job工程名字为jenkins,则构建成功后,会在以下的路径,生成jenkins文件夹,如下所示
/root/.jenkins/workspace/jenkins
source files,是我要打包完成的jar进行上传到其他服务器,所以我这里写的是target/*.jar
Remove prefix:这里表示上传后,不需要创建的target目录,所以这里需要填写target,表示上传完成后,不会在对应指定的目录下再生成一个/target目录,而是直接把*.jar包直接上传到指定的目录里
Remote diretory: 比如我要把*.jar包,放置到tomcat的webapp里,则我这里就填写 webapp,上传包后需要存放的地方
Exec command: 这里填写需要启动jar包的命令
例子:
setsid java -jar xxx.jar > nohup.out &
这里参考原文地址(推荐):[原文]https://www.cnblogs.com/abcwt112/p/6296399.html
2.setsid java -jar xxx.jar脚本命令无法正常启动
使用上面的setid启动jar包命令后,看到进程总是启动到一半后,
ps -fe |grep java
看到进程正常启动后一半,就自动停掉了,但是将上面的命令直接放在服务器上root用户下,直接执行时确能够执行成功,后来经过研发童鞋的指点,说在jenkins这里的命令,命令肯定是没有被启动起来,或者jenkins没有执行这行命令权限
经过思考推敲后,进行百度搜索无意间看到有位博主也遇到类似问题,才发现时ssh远程操作执行命令时,时non-login状态,ssh远程执行该命令时,是需要不会执行/etc/profile里面定义的变量的,而刚好jdk的配置,在/etc/profile文件里,所以ssh Server模块的脚本里,需要加上如下source /etc/profile:
source /etc/profile
setsid java -jar xxx.jar > nohup.out&
这里参考原文地址(推荐):[原文]http://blog.sina.cn/dpool/blog/s/blog_64693fd40101eyyh.html
最后轻松解决了上面害我加班的问题,真的是在你最无奈的时候,那么你就该要好好的静下心来,学习了。
效果
1、写代码(更新代码),push到SVN服务器
2、立即构建Job--> checkout SVN代码-->编译打包-->上传服务器-->自动启动执行jar服务
3、登陆使用项目,一体化,是不是爽歪歪呢,跟自己做好一道美味的菜后,最后有人帮把美酒倒了,饭给你装了,筷子给你拿了,你直接开吃的效果差不多。可惜我不是开发,哈哈哈哈
Jenkins持续构建打包后端服务流程详解的更多相关文章
- unity3d-配置Android环境,打包发布Apk流程详解
31:unity3d-配置Android环境,打包发布Apk流程详解 作者 阿西纳尼 关注 2016.08.28 22:52 字数 498 阅读 1806评论 0喜欢 5 Unity配置Android ...
- 苹果企业账号打包发布APP流程详解
原文链接:http://www.cnblogs.com/mddblog/p/4718228.html 一.通过企业账号申请证书 1 Certificate Signing Request (CSR)文 ...
- AppStore企业账号打包发布APP流程详解
一.通过企业账号申请证书 1 Certificate Signing Request (CSR)文件 在Mac系统中进入“钥匙串访问”,选择“钥匙串访问”-“证书助理”-“从证书颁发机构请求证书…”, ...
- 个人环境搭建——搭建jenkins持续构建集成环境
---恢复内容开始--- 搭建jenkins持续构建集成环境 要搭建jenkins持续构建集成环境,首先要安装tomcat和JDK: 第一部分,基本说明: 敏捷(Agile) 在软件工程领域 ...
- 2-4、nginx特性及基础概念-nginx web服务配置详解
Nginx Nginx:engine X 调用了libevent:高性能的网络库 epoll():基于事件驱动event的网络库文件 Nginx的特性: 模块化设计.较好扩展性(不支持模块动态装卸载, ...
- C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- Linux启动流程详解【转载】
在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...
- Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)
一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...
- FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
随机推荐
- With Storm Spouts, when is declareOutputFields( ) called?
The method IComponent.declareOutputFields(...) is called on the client machine when the client code ...
- hdu 1011 树型dp
#include <cstdio> #include <iostream> #include <cstring> #include <vector> u ...
- RecyclerView的使用(1)之HelloWorld
原创文章.转载请注明 http://blog.csdn.net/leejizhou/article/details/50670657 RecyclerView是伴随Android 5.0公布的新控件, ...
- 150723培训心得(queue)
queue(STL中函数,就是指队列) #include <iostream> #include <queue> using namespace std; //这 ...
- Jquery-Uncaught ReferenceError: $ is not defined报错
在我的jsp页面上有这些js代码: //载入数据 $(document).ready(function() { var param={}; param.page=3; param.size=10; $ ...
- angular2 使用swiper
欢迎加入前端交流群交流知识&&获取视频资料:749539640 第一步: npm install swiper --save 第二步:下载swiper ts支持(http://micr ...
- css3 animate基本属性
Css3animate属性 属性 描述 Css Animation 所有动画属性的简写属性,除了animation-play-state属性 Animation:name duration timin ...
- Django之缓存机制
1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次 ...
- ROS-TF-广播
前言:将海龟的坐标系变换广播到TF. URDF文件的描述是在相对坐标上进行的,运动起来就需要考虑机器人各个连杆的相对位置关系.TF的诞生就是为了自动管理这些相对关系下的坐标变换的,而我们需要做的就是给 ...
- BZOJ 2794 DP
思路: 考虑把询问离线 按照m排序 物品按照a排序 f[i]表示c[j]的和到i b的最大值 背包就好 O(nk)竟然能过-- //By SiriusRen #include <cstdio&g ...