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

版权声明:本文为博主原创文章,转载请注明来源。 https://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写的语法不是很好,很多不会,有点乱,高手勿喷)

#!/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 $[i] -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,谢谢前辈的贡献。

展开阅读全文

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