最近公司要将Jenkins自动化构建工具搭建起来,网上百度了一下,这方面的介绍真是百家讲坛,非常的零散,而且都是针对自己当时的项目情况做的脚本,直接跑到自己的Jenkins里面,报错,报错,报错,一脸懵逼,确实也难为了能写这些的战友们,因为每个人的项目结构真的区别太大了,有的工程文件包含多个工程文件,有的用pods,有的不用pods等等,需求也不一样,脚本参数设置也各有不一,甚至有的只是需要jerkins帮忙启动一下脚本而已,下面来说说我对于Jenkins的搭建踩过的坑。
1.先讲怎么卸载Jenkins,原因就是针对大多数按照常规方式安装Jenkins的战友们会发现,Jenkins对于我们整个mac的文件操作是没有权限的,Permission denied!!!,这是个神坑。。。
解决办法就是,不要使用jenkins.pkg包直接安装jenkins,它会在./share目录下创建一个jenkins文件夹,对于本地admin管理下的所有文件操作都没有权限,改了各种权限配置,居然都是个坑,最终的结果是localhost:8080都跑不起来了,没办法,这里建议大家,如果是Jenkins.pkg包安装的就先卸载了吧。
卸载命令(建议按顺序执行):
$ /Library/Application Support/Jenkins/Uninstall.command
$ sudo rm -rf /var/root/.jenkins ~/.jenkins #删除一些遗忘的设置
$ sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
$ sudo rm /Library/LaunchDaemons/org.jenkins-ci.plist
$ sudo rm -rf /Applications/Jenkins “/Library/Application Support/Jenkins” /Library/Documentation/Jenkins
$ sudo rm -rf /Users/Shared/Jenkins # 删除Jenkins文件夹里面所有的目录
$ sudo dscl . -delete /Users/jenkins # 删除User和Group
$ sudo dscl . -delete /Groups/jenkins
$ sudo rm -f /etc/newsyslog.d/jenkins.conf
$ sudo rm -f /etc/newsyslog.d/jenkins.conf # 以下命令也被卸载脚本中较新版本的 jenkins 脚本
$ pkgutil –pkgs | grep ‘org\.jenkins-ci\.’ | xargs -n 1 sudo pkgutil –forget
2.开始安装Jenkins,在终端命令行之行安装程序,具体流程参照:详细安装Jenkins流程。
1.安装brew
$ /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
2.安装java环境
$ brew cask install java
3.安装jenkins
$ brew install jenkins
4.执行Jenkins(这里要在本地浏览器中打开,localhost:8080)
$ java -jar /usr/local/Cellar/jenkins/2.49/libexec/jenkins.war –httpPort=8080 //2.49是指Jenkins的版本号
5.链接launchd配置文件
$ ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents
6.启动jenkins
$ launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
7.停止Jenkins
$ launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
3.前面的流程走完,就默认大家已经安装好Jenkins了,接下来需要在Jenkins里面创建一个项目,这个步骤比较简单,就不作赘述,简单说明一下jenkins里面的一些有用的配置吧。
1.Jenkins可以做参数化配置,这个需要和脚本结合起来,在脚本中预留参数位置.(这里就使用Shell脚本作为说明)
2.源码管理,Jenkins为我们做好了Git/SVN的代码管理流程,其实也可以不使用Jenkins的代码管理,但是既然用到了Jenkins,还是用它的比较好,因为它的关于代码管理的选项做的非常好,比较每次update代码前,先做一次reverse操作,就很不错啊。既然用Jenkins的源码管理,那么我们的代码最好放在Jenkins的workflow里面。
3.启动执行Shell脚本,这是个人认为作用最大的点,帮我们执行脚本,并将脚本的执行过程和echo全部显示出来。
4.下面结合具体Shell脚本讲述jenkins打包。
checkout_name=”tdxUpdateVersion” # 这个是从SVN上checkout下代码后的文件目录(如果使用Jenkins自身的代码管理,这个参数不需要)
project_name=”tdxApp” # 工程名,这个必须和可执行文件同名
# 配置项目版本
targetProject_destination=”generic/platform=iOS” # 这个参数都是这样写的,不需要做修改
configuration=”Release” # 打包的模式
scheme=”$project_name” # 这个这样写吧
workspace_name=”${project_name}.xcodeproj” # 工程执行文件
# 目录配置(以这个为基本路径)
save_path=”/Users/chuancaiios/Desktop/CCZQ_IPA” # 这个是所有逻辑的基本路径,这个在Jenkins里面配置后,根据Jenkins的配置做修改
# 可执行工程目录(必须在这个目录下进行)
excutePath=”${save_path}/${checkout_name}/AppIOS/AppBeta”
# 编译打包成功后的文件
archive_path=”$save_path/${project_name}.ipa.xcarchive”
# ipa包路径(取出最终ipa包)
ipa_path=”$save_path/${project_name}.ipa”
# 所有执行命令的日志重定向写入log.txt中
log_path=”${save_path}/log.txt”
# 配置签名证书、描述文件
codeSignIdentity=”iPhone Distribution: ***** ****** Co., Ltd.”
provision_UUID=”71565455-****-492c-9635-********”
# 配置蒲公英(暂不配置)
#upload_path=”$save_path/${project_name}.ipa”
#pgy_userKey=”a512b58c56285d23456e011fgh706509″
#pgy_apiKey=”ab9c240d2efg9hi17j9642k3l5mnop5q”
# 删除旧源码目录
#echo “正在删除旧源码”
#rm -rf “$checkout_path” >> $log_path
# 新建源码目录
#echo “正在创建新的源码目录”
#cd “$save_path” >> $log_path
#pwd
#mkdir “$checkout_name” >> $log_path
# 从svn导出最新代码
#echo “正在从svn下载最新的源码”
#svn checkout “$svn_path” “$checkout_path” –username “$svn_name” –password “$svn_password” >> $log_path
# 删除旧文件
echo “正在删除旧文件”
rm -rf “$archive_path” >> $log_path
rm -rf “$ipa_path” >> $log_path
rm -rf “$log_path” >> $log_path
# 进入可执行文件目录下(./AppIOS/AppBeta)
cd “${excutePath}” >> $log_path
pwd
# 清理构建目录
echo “正在清理工程缓存文件…”
xcodebuild clean -project ${project_name}.xcodeproj -scheme ${scheme} -configuration ${configuration} >> $log_path
echo “正在打包…”
# 归档(其他参数不指定的话,这里使用.xcodeproj文件配置)
xcodebuild archive -project ${workspace_name} -scheme ${project_name} -destination ${targetProject_destination} -configuration ${configuration} -archivePath ${ipa_path} CODE_SIGN_IDENTITY=”*******” PROVISIONING_PROFILE=${provision_UUID}
# 导出IPA
echo “正在导出ipa包…”
xcodebuild -exportArchive -archivePath $archive_path -exportPath ${ipa_path} -exportOptionsPlist “${save_path}/EnterpriseExportOptionsPlist.plist”
# 上传IPA到蒲公英(暂不上传)
#echo “正在上传ipa到蒲公英”
# curl -F “file=@$upload_path” -F “uKey=$pgy_userKey” -F “_api_key=$pgy_apiKey” https://www.pgyer.com/apiv1/app/upload
还要注意的是,需要为打出的ipa包做一个plist文件${save_path}/EnterpriseExportOptionsPlist.plist放在对应的目录下,有需要的可以留言,说到最后,感觉也无法说清,最多还是根据自己的情况来定的。可视化的东西用语言表述,真的很难。望大家理解,大家遇到这类的问题,随时留言,很乐意解答。