The One

云端漫步

gitlab webhooks+jenkins+shell自动发布

一、Tag push events

环境安装jdk1.81.
安装jenkins
首先到https://jenkins.io/index.html下载jenkins的war包。
上传到自己的服务器,放在自己对应的目录下,执行nohupJava -jar jenkins.war –httpPort=8081,(nohup后台运行),打开IP:8081即可访问到jenkins的页面。第一次访问需要设置密码,务必要记住。
之后跳转到安装插件界面,建议选择安装推荐的插件,其他需要的插件在之后进行手动安装。插件安装根据网络可能耗费较长时间。静静的等待安装完成,之后输入用户名和密码进入到jenkins的主页面。
然后安装我们接下来需要用到的插件,选择系统管理—管理插件—可选插件,将Gitlab Hook Plugin,Git plugin,Git client plugin,已经安装了则略过。

2.安装gitlabsudo

yum install curl openssh-server openssh-clients postfix croniesudo service postfix startsudo chkconfig postfix onsudo lokkit -s http -s sshcurl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bashsudo 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 reconfiguregitlab就安装好了,默认的用户名是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脚本。

    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即可。

二、push events方式

“配置钩子”之前都一致,
区别在于之后:
gitlab方面:
这里写图片描述
在gitlab对应的project里选在Push events,在URL里填写jenkins对应jab的url,并在前面附上“用户名:密码@”,后面加上/job/$projectname/build
对应的jenkins里也有相应工程任务
jenkins方面:
这里写图片描述
在配置里配置上Push Events然后回到gitlab里点击“TestHooks”测试效果。

阅读更多
个人分类: DevOps运维开发
上一篇Centos7中sshd服务介绍及优化
下一篇Django2.0安装
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭