053-Jenkins

Jenkins

Jenkins,之前叫做Hudson,是基于Java开发的一种持续集成工具,用于监控秩序重复的工作,包括:

1)、持续的软件版本发布/测试项目。

2)、监控外部调用执行的工作。

下面是官网的简单介绍图:


持续集成

持续集成是一个开发的实践,需要开发人员定期集成代码到共享存储库(比如说svn或git等)。这个概念是为了消除发现的问题,后来出现在构建生命周期的问题。持续集成要求开发人员有频繁的构建。最常见的做法是,每当一个代码提交时,构建应该被触发。


Jenkins安装

Jenkins可以使用最简单的war包安装,命令是java -jar,下载地址:https://jenkins.io/download,或者可以使用docker安装:

docker run -dit --name jenkins -p 8080:8080 jenkins

其它安装方式参见教程或者官网。




SpringBoot项目持续集成

首先创建一个简单的web项目,地址:https://gitee.com/blueses/spring-boot-web.git。


我们平时部署项目的顺序是,开发编译测试通过以后,打一个jar包,放到服务器上,然后直接java -jar启动项目即可,这也是SpringBoot项目的优点,部署简单。


Jenkins很好的继承了这个顺序,并且使过程更加连贯。假设Jenkins所有的配置都是ok的,首先在Jenkins上创建一个maven类型的项目:


接下来配置代码来源,一般代码来源于版本控制系统,此处配置git:

注意上面的分支别错了,如果是私服系统,可以还需要用户名密码,需要在Credentials中配置:

配置好代码以后,就可以处理代码了,一般是利用maven编译和打包:

-U,该参数能强制让Maven检查所有SNAPSHOT依赖更新,确保集成基于最新的状态。


主要的工作完成了,现在运行可以成功执行到打包状态,大部分使用者在这一步之前都不觉得困难,困难的是后面,动态的停止jar包,启动项目,接下来写一些shell脚本:

shell脚本的功能很简单,先判断服务器有没有相同的服务器在运行,有就先杀死,然后将新打包的传输到远程服务器,最后启动。

这里分两种情况,第一种是Jenkins与服务部署在一个服务器上,服务名为app-demo.jar:

# 解决Jenkins自动杀掉衍生进程

OLD_BUILD_ID=$BUILD_ID

BUILD_ID=DONTKILLME


# 智能停止旧服务

pid=`ps -ef|grep app-demo.jar|grep -v grep|awk '{print $2}'`

echo "old id:$pid"

if [ -n "$pid" ]

then

kill -9 $pid 

else 

echo "not running"

fi


# 清理旧的文件

rm -rf /packages/app_demo/*


# 上传并启动新的服务

cp ~/.jenkins/workspace/app-demo/target/app-demo.jar /packages/app_demo/

nohup java -jar /packages/app_demo/app-demo.jar >> /packages/app_demo/nohup.out &


# 解决Jenkins自动杀掉衍生进程

BUILD_ID=$OLD_BUILD_ID



另一种情况是服务单独部署在一个服务器上,这个时候需要做一个ssh免密登录,然后使用远程执行命令的方式:

ssh  user@ip  "命令内容"


假如服务要部署的ip为192.168.1.111,具体Jenkins脚本如下:

#解决Jenkins自动杀掉衍生进程

OLD_BUILD_ID=$BUILD_ID

BUILD_ID=DONTKILLME


# 智能停止服务

pid=`ssh root@192.168.1.111 "ps -ef|grep app-demo.jar|grep -v grep"|awk '{print $2}'`

echo "old pid=$pid"

if [ -n "$pid" ]

then 

ssh root@192.168.1.111 "kill -9 $pid"

else

echo "not running"

fi


# 清理旧文件

ssh root@192.168.1.111 "rm -rf /packages/app_demo/*"


#上传并启动

scp ~/.jenkins/workspace/app-demo/target/app-demo.jar root@192.168.1.111:/packages/app_demo/

ssh root@192.168.1.111 "source /etc/profile;nohup java -jar /packages/app_demo/app-demo.jar >> /packages/app_demo/nohup.out &"


# 解决Jenkins自动杀掉衍生进程

BUILD_ID=$OLD_BUILD_ID



上面的shell脚本中,开头和结尾是必须的,因为Jenkins会杀掉衍生进程。清理旧文件部分和上传并启动服务的命令对开发人员并没有什么难度,但是智能停止服务命令部分人员可能不太明白,简单介绍一下。


给pid赋值,就能打印出出来,这个不用说:


下面介绍pid的赋值语句,比如一个服务jar包为 spring-boot-web-0.0.1-SNAPSHOT.jar,那么下面的命令大家可能有些熟悉:

ps -ef|grep spring-boot-web-0.0.1-SNAPSHOT.jar

结果为:

ps命令将某个进程显示出来,

grep命令是查找,

中间的|是管道命令 是指ps命令与grep同时执行,

PS是LINUX下最常用的也是非常强大的进程查看命令,

grep命令是查找,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

以下这条命令是检查java 进程是否存在:ps -ef |grep java

字段含义如下:

UID      :程序被该 UID 所拥有

PID      :就是这个程序的 ID 

PPID    :则是其上级父程序的ID

C          :CPU使用的资源百分比

STIME :系统启动时间

TTY     :登入者的终端机位置

TIME   :使用掉的CPU时间。

CMD   :所下达的是什么指令


所以ps -ef|grep spring-boot-web-0.0.1-SNAPSHOT.jar就是检查对应的服务,再看下一步,加上 grep  -v  grep  效果:

可以看到,出现的多条结果只剩下一条了,原来的命令为什么会有两条呢?因为一条结果属于当前命令本身,另一条才是要的Java结果,后面加上grep -v是反向过滤的意思,grep -v grep 就是把本条命令的结果去掉,如果要去掉java本身的结果,可以执行grep  -v  java:

看最后一部分  awk {print $2},先看一下执行结果:

awk是行处理命令,简单说,就是会把前面得到的结果一行一行进行处理,比如不进行反向过滤,那结果肯定有两条:

再看一下后面的处理,单引号中是大括号,大括号中可以看出是个print打印语句,$2表示第二列的值,这个和Java不同,不是从0开始的,如果写$0会打印整行:

因为项目是jar包启动的,最有效的停止方法就是kill命令,所以需要获取进程id,可以看到$2位置的值就是我们要的进程id,所以这条命令应该好理解了:

就是获取运行中对应java进程的id,并赋值给pid,注意pid=后面要加飘号``。在Java代码中用不到这个,但是shell中会用到,位置就在~键上。


前面的获取pid的脚本可以看明白了,结果就是有对应Java项目在运行,pid就有值,没有就是空的。最后再来看一下if语句,这个在shell中以if开头,fi结尾,判断条件放在中括号内,尤其要注意的一点,也是我犯了很多次错的一点,左右中括号的左右两端都要加空格,这个是必须的!!!



对开发人员来说,脚本有难点的大概介绍完了,总结一下流程,Jenkins持续集成就是从版本库拉代码到Jenkins所在的服务器,然后用maven编译打包,用脚本部署,这样能达到提交代码后构建,就能看到最新效果,有需要还可以查查如果用Jenkins定期构建。除了脚本,还可以使用pipeline流水线的方式(推荐Blue Ocean版本),还可以集成docker或者k8s进行容器化部署。上面的方案简单有效,适合程序员在测试环境使用,至于正式环境,要看自己公司的运维大神的身手了!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • “我也是有过一段幸福生活的,那生活里还有一个漂亮女人”。 “你们不要不相信,哥们我说的可都是真的,我以我的性命起誓...
    刺猬刺先生阅读 876评论 0 3
  • 今晚跟人聊天聊的太兴奋,以至于把所有人都聊睡着了,我也眼皮直打架的时候,想起,还没有开始今天的绘本分享。这样迷糊的...
    Ice的零度空间阅读 7,623评论 0 1
  • 我鳄二 文/时乙戌 1. 蛤蟆头领已经醉了。 他把脚下的鞋拿到耳边,不断地滑动鞋底,试图解锁。一旁的蝙蝠头领不断地...
    大故事家阅读 927评论 1 4
  • 联动性风险是投资风险的最重要组成部分。比如石油的价格会受到中东局势的影响,全球股市受到美联储加息的影响。 为联动性...
    杨刀刀daoker阅读 336评论 0 0
  • 每天努力工作、学习、赚钱,却总是被铺天盖地恐惧所包围:生病、失业、没人关心、年华老去…… 在恐惧的折磨下,惶惶不可...
    小英成长手札阅读 502评论 0 2