转自: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 PluginGit pluginGit 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写的语法不是很好,很多不会,有点乱,高手勿喷)

  1. #!/bin/bash
  2. #author kingboy
  3. #description: create tag list for update
  4. #获取当前项目的配置名称
  5. gitdir=$(less json.txt|awk -F"[:]" '/dir/{print$2}')
  6. #要输出的目录路径
  7. dir="/Users/kingboy/Desktop/$gitdir"
  8. #当前操作目录
  9. pwdPath=$(pwd)
  10. #判断是否有该目录没有则创建
  11. if test -e ${dir}
  12. then
  13. echo -e "${dir} exists!"
  14. else
  15. mkdir $dir
  16. echo -e "${dir} create success!"
  17. fi
  18. #判断两个tag间的文件变动列表并打包
  19. zipDiffFiles(){
  20. tag1=$1
  21. tag2=$2
  22. git diff ${tag1} ${tag2} --name-only > ${dir}/${tag1}-${tag2}.log
  23. #git diff v8 v1 --name-only
  24. #shell将变化的文件copy到项目目录下的对应文件夹
  25. #先创建对应的文件夹
  26. if test -e ${dir}/${tag1}-${tag2}.tar
  27. then
  28. echo -e "${dir}/${tag1}-${tag2}.tar exists!"
  29. else
  30. mkdir ${dir}/${tag1}-${tag2}
  31. echo -e "${dir}/${tag1}-${tag2} create success!"
  32. #读取变化的文件列表并复制到对应的目录下面,
  33. echo -e "----------------copy file---------------------"
  34. cat ${dir}/${tag1}-${tag2}.log | while read LINE
  35. do
  36. if test -e ${LINE}
  37. then
  38. #同步文件到nginx目录下,同时复制目录结构
  39. #cp --parents -rf ${LINE} ${dir}/${tag1}-${tag2}/
  40. #
  41. rsync -arR  ${LINE} ${dir}/${tag1}-${tag2}/
  42. fi
  43. done
  44. #打包对应的目录
  45. cd ${dir}
  46. zip  -rq ${tag1}-${tag2}.zip ${tag1}-${tag2}
  47. echo "zip ${tag1}-${tag2}.tar success!"
  48. cd $pwdPath
  49. #删除文件夹
  50. rm -rf ${dir}/${tag1}-${tag2}
  51. #是否删除log日志文件列表
  52. rm -rf ${dir}/*-*.log
  53. fi
  54. }
  55. #生成全量更新包
  56. zip -r ${dir}/last.zip *
  57. #生成不同版本间的更新包
  58. #-n按照数字排序   -r 翻转排序  -t 分隔符  -k以第几列排序
  59. echo -e "----------------tag list---------------------"
  60. git tag | sort -n -r -t 'v' -k 2 |tee ${dir}/tagList.log #生成所有tag
  61. #删除版本信息文件
  62. rm -rf ${dir}/update.json
  63. #定义生成的版本个数
  64. i=1
  65. versionNumber=10
  66. cat ${dir}/tagList.log | while read one
  67. do
  68. cat ${dir}/tagList.log | while read two
  69. do
  70. #去掉自身和自身进行比较
  71. if test ${one} = ${two}
  72. then
  73. continue
  74. fi
  75. #-------------------------------
  76. #去掉重复的包   当新版不够10个的时候,会生成 v7-v6  v6-v7   ,加上之后就不会了
  77. #外层只要一个循环,所以不需要了
  78. #if test ${two:1:${#two}} -gt ${one:1:${#one}}
  79. #then
  80. #   continue
  81. #fi
  82. #---------------------------------------
  83. #生成版本包
  84. if test $[i] -le $[versionNumber]
  85. then
  86. zipDiffFiles "$one" "$two"
  87. #删除版本信息文件  已经放在上面进行处理了
  88. #重建版本信息文件
  89. echo "{\"$two\":\"${one}-${two}.zip\"}," >> $dir/update.json
  90. fi
  91. i=$(($i+1))
  92. done
  93. break
  94. done
  95. 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,谢谢前辈的贡献。

jenkins+gitlab钩子+shell脚本基于git的tag实现App增量更新的更多相关文章

  1. shell脚本实现git和svn统计log代码行

    实现的功能 git 根据传入的三个参数:起始统计日期.结束统计日期.git仓库地址. 脚本统计的是git仓库内的所有分支的log信息. 脚本统计的是指定时间段内.每一个提交人指定的git地址的所有分支 ...

  2. 利用shell脚本将Oracle服务器中数据定时增量刷新到ftp服务器中

    现有需求:将oracle数据库中的数据准实时同步至某ftp服务器中,以便前端应用能定时从ftp服务器目录中取增量数据 方法:将加工脚本写为存储过程,然后利用shell脚本执行该存储过程并将增量数据导出 ...

  3. Jenkins+GitLab+Sonarqube+Shell持续集成CI/CD

    1.部署GitLab 2.部署Jenkins 3.Sonar代码审计 4.参数化构建 5.git参数化构建

  4. jenkins:执行远程shell脚本时,脚本没有生效

    问题: jenkins远程部署一台机器时,jenkins构建显示成功,但是查看服务日志却没有真正执行的sh run.sh脚本,导致服务并没有启动 解决: 只需要在命令最上方加上source /etc/ ...

  5. jenkins中使用shell脚本必须切换jenkins用户

    https://blog.csdn.net/cdnight/article/details/81078191 安装这篇解决的 正确使用脚本的方式: 1.脚本必须使用jenknins用户,且所有命令必须 ...

  6. Jenkins+SVN+Ant在Linux环境下自动完成版本的增量更新与编译

    第一步:查看安装的jdk版本,查看是否安装ant,查看是否安装Jenkins java -version ant -version rpm -qa|grep jenkins 第二步:安装ant 官网: ...

  7. 【git】之使用shell脚本提交代码

    为减少提交步骤,防止提交错误,使用Shell脚本进行git提交不失一件好事 #!/bin/sh # @author Hubal # @Email Hubal@123.com # @createBy - ...

  8. Jenkins+GitLab+SonnarQube搭建CI/CD全流程

    1. CI/CD 1.1 CI - 持续集成 持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干.持续集成的目的就是让产品可以快速迭 ...

  9. Jenkins-在Centos上配置自动化部署(Jenkins+Gitlab+Rancher)

    Jenkins-在Centos上配置自动化部署(Jenkins+Gitlab+Rancher) 环境:centos7 首先在服务器上安装好Jenkins和Gitlab和Rancher Gitlab安装 ...

随机推荐

  1. noip2010初赛提高组 试题详解

    转载自:https://blog.csdn.net/eirlys_north/article/details/52889970 一.单项选择题 1.与16进制数 A1.2等值的10进制数是 ( ) A ...

  2. WampServer -- “You don't have permission to access /phpmyadmin/ on this server.”

    当你安装完成wamp后,打开localhost或ip时发现已经可以运行了 但想使用phpmyadmin时,发现提示如下内容: You don't have permission to access / ...

  3. BZOJ 2976: [Poi2002]出圈游戏 HDU 5668 CRT

    2976: [Poi2002]出圈游戏 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2976 Description Input 中第一 ...

  4. Codeforces Round #304 (Div. 2) D. Soldier and Number Game 数学 质因数个数

    D. Soldier and Number Game Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/conte ...

  5. Swift 自定义打印方法

    Swift 自定义打印方法 代码如下 // MARK:- 自定义打印方法 func MLLog<T>(_ message : T, file : String = #file, funcN ...

  6. MySQL之char、varchar和text的设计

    最近有表结构设计中出现了varchar(10000)的设计引起了大家的讨论,我们下面就来分析分析. 首先我们先普及一下常识: 1.char(n)和varchar(n)中括号中n代表字符的个数,并不代表 ...

  7. BFC与hasLayout

    BFC与hasLayout都是CSS布局上的概念. 几个月前在微博上才了解什么是BFC,算是对布局有点初步的了解. hasLayout则是IE6.7产生许多bug的根源. 一.BFC Floats, ...

  8. [译]Java 程序员应该了解的 10 个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  9. Linux下使用ISC DHCP可以实现动态推送静态路由表

    ISC DHCP可以实现动态推送静态路由表,先做个记号. 参考: https://gauvain.pocentek.net/docs/dhcpd-push-routes/ http://www.isc ...

  10. .Net4.0并行库介绍——Task

    Task和ThreadPool的功能类似,可以用来创建一些轻量级的并行任务.对于将一个任务放进线程池     ThreadPool.QueueUserWorkItem(A); 这段代码用Task来实现 ...