Jenkins持续集成使用集锦

Maven+Git+Shell持续集成教程

http://blog.csdn.net/xlgen157387/article/details/50353317

更改启动端口

java -jar jenkins.war --httpPort=7000

Maven+Git+Shell+Tomcat+Java Application方式配置所需插件

Git Plugin 用于配置项目的"源码管理"一项
Maven Integration plugin 用于创建maven 部署项目

配置JDK:

从位置: Global Tool Configuration->JDK配置,取消自动安装JDK的选项

jdk 配置.png

配置MAVEN:

从位置: Global Tool Configuration->MAVEN配置,取消自动安装MAVEN的选项

maven 配置.png

构件错误:mvn: not found

在构建步骤添加了一个Execute shell: mvn clean install -Pdev
在构建时提示下面错误
/tmp/jenkins5303088740826333885.sh: 2: /tmp/jenkins5303088740826333885.sh: mvn: not found
Build step 'Execute shell' marked build as failure
Finished: FAILURE
已经尝试过ssh登录服务器,检查过maven变量没有问题,但还提示这个错误

解决方法:
使用maven构件项目来构件

Maven构件项目增加Post-Steps

用于maven构件成功后执行的脚本


Post Steps.png

完整示例:

export BUILD_ID=build_release

build_path=${WORKSPACE}/buildAll/release

rsync -uvr "${build_path}/providerXXX/." "jufuns@192.168.1.100:/opt/providerXXX"
echo "provider synchronize success"

curl 'https://oapi.dingtalk.com/robot/send?access_token=6af3157c0ac425e744b2f7252883b2693f362463283bd1c437a7179c170d759e' \
   -H 'Content-Type: application/json' \
   -d '
  {"msgtype": "text", 
    "text": {
        "content": "### 开发环境更新完毕 ###"
     },
     "at":{
     "atMobiles": ["158000111222"], 
     "isAtAll": false
     }
  }'

startup_all.sh 脚本主要用于重启服务,重启tomcat:

#! /bin/sh

start(){

  echo "run all-provider..."
  cd /opt/providers/all-provider/
  nohup java -jar all-provider-1.5.0-dev.jar &
  echo "run all-provider done"

  echo "run event-listener..."
  cd /opt/providers/event-listener/
  nohup java -jar event-listener-1.5.0-dev.jar &
  echo "run event-listener done"

  echo "run tomcat..." 
  sh /opt/tomcat-8080/bin/startup.sh
  echo "run tomcat done"
}

stop(){
  echo "try to stop"
  echo "kill tomcat"  
  ps -ef|grep tomcat|awk '{print $2}'|xargs kill
  echo "kill all providers"
  ps -ef|grep xxxx-provider|awk '{print $2}'|xargs kill
  echo "stop done"
}

restart(){
  echo "restart..."
  stop;
  echo "sleep 5 seconds to wait all service stop by soft"
  sleep 5
  start;
}


case "$1" in
 start)
    start
    ;;
 stop)
    stop
    ;;
 restart)
    restart
    ;;
 *)
   echo "Usage {start|stop|restart}"
sac

执行构件操作,发现启动脚本也echo 了一些东西出来,但ps -ef一下却没发现进程启动了,在网上找了一下资料,说是要有一个BUILD_ID的环境变量,所以在POST BUILD的Execute shell那里加上一句:

export BUILD_ID=XXXX
sh /opt/startup_all.sh restart

在重启后加入钉钉机器人通知功能:
1.在钉钉群里添加自定义机器人,复制机器人api URL
2.在重启脚本执行完后,通过curl 调用api

curl 'https://oapi.dingtalk.com/robot/send?access_token=6af3157c0ac425e744b2f7252883b2693f362463283bd1c437a7179c170d759e' \
   -H 'Content-Type: application/json' \
   -d '
  {"msgtype": "text", 
    "text": {
        "content": "### 开发环境更新完毕 ###"
     },
     "at":{
     "atMobiles": ["158000111222"], 
     "isAtAll": false
     }
  }'

定时执行 - Poll SCM

Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作。如下图配置:
/5 * * * (每5分钟检查一次源码变化)

Build periodically:周期进行项目构建(它不关心源码是否发生变化),如下图配置:
H 2 * * * (每天2:00 必须build一次源码)

在 Schedule 中填写 0 * * * *。
<pre>
第一个参数代表的是分钟 minute,取值 0~59;

第二个参数代表的是小时 hour,取值 0~23;

第三个参数代表的是天 day,取值 1~31;

第四个参数代表的是月 month,取值 1~12;

最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。
</pre>

所以 0 * * * * 表示的就是每个小时的第 0 分钟执行构建。

线上服务器处理篇

如果单纯用jenkins编译生成文件后,然后通过scp,或者ftp 等方式上传文件,
那每次都会上传很多文件,如果文件比较多,则影响服务器更新效率。

解决方法:
使用svn,来传输,因为svn 有识别有什么文件已修改,所以这种方式可以只上传发生变化的文件,而不用全部上传。
步骤:
1.在线上服务器搭建svn服务,并将发布的文件目录添加到svn
2.在jenkins 部署的服务器将线上服务器 发布文件的svn 目录 checkout下来
3.增加Jenkins Post-Step shell 脚本将maven生成的文件拷贝到svn目录。
4.通过svn add 命令和svn commit命令将新改动的文件提交svn
这里需要注意的是,maven生成的文件里包含很多多余文件,这需要手动切换到svn目录,并将这些多余文件忽略掉,这样不至于执行svn add . 的时候会吧文件都纳入svn中。
5.通过ssh命令发送一条重启服务的命令,例如:

ssh xxx@xxx.xx.xx.xx /opt/startup.sh
命令在文章最后参考

在使用这个方式来重启之前,需要先准备好ssh 自动认证 的条件。
(可以查看我另外一篇文章做参考: http://www.jianshu.com/p/be12171a3b14 )

当然,线上服务器应该人工来干预,例如数据库表的更新,程序的配置等,为了确保更新没有问题,所以一般来说,第5点只是一个可选的操作(能自动把更新的文件传到服务器上已经很不错了)

线上环境更新脚本示例:

#! /bin/sh

start(){

  echo "run all-provider..."
  cd /opt/jufuns/providers/all-provider/
  nohup java -jar all-provider-1.5.0-release.jar &
  echo "run all-provider done"

  echo "run event-listener..."
  #cd /opt/jufuns/providers/event-listener/
  #nohup java -jar listener-1.5.0-release.jar &
  echo "run event-listener done"

  echo "run system-task..."
  cd /opt/jufuns/providers/system-task/
  ##nohup java -jar systemtask-1.5.0-release.jar &
  echo "run event-listener done"

  echo "run tomcat..." 
  cd /opt/jufuns/tomcat-8090/bin
  sh ./startup.sh
  echo "run tomcat done"
}

stop(){
  echo "try to stop"
  echo "kill tomcat"  
  ps -ef|grep tomcat-8090|awk '{print $2}'|xargs kill -9
  echo "kill all providers"
  ps -ef|grep -e .*release|awk '{print $2}'|xargs kill
  echo "stop done"
}

restart(){
  echo "restart..."
  stop;
  echo "sleep 10  seconds to wait all service stop by soft"
  sleep 10
  start;
}


#check if need update files
if [ "$2" = "-update" ] ; then
  echo "update all files..."
  cd /opt/jufuns/providers
  # 这里要使用 --force 参数强制更新,避免遇到错误终止更新
  svn up . --force
  
fi

case "$1" in
 start)
    start
    ps -ef|grep cn
    ps -ef|grep tomcat-8090
    ;;
 stop)
    stop
    ps -ef|grep cn
    ps -ef|grep tomcat-8090
    ;;
 restart)
    restart
    ps -ef|grep cn
    ps -ef|grep tomcat-8090
    ;;
 *)
   echo "Usage {start|stop|restart} [-update]"

esac

开发环境更新脚本示例:

从build目录复制文件到指定位置脚本 copy_from_build.sh

! /bin/sh


if [ -z $1 ] ; then
  echo "Provider-Directory-Name is requried!"
  echo "Usage: {Provider-Directory-Name} {Target-Provider-Name}"
  exit 0
fi


#if [ -z $2 ] ; then
#  echo "Target-Provider--Name is requried!"
#  echo "Usage: {Provider-Directory-Name} {Target-Provider-Name}"
#  exit 0
#fi


BUILD_ROOT=/home/vital/.jenkins/workspace/MeiHaoHui-Dev/buildAll/dev/$1
TARGET_ROOT=/opt/providers/$2


if [ ! -d $TARGET_ROOT ]; then
  mkdir -p $TARGET_ROOT
fi

echo "ready to update from path ${BUILD_ROOT} to path ${TARGET_ROOT}...";

jar_file=`find $BUILD_ROOT -maxdepth 1 -iname "*.jar"`

if [ "$3" = "-tomcat" ]; then
  echo  "Using tomcat copying mode"
  echo "execute shell: rm ${TARGET_ROOT}/WEB-INF"
  rm -rf ${TARGET_ROOT}/WEB-INF
  echo "rm done!"

  echo "execute shell: /bin/cp -rf ${BUILD_ROOT} ${TARGET_ROOT}"
  /bin/cp -rf "${BUILD_ROOT}/." "${TARGET_ROOT}"
  echo "cp done!"
else

  echo /bin/cp -rf "${jar_file}" "${TARGET_ROOT}/"
  /bin/cp -rf "${jar_file}" "${TARGET_ROOT}/"
  echo /bin/cp -rf "${BUILD_ROOT}/lib" "${TARGET_ROOT}/"
  /bin/cp -rf "${BUILD_ROOT}/lib" "${TARGET_ROOT}/"

fi

echo "done"

startup_all.sh脚本(包含了copy_from_build.sh 的调用)

#! /bin/sh

start(){

  echo "run all-provider..."
  cd /opt/providers/all-provider/
  find . -iname "*.jar" -maxdepth 1 -exec nohup java -jar {} \; &
  echo "run all-provider done"

  echo "run event-listener..."
  cd /opt/providers/event-listener/
  find . -iname "*.jar" -maxdepth 1 -exec nohup java -jar {} \; &
  echo "run event-listener done"

  echo "run system-task..."
  cd /opt/providers/system-task/
  find . -iname "*.jar" -maxdepth 1 -exec nohup java -jar {} \; &
  echo "run system-task done"


  echo "run tomcat..." 
  cd /opt/tomcat-8080/bin
  sh startup.sh
  echo "run tomcat done"
}

stop(){
  echo "try to stop"
  echo "kill tomcat"  
  ps -ef|grep tomcat-8080|awk '{print $2}'|xargs kill -9
  echo "kill all providers"
  ps -ef|grep -e cn-jufuns-residences.*dev|awk '{print $2}'|xargs kill
  echo "stop done"
}

restart(){
  echo "restart..."
  stop;
  echo "sleep 10 seconds to wait all service stop by soft"
  sleep 10;
  start;
}


#check if need update files
if [ "$2" = "-update" ] ; then
  echo "update all files..."
  update=/opt/copy_from_build.sh
  $update "cn-jufuns-residences-all-provider" "all-provider"
  $update "cn-jufuns-residences-event-listener" "event-listener"
  $update "cn-jufuns-residences-search-provider" "search-provider"
  $update "cn-jufuns-residences-systemtask" "system-task"
  $update "cn-jufuns-residences-origin-web/web" "web" -tomcat
  $update "cn-jufuns-residences-origin-admin/admin" "admin" -tomcat
fi



case "$1" in
 start)
    start
    ;;
 stop)
    stop
    ;;
 restart)
    restart
    ;;
 *)
   echo "Usage {start|stop|restart} [-update]"

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

推荐阅读更多精彩内容