一、Jenkins的作用
我要这Jenkins有何用?结合使用经验,简单总结如下:
1.一旦在Jenkins服务器上把项目配置好,就可持续集成(CI),分分钟打包,让开发者从繁琐的集成中解脱出来,专注于更为重要的业务逻辑上。
比如测试人员找开发者打包,而开发者正在修改项目代码,一般使用Xcode等工具打包,要先注释掉正在修改中的代码,避免未经验证的代码产生bug,打包之后再把注释掉的代码恢复。这非常影响开发者的逻辑思路,若正在修改的代码量很多就悲催了。但使用Jenkins,会直接拷贝SVN(或其它源代码仓库)上检入的最新代码到工作空间进行打包,和开发者计算机本地的代码互不影响,也不用担心打包之前忘记更新代码。开发者只需连接SVN内网后,在Jenkins页面上点击打包按钮,即可一键完成打包任务。
2.Jenkins构建可记录SVN的提交版本号,能监控每次打包对应的代码更新内容,从而有效的定位不同版本的包产生的问题所在位置。
3.Jenkins的多样化特性,使它能人性化地服务于开发团队:
⦁ 易于安装,无需数据库支持,界面化配置操作简单方便;
⦁ 可预设集成时间,支持自动化构建,如每晚九点自动打包;
⦁ 构建完成后,支持声音提醒及Email通知打包结果;
⦁ 提供详细的日志,能实时监控集成中存在的错误;
⦁ 支持分布式构建,可让多台计算机一起打包测试;
⦁ 提供大量开源插件,并支持扩展插件,可开发适合自己团队使用的工具;
二、Jenkins的安装
在Mac终端输入命令行:java -version,查看java运行环境
若没有安装java,则先下载并安装java环境。(下载地址点我)

安装后查看到版本如下:

然后下载jenkins 的pkg安装文件(下载地址点我),双击打开一步步安装完成后,会自动使用默认浏览器打开http://localhost:8080/ 的网址,且共享目录下多出一个Jenkins用户。

在本地文件夹前往/Users/Shared/Jenkins/Home/secrets/initialAdminPassword路径,需要更改secrets文件夹的everyone的权限后,打开initialAdminPassword文件,复制出密码,粘贴到网页的输入框中。


下面安装Jenkins的插件:

创建管理员用户和密码,点击下一步:


Jenkins安装完毕,点击start using jenkins 按钮,即可进入Jenkins管理页面!

三、配置iOS项目
Jenkins创建iOS项目,有两种配置方法,一种是用shell脚本配置,另一种是用Xcode插件配置,个人推荐使用脚本配置项目,成功率高,可控性强!
(1)Shell脚本配置方法
点击"新建",输入item的名称,选择"构建一个自由风格的软件项目",点击"OK"。

下面依次配置模块:General->源码管理->构建触发器->构建环境->构建->构建后操作。
General模块主要填写三个地方:项目名称及描述、丢弃旧的构建、参数化构建过程



源码管理模块,我这里配置的是SVN的地址及账号:


构建触发器模块,可根据需要选择性勾选Build periodically选项,即按照预先设定的时间自动化构建。日程表的填写内容有5个参数,从左到右的参数含义如下:
⦁ 第1个参数:分钟 minute,取值 0~59;
⦁ 第2个参数:小时 hour,取值 0~23;
⦁ 第3个参数:天 day,取值 1~31;
⦁ 第4个参数:月 month,取值 1~12;
⦁ 第5个参数:星期 week,取值 0~7,0 和 7 都是表示星期天;
5个参数可选择性设定,不写死的参数用 * 号代替,参数之间用空格隔开。例如"0 21 * * *"表示每晚21点0分自动化构建一次,"0 * * * *"表示每个小时的第0分钟执行一次构建等。

构建环境模块需要安装一个NodeJS插件,此时先点击保存按钮保存配置好的参数,然后点击左上角的Jenkins,找到系统管理,点击管理插件,点击可选插件,在过滤条中输入"NodeJS",查找到NodeJS Plugin插件,直接安装此插件。


安装完成后回到系统管理,点击Global Tool Configuration工具,找到NodeJS选项配置插件,自定义别名,安装目录填写“/usr/local”,点击左下角保存按钮。

这里在系统管理->系统设置中,点击顶部主目录旁边的"高级"按钮,可顺便配置工作空间根目录和构建记录根目录。

回到项目的配置页面,发现构建环境模块里多出了“Provide Node & npm bin/ folder to PATH”选项,勾选它并选中刚刚配置的NodeJS插件别名。

构建模块,点击增加构建步骤里的Execute shell,编辑shell脚本,配置打包过程。


以下是我配置的具体脚本内容,其中工程目录可根据需要自定义,带有 * 号的item名称和证书信息部分要换成与自己工程相对应的内容:
# !/bin/bash -ex
# export LANG=en_US.UTF-8
# 工作空间位置
WORKSPACE="/Users/Shared/Jenkins/Home/jobs/****/workspace"
# 切换到工程目录
cd ${WORKSPACE}/${ProjectName}/platforms/${platforms}
# 打开钥匙串
security unlock-keychain -p ${password} ~/Library/Keychains/login.keychain
# pastry命令行将外层的 www 目录 合并到 平台内的 www 目录
# /Users/Shared/Jenkins/Documents/pastry/bin/pastry bake cordova prepare ${platforms}
# 配置 版本号
buildNumber="Jenkins:${BUILD_NUMBER} svn:${SVN_REVISION}"
# 获取配置文件地址
PROJECT_INFOLIST="${WORKSPACE}/${ProjectName}/platforms/${platforms}/${ProjectName}/${ProjectName}-Info.plist"
# 修改配置文件 的 版本号
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${buildNumber}" "${PROJECT_INFOLIST}"
# 编译(单工程用-target,多工程用-workspace)
xcodebuild -target ${ProjectName} -scheme ${ProjectName} clean build -configuration ${mode}\
PROVISIONING_PROFILE="****"\
CODE_SIGN_IDENTITY="****"\
PRODUCT_BUNDLE_IDENTIFIER="****"\
SYMROOT=${WORKSPACE}/Sym.root
# ipa包的导出目录
packageOut="${WORKSPACE}/package_Out"
# 删除旧包,重新创建目录
rm -rdf ${packageOut}
mkdir -p ${packageOut}
# 打包
xcrun -sdk iphoneos PackageApplication -v "${WORKSPACE}/Sym.root/${mode}-iphoneos/${ProjectName}.app" \
-o "${packageOut}/${ProjectName}_${BUILD_NUMBER}.ipa"
# pastry命令行编译打包
# /Users/Shared/Jenkins/Documents/pastry/bin/pastry bake compile ${platforms} -m ${mode} -bc "${bc}"
构建后操作模块,点击"增加构建后操作步骤"按钮,选择"Archive the artifacts",在用于存档的文件输入框中输入"package_Out/*",这样构建完成后,生成的ipa包链接就会显示在页面上,点击链接即可把ipa包下载到本地。

配置完毕,返回Jenkins->item页面,点击Build with Parameters选项,点击"开始构建"按钮,即可一键打包!打包过程中,可点击屏幕左下角构建历史中的本次构建版本,然后点击Console Output选项查看控制台输出的详细日志,可实时查看本次构建明细。


构建完成后,查看构建历史,蓝色圆球代表构建成功,红色圆球代表构建失败,灰色圆球代表构建中断。点击本次构建记录,可查看对应的SVN提交版本号及修改明细。点击构建产生文件下的链接,即可把ipa包下载到本地。


(2)Xcode插件配置方法
此种方法的模块配置和脚本配置过程基本一致,主要不同的是"构建环境"和"构建"两个模块,这里要安装Xcode integration和Keychains and Provisioning Profiles Management两个插件。
首先配置证书和描述文件,进入系统管理->Keychains and Provisioning Profiles Management页面,把"/Users/管理员用户名/Library/Keychains/login.keychain"目录下的login.keychain文件拖拽到页面中的"选取文件"按钮上,点击upload按钮,Jenkins会把这个Keychain文件拷贝到/Users/Shared/Jenkins/Library/Keychains/login.keychain目录下。同样原理,把/Users/管理员用户名/Library/MobileDevice/Provisioning Profiles目录下的工程描述文件也拖拽到"选取文件"按钮上,并点击upload按钮。


回到item配置的"构建环境"模块,勾选Keychains and Code Signing Identities和Mobile Provisioning Profiles两个选项,查看参数是否自动配置正确。若参数输入框没有自动匹配,点击保存按钮,退出再次进入配置页面,即可看到相应的证书和描述文件了。

下面进入"构建"模块,点击"增加构建步骤"按钮,选择"Xcode"选项。General build settings部分依次填写工程Target名->勾选清除缓存->填写打包模式(Debug、Release)->勾选"Pack application, build and sign .ipa?"->填写ipa名称及导出路径。

Code signing & OS X keychain options部分勾选"Unlock Keychain?",填写钥匙串文件路径和密码,钥匙串密码一般就是开机密码。

注意如果项目使用了Cocoapods,则需要配置Advanced Xcode build options部分的设置,文件无需写扩展名。至此,Xcode插件方法配置完毕,可以开始构建了。

四、配置Android项目
配置安卓项目需安装两个插件:Gradle Plugin和Android Emulator Plugin,具体安装步骤同上。同样需要安装java环境,并把java路径配置到系统环境变量中,参考如何在mac下配置Java环境变量。
下面点击Jenkins ->系统管理 –>系统设置 –> Environment variables 来编辑环境变量:

同样构建一个自由风格的软件项目,配置好SVN源码管理模块。不同的是,在"构建"模块要选择Invoke Gradle Script来配置参数:勾选Use Gradle Wrapper选项,在Tasks一栏中填写"clean build",勾选Force GRADLE_USER_HOME to use workspace选项,点击保存。


配置完毕,可开始构建打包。构建完成后点击apk文件链接,可直接把包下载到本地。

五、问题总结
1.若构建卡在编译那里,先在工作空间中,用Xcode打开工程编译成功一次,再重新构建;
2.确保SVN仓库地址不要存在中文,并且构建时要连接SVN内网;
3.若提示找不到证书和描述文件,打开钥匙串,设置证书权限为"允许所有应用程序访问此项目",并删除钥匙串存在的过期证书;

4.遇到不好定位的构建失败问题,可尝试清理工作空间,重新构建;

5.使用Xcode8以后的版本,在用Jenkins构建时可能提示xib文件报错,把工程里所有的xib文件打开方式设置为用"Xcode 7.x"打开,提交修改至SVN,重新构建;

6.相关Terminal命令
若在浏览器重启Jenkins,直接在本地网址后面加上restart即可,如:
http://localhost:8080/restart
Mac终端启动Jenkins服务:
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
Mac中终端停止Jenkins服务:
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
Mac终端卸载Jenkins:
~/Library/Application Support/Jenkins/Uninstall.command
Mac终端显示系统隐藏文件,需按option+cmd+esc重启Finder:
defaults write ~/Library/Preferences/com.apple.finder AppleShowAllFiles -bool true
Mac终端不显示系统隐藏文件,需按option+cmd+esc重启Finder:
defaults write ~/Library/Preferences/com.apple.finder AppleShowAllFiles -bool false
网友评论
怎么解决