zoukankan      html  css  js  c++  java
  • jenkins+gitlab钩子+shell脚本基于git的tag实现App增量更新

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

    [java] view plain copy
     
    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,谢谢前辈的贡献。

  • 相关阅读:
    SGU 176.Flow construction (有上下界的最大流)
    POJ 2391.Ombrophobic Bovines (最大流)
    poj 1087.A Plug for UNIX (最大流)
    poj 1273.PIG (最大流)
    POJ 2112.Optimal Milking (最大流)
    SGU 196.Matrix Multiplication
    SGU 195. New Year Bonus Grant
    关于multicycle path
    ppt做gif动图
    codeforces 598A Tricky Sum
  • 原文地址:https://www.cnblogs.com/flying607/p/7080614.html
Copyright © 2011-2022 走看看