前言
随着项目增大,开发人员不可避免的面临一些解耦工作。建立cocoapods私有库是一个不错的选择,把一些业务不相关的工具类和UI轮子提取出来统一管理。
如何建立私有库目前网上资料比较多,这里不做赘述。
为了便于开发,目前项目中允许开发成员直接在主工程项目中直接修改私有库代码,这就导致了主工程中的私有库代码与gitlab上私有库代码不一致的情况,每次执行pod update会拉取gitlab上旧的私有库代码覆盖主工程中的代码。因此需要开发人员定期手动更新远端代码。这就有点【强人锁男】了毕竟程序猿还是比较反感重复工作的,那交给脚本去做粑。
利用jenkins和gitlab的webhook功能,可以有效的实现在远端机器上自动更新私有库的目的。减少了人力消耗和代码覆盖风险。
自动化更新简介
利用gitlab的webhook功能,在gitlab发生merge事件时【可设置push,comment等事件】,触发jenkins的触发器。在远端机器上执行自动更新代码的脚本。
Jenkins配置
首先在jenkins的【系统管理-管理插件】中,下载【Gitlab Hook Plugin】和【Multiple SCMs Plugin】.
在项目的配置中,使用【源码管理-Multiple SCMs】选项,如下图。在【Repository URL】中填写git代码仓库地址,在【Check out to a sub-directory】中填写文件夹名,比如【ProjectFolder,PodsFolder】。这样可以实现在同一个workspace中管理两个仓库的代码。即主工程代码放在ProjectFolder文件夹下,pod工程放在PodsFolder文件夹下。
配置【构建触发器】,复制GitLab CI Service URL.勾选【Push Events】和【Accepted Merge Request Events】,即在Gitlab发生推送事件和接受合并请求事件的时候触发脚本。
构建脚本,脚本的主要功能是把主工程的develop代码中的Pod/Classes文件夹下的代码全部粘贴到pod工程目录下并自动提交到autoSynchronBranch分支上。
#!/bin/bash
#获取workspace目录
rootPath=${WORKSPACE}
projectPath='/ProjectFolder'
projectPodPath='/Pods/PROJECTNAME/Pod/Classes/*'
podPath='/PodsFolder'
podPodPath='/Pod/Classes'
#同步develop和release-test两个分支的代码
branchArray=('develop' 'release-test')
for branchName in ${branchArray[@]};do
#拉取主工程代码
cd $rootPath$projectPath
git fetch
git checkout .
git checkout $branchName
git checkout .
git pull
#拉取pod
cd $rootPath$podPath
git fetch
git checkout .
#测试阶段,把pod代码自动更新至autoSynchronBranch分支上。
git checkout autoSynchronBranch
git checkout .
git pull
#代码同步
cp -r $rootPath$projectPath$projectPodPath $rootPath$podPath$podPodPath
#推送代码,push日志【2018.05.15-同步develop私有库代码】
dateString=$(date +%Y.%m.%d)"-同步"$branchName"私有库代码"
git add .
git commit -m $dateString
git push
done
gitlab配置
直接在gitlab界面的webhook界面粘贴jenkins配置界面的GitLab CI Service URL,并选择【推送事件】和【合并请求事件】,点击测试按钮,返回httpcode:200即可。
FAQ
1、gitlab webhook配置好后,点击【测试】,返回httpcode:503 anonymous 问题。
在jenkins【系统管理-系统设置-gitlab】中,uncheck 【Enable authentication for ‘project’】选项.
2、jenkins构建时,git fetch —tags失败,超时。
在项目配置中,设置branch specifier 为 remotes/origin/develop。
网友评论