设为首页 收藏本站
查看: 2277|回复: 1

[经验分享] jenkins+gitlab钩子+shell脚本基于git的tag实现App增量更新

[复制链接]
发表于 2018-1-11 22:08:35 | 显示全部楼层 |阅读模式
  转自:http://blog.csdn.net/kingboyworld/article/details/54175330
  环境安装
  jdk1.8
  1.安装jenkins
  首先到https://jenkins.io/index.html下载jenkins的war包。上传到自己的服务器,放在自己对应的目录下,执行nohup Java -jar jenkins.war --httpPort=8081,(nohup后台运行),打开IP:8081即可访问到jenkins的页面。第一次访问需要设置密码,务必要记住。之后跳转到安装插件界面,建议选择安装推荐的插件,其他需要的插件在之后进行手动安装。插件安装根据网络可能耗费较长时间。静静的等待安装完成,之后输入用户名和密码进入到jenkins的主页面。
  然后安装我们接下来需要用到的插件,选择系统管理---管理插件---可选插件,将Gitlab Hook Plugin,Git plugin,Git client plugin,已经安装了则略过。
  2.安装gitlab
  

sudo yum install curl openssh-server openssh-clients postfix cronie  
sudo service postfix start
  
sudo chkconfig postfix on
  
sudo lokkit -s http -s ssh
  

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash  
sudo yum install gitlab-ce
  

  执行上述命令即可通过yum安装gitlab,摘自gitlab官网
  配置并启动GitLab
  打开/etc/gitlab/gitlab.rb,将external_url = 'http://Git.example.com'修改为自己的IP地址:http://xxx.xx.xxx.xx:8082,然后执行下面的命令,对GitLab进行编译并运行。
  

sudo gitlab-ctl reconfigure  

  gitlab就安装好了,默认的用户名是root(我的是root)
  3.配置webhook(钩子)
  在gitlab上新建一个项目,上传不同的内容,并打上对应的tag,我的tag明明规则是大版本v1,v2,小版本的话v1.1,v1.2 (ps:在脚本中会安装一定规则对tag进行处理,所以命名要符合一定的规范)。
  以最大权限的gitlab账户登录gitlab,选择创建的项目,点击右上角的设置,有个选项webhooks,点击进入。
  添加url,添加的是jenkins的访问地址例如http://0.0.0.0:8081/gitlab/build_now(我的jenkins在8081端口),接下来选择的是触发的机制,我选择的是Tag push events,在前面勾选就可以。之后Add  webhook即可。可以点击测试,看看是否正常。
  4.进入jenkins构建一个job
  选择新建,一、输入一个job的名字,我的叫updateVersion,接下来选择“构建一个自由风格的软件项目”,点击ok对这个job进行具体的配置。
  源码管理:选择git,Repository URL输入你的项目的地址,Credentials就是你gitlab的认证用户名和密码,点击Add添加后然后选择就可以了。
  Branch Specifier (blank for 'any‘)这个地方填写你要针对哪个分支的变化触发这个job。默认master,自己修改成相对应的分支即可。
  在构建步骤中选择execute shell执行shell脚本。
  我的shell贴出来(刚学一天shell写的语法不是很好,很多不会,有点乱,高手勿喷)

[java] view plain copy

  • #!/bin/bash
  • #author kingboy
  • #description: create tag list for update
  • #获取当前项目的配置名称
  • gitdir=$(less json.txt|awk -F"[:]" '/dir/{print$2}')
  • #要输出的目录路径
  • dir="/Users/kingboy/Desktop/$gitdir"
  • #当前操作目录
  • pwdPath=$(pwd)
  • #判断是否有该目录没有则创建
  • if test -e ${dir}
  • then
  •     echo -e "${dir} exists!"
  • else
  •     mkdir $dir
  •     echo -e "${dir} create success!"
  • fi
  • #判断两个tag间的文件变动列表并打包
  • zipDiffFiles(){
  •     tag1=$1
  •     tag2=$2
  •     git diff ${tag1} ${tag2} --name-only > ${dir}/${tag1}-${tag2}.log
  •     #git diff v8 v1 --name-only
  •     #shell将变化的文件copy到项目目录下的对应文件夹
  •     #先创建对应的文件夹
  •     if test -e ${dir}/${tag1}-${tag2}.tar
  •     then
  •         echo -e "${dir}/${tag1}-${tag2}.tar exists!"
  •     else
  •         mkdir ${dir}/${tag1}-${tag2}
  •         echo -e "${dir}/${tag1}-${tag2} create success!"
  •         #读取变化的文件列表并复制到对应的目录下面,
  •         echo -e "----------------copy file---------------------"
  •         cat ${dir}/${tag1}-${tag2}.log | while read LINE
  •         do
  •             if test -e ${LINE}
  •             then
  •                 #同步文件到nginx目录下,同时复制目录结构
  •                 #cp --parents -rf ${LINE} ${dir}/${tag1}-${tag2}/
  •                 #
  •                 rsync -arR  ${LINE} ${dir}/${tag1}-${tag2}/
  •             fi
  •         done
  •         #打包对应的目录
  •         cd ${dir}
  •         zip  -rq ${tag1}-${tag2}.zip ${tag1}-${tag2}
  •         echo "zip ${tag1}-${tag2}.tar success!"
  •         cd $pwdPath
  •         #删除文件夹
  •         rm -rf ${dir}/${tag1}-${tag2}
  •         #是否删除log日志文件列表
  •         rm -rf ${dir}/*-*.log
  •     fi
  • }
  • #生成全量更新包
  • zip -r ${dir}/last.zip *
  • #生成不同版本间的更新包
  • #-n按照数字排序   -r 翻转排序  -t 分隔符  -k以第几列排序
  • echo -e "----------------tag list---------------------"
  • git tag | sort -n -r -t 'v' -k 2 |tee ${dir}/tagList.log #生成所有tag
  • #删除版本信息文件
  • rm -rf ${dir}/update.json
  • #定义生成的版本个数
  • i=1
  • versionNumber=10
  • cat ${dir}/tagList.log | while read one
  • do
  •     cat ${dir}/tagList.log | while read two
  •     do
  •         #去掉自身和自身进行比较
  •         if test ${one} = ${two}
  •         then
  •             continue
  •         fi
  •         #-------------------------------
  •         #去掉重复的包   当新版不够10个的时候,会生成 v7-v6  v6-v7   ,加上之后就不会了
  •         #外层只要一个循环,所以不需要了
  •         #if test ${two:1:${#two}} -gt ${one:1:${#one}}
  •         #then
  •         #   continue
  •         #fi
  •         #---------------------------------------
  •         #生成版本包
  •         if test $ -le $[versionNumber]
  •         then
  •             zipDiffFiles "$one" "$two"
  •             #删除版本信息文件  已经放在上面进行处理了
  •             #重建版本信息文件
  •             echo "{\"$two\":\"${one}-${two}.zip\"}," >> $dir/update.json
  •         fi
  •         i=$(($i+1))
  •     done
  •     break
  • done
  • exit 0
  

  点击保存,之后在gitlab上提交几个修改,打个tag上传到gitlab上,就会自动触发构建任务。
  说明一下:
  jenkins还有很多用途,可以自动发布项目,自动打包,自动测试等
  json.txt是项目的规定名称信息,放在项目文件中的json.txt中,内容如
  {
  dir:newProject
  }
  目的是为不同项目生成的更新包,放在不同的nginx目录下
  update.json是当前所有更新包的信息。app端请求该文件,自行判断是否需要更新,请求对应包的地址即可下载更新包,例如当前为v10,最新为v11,
  则请求http://ip/newProject/v11-v10.zip即可。
  参考来源:http://www.codesec.NET/view/428631.html,谢谢前辈的贡献。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-434083-1-1.html 上篇帖子: GitLab 项目创建后地址由Localhost改为实际IP的方法 下篇帖子: gitlab merge过程
累计签到:181 天
连续签到:1 天
发表于 2018-5-16 15:43:27 | 显示全部楼层
顶顶顶  好文章 真需要

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表