目录
1. 安装JAVA环境
2. 安装Jenkins
3. 管理插件
4. 项目新建和设置
5. Keychains and Provisioning Profiles Management配置(重点难点)
6. 报错问题汇总
7. 参考博文
1、安装JAVA环境
Jenkins 是一个用Java编写的持续集成工具,依赖于Java,所以在安装Jenkins前,需要先安装Java环境。
首先,检查电脑是否已经安装有环境。
在终端输入命令:java -version。
如果已经安装,则会打印java 版本。如图1-1。
图1-1. 电脑已经安装JAVA JDK环境
否则,会说没有安装,如图1-2。
图1-2. 没有安装JAVA环境
如果没有安装Java环境的话,需要去官网下载JAVA JDK(注意是JDK,不是JRE)。在下载前注意勾选上方的 Accept License Agreement。否则,无法下载。如图1-3。
图1-3. 下载JAVA JDK
安装成功后测试是否安装,如图1-1所示。
2、安装Jenkins
(1) 使用Homebrew的命令行进行安装
在终端输入命令:brew install jenkins
如果没有安装Homebrew,则需要先安装。
【Homebrew 安装方法】:前往Homebrew官网,直接拷贝官网页面上的命令,在终端运行即可。
(2) 启动jenkins,等待其安装完毕。
在终端输入命令:jenkins
(3) 浏览器输入http://localhost:8080并进行访问。浏览器会跳转到图2-1界面。
图2-1 Jenkins初始界面
(4) 在文件系统跳转到网页页面所说的地址(/Users/ageren/.jenkins/secrets/initialAdminPassword),打开文件,拷贝文本内容,复制到网页的"管理员密码处",点击继续。
(5) 步骤(4)完成后页面跳转到新手入门界面,如图2-2。点击"Install suggest plugins"(安装推荐到插件)。等待其安装完毕,安装过程如图2-3,安装结束后界面如图2-4。
图2-2 新手入门界面
图2-3. 新手入门插件安装过程
图2-4. 新手入门插件安装完成
(6) 点击“开始使用kenkins”,进入管理员账户设置页面。填写相关信息,然后点击“保存并完成”,页面进入图2-5。
PS:这个是管理员用户,用户名和密码一定要记住,否则忘了的话找回比较麻烦。
图2-5. 新手入门创建管理员用户
3、管理插件
Jenkins安装完成,并且基本设置做好后。接下来我们就先把必要的插件安装上。
我们要安装的插件有以下:
(1)Xcode integration
(2)GIT plugin
(3)GitLab Plugin
(4)Gitlab Hook Plugin
(5)Keychains and Provisioning Profiles Management
1. 首页的左侧,点击“系统管理”,如图3-1。
图3-1. 系统管理入口
2. 在系统管理界面找到“插件管理”,点击,如图3-2所示。
图3-2. 管理插件入口
3. 在管理插件界面,切换到“可选插件”选项卡,在右上角的过滤搜索里面输入我们要安装的插件名称,回车。找到我们需要的插件,打勾,点击直接安装。(有过滤就是好用,否则一个一个找很浪费时间,呵呵哒~~~)如图3-3所示。
图3-3. 安装插件
4、项目新建和设置
4.1. 新建项目
(1)点击首页的“创建一个新任务”。如图4-1。
(2)选择“构建一个自由风格的软件项目”。PS:这里的任务名称还是写我们的APP项目名比较好。后面的配置会用到这个任务名称。如图4-2.
图4-1 新建任务入口
图4-2 新建任务
4.2. 配置项目
4.2.1 General 参数。
(1)切换到General选项。勾选“丢弃旧的构建”。
(2)设置包(即构建)的保留天数,以及最大保留个数。这个主要按照需要做设置,如图4-3所示。
PS:“丢弃旧的构建”不勾选也可以。
图4-3 设置General 参数
4.2.2 源码管理
(1)切换到源码管理选项。
(2)输入我们要打包的项目的Git地址。最好SSH的。
(3)填写我们要打包的分支(branch)。
(4)如图4-4。点击Add按钮,Add按钮会弹出一个按钮Jenkins,点击它,进行添加SSH key(见4.2.1.1)。
图4-4 设置源码管理
(5)到了这一步,我们应该已经可以正常拉取代码了。点击任务页面的“立即构建”,如图4-5。点击之后,build History 会显示build的进度条。如果代码能正常拉取,则该构建是蓝色的,如图4-6。
图4-5 立即构建项目
图4-6 立即构建后的任务状态
4.2.1.1 添加SSH Key。
1)选择添加SSH key,如图4-7。页面会弹出新的表单,如图4-8。
2) Username 可以随便写,反正自己记得住就行。Private Key选择 Enter directly。如图4-8。
图4-7 选择SSH Username with private key
3) SSH Key的添加跟GitLab上的添加SSH Key步骤类似(前往文件夹:~/.ssh,然后找到钥匙文件拷贝里面的内容,粘贴到网页上)。如图4-9.
图4-9. 找到SSH Private Key 文件
PS1: 要注意的是,这里的key是指私钥,不是公钥。所以我们要拷贝的是~/.ssh/id_rsa,而不是“.pub”结尾的文件。
PS2:可能有读者注意到我的~/.ssh文件下有多个id_rsa文件。这是因为一台电脑配置了2个SSH Key,我选择的那个Key是我的要打包的项目的git下设置的SSH key(用git config设置的),详情可以看我的另外一片博客 《一台电脑绑定两个git帐号(GitHub和GitLab)》。 跟我一样情况的读者,请选择你要打包的那个项目下你绑定的SSH Key。PS3: 要拷贝的id_rsa文件,要把所有的都拷贝上,不要落下-----BEGIN RSA PRIVATE KEY----- 和-----END RSA PRIVATE KEY-----。要不然会拉取不到代码。
4)添加完成后点击左下角的Add按钮,如图4-10。
图4-10 Add SSH Key
5)最后,添加完成回到主界面,发现界面并没有什么变化,如图4-11。其实不然,点击图中的下拉框,会看到我们刚刚在添加SSH Key的时候填写的那个Username。选择它。如图4-12。
图4-11 添加SSH Key 后的界面
图4-12 选择我们添加的SSH Key
4.2.3 构建触发器
(1)切换到“构建触发器”选项。
(2)这里只设置最常用的Poll SCM。切换到“构建触发器”,勾选“Poll SCM”。如图4-13。
H/20 * * * *表示:每20分支构建一次。
图4-13 设置Poll SCM
4.2.4 构建
其中步骤4.2.4.2 Xcode是充分非必要,为什么这么说呢?
(1)因为在4.2.5里有一个坑。而这个坑的解决就是,要先设置构建里Xcode的4.2.4.2.2 Code signing & OS X keychain options才能解决。
(2)在构建步骤,因为Xcode 9的关系,需要用shell脚本来编译打包。shell和Xcode插件两者是互斥的。如果是Xcode 9及以上,到后面需要把这个Xcode插件配置全部删除掉,使用“Execute shell”.
如果Xcode版本是在9以下的,不想用shell脚本构建打包的,按照下面的步骤一步一个脚印配置即可。如果是Xcode 9及以上的,其他步骤不用设置,只设置4.2.4.2.2 Code signing & OS X keychain options这个步骤即可。
4.2.4.1 Excute shell (重点难点,其位置要放到Xcode的前面)
(1)切换到“构建”选项
(2)勾选“增加构建步骤”里面的“Excute shell”。如图4-14。勾选“Excute shell”后,页面也会新增内容。
图4-14 添加Excute shell
(3)添加命令到Comman上,如图4-15,添加到命令内容有两种情况。
图4-15 添加Excute shell
情况1. Xcode 9 以下的
#!/bin/bash -l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
pod install --verbose --no-repo-update
情况2. Xcode 9 以及以上的
PS:添加了xcodebuild -archivePath、xcodebuild -exportArchive -archivePath命令,如果“构建”选项里选择有Xcode的话, 需要把Xcode删除掉
#!/bin/bash -l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
pod install --verbose --no-repo-update
#构建
xcodebuild -archivePath "/Users/ageren/.jenkins/workspace/Vol_Chat/build/Debug-iphoneos/TestChat.xcarchive" -workspace
TestChat.xcworkspace -sdk iphoneos -scheme "TestChat" -configuration "Release.Adhoc" archive
xcodebuild -exportArchive -archivePath "/Users/ageren/.jenkins/workspace/Vol_Chat/build/Debug-iphoneos/TestChat.xcarchive" -exportPath "/Users/ageren/.jenkins/workspace/Vol_Chat/build/TestChat_debug" -exportOptionsPlist '/Users/ageren/.jenkins/workspace/Vol_Chat/build/ExportOptions.plist' -allowProvisioningUpdates
【注意】:xcodebuild -archivePath、xcodebuild -exportArchive -archivePath命令格式为:
xcodebuild -archivePath "/Users/你的电脑用户名/.jenkins/workspace/你新建的Jenkins的项目名(如果你新建的时候跟你的应用名字不一样,那就不是你的应用名)/build/Debug-iphoneos/你的应用名.xcarchive" -project 你的应用名.xcodeproj -sdk iphoneos -scheme "你的应用的scheme名字” -configuration "Debug" archive
xcodebuild -exportArchive -archivePath "/Users/你的电脑用户名/.jenkins/workspace/你新建的Jenkins的项目名(如果你新建的时候跟你的应用名字不一样,那就不是你的应用名)/build/Debug-iphoneos/BasketballLeague.xcarchive" -exportPath "/Users/你的电脑用户名/.jenkins/workspace/你新建的Jenkins的项目名(如果你新建的时候跟你的应用名字不一样,那就不是你的应用名)/build/你的应用名_debug" -exportOptionsPlist '/Users/你的电脑用户名/.jenkins/workspace/你新建的Jenkins的项目名(如果你新建的时候跟你的应用名字不一样,那就不是你的应用名)/build/ExportOptions.plist' -allowProvisioningUpdates
【举个例子】:
xcodebuild -archivePath "/Users/ageren/.jenkins/workspace/Vol_Chat/build/Debug-iphoneos/TestChat.xcarchive" -workspace TestChat.xcworkspace -sdk iphoneos -scheme "TestChat" -configuration "Release.Adhoc" archive
xcodebuild -exportArchive -archivePath "/Users/ageren/.jenkins/workspace/Vol_Chat/build/Debug-iphoneos/TestChat.xcarchive" -exportPath "/Users/ageren/.jenkins/workspace/Vol_Chat/build/TestChat_debug" -exportOptionsPlist '/Users/ageren/.jenkins/workspace/Vol_Chat/build/ExportOptions.plist' -allowProvisioningUpdates
4.2.4.2 Xcode(充分非必要)
(1)切换到“构建”选项
(2)勾选“增加构建步骤”里面的Xcode。如图4-16。勾选Xcode后,页面也会新增内容。
图4-16 构建添加Xcode
4.2.4.2.1 General build settings的设置
(1)General build settings 点击右下方“settings...”按钮
(2)勾选“Pack application, build and sign .ipa?”,页面会新增加的内容。填写内容如图4-17。
图4-17 填写Xcode的General build settings
4.2.4.2.2 Code signing & OS X keychain options(解决坑的这个步骤!!!!)
(1)点击右下方“code signing settings...”按钮
(2)勾选“Unlock Keychain?”,页面会增加新的内容。填写内容如图4-18。
(3)然后点击页面左下角的“保存/应用”按钮。
PS:其中,Development Team ID 需要的是发布证书的TeamID,去钥匙串找到该证书,拷贝这个证书的括号里面的ID,如图4-19。
图4-18 填写Xcode的 Code signing & OS X keychain options
图4-19 获取证书的Team ID
4.2.4.2.3 Advanced Xcode build options
(1)点击右下方“advanced build settings...”按钮,页面会增加信内容。填写内容如图4-20。
图4-20 填写Xcode 的Advanced Xcode build options
4.2.5 构建环境-Keychains and Code Signing Identities(重点难点)
配置Keychains and Code Signing Identities的两个前提:
前提1: 按照步骤5配置好Keychains and Provisioning Profiles Management配置。因为这里的数据是从Keychains and Provisioning Profiles Managemen传过来的。它不可以手动输入的,而是通过点击输入域,等它弹出一个列表,我们来选择item。
前提2: 按照步骤4.2.4.2.2 Code signing & OS X keychain options进行了设置,并且最后点击了“保存/应用”。
上面两个前提缺少一个,下面的配置步骤都走不了。
构建环境里,我们只设置跟证书相关的东西:Keychains and Code Signing Identities。Mobile Provisioning Profiles也是跟证书相关的,但是这个可以不配置。
(1) 切换到“构建环境”选项。
(2)勾选Keychains and Code Signing Identities,页面会添加新的内容。
(3)在界面的Keychain点击选择我们在步骤5的Keychains and Provisioning Profiles Management上传的Keychain的名字。
(4)点击Code Signing Identity,按照打包需求,选择开发者/发布证书的code siging identity,如图4-21。
图4-21 配置构建环境的Keychains and Code Signing Identities
4.2.6 调整配置
在4.2.4 构建中我们提到,Xcode的设置是充分非必要的。到了这里,我们在此检查下,主要检查2个方面。
(1)我们的Execute Shell 是否设置了适配Xcode 9的xcodebuild -archivePath、xcodebuild -exportArchive -archivePath命令。如果设置了这些命令,并且设置了Xcode。那么在需要把整个Xcode设置删除掉。
(2)构建中Execute Shell 的位置是否在Xcode的前面。如果不是需要进行调整(长按拖动)。
5. Keychains and Provisioning Profiles Management配置(重点难点)
这个地方很重要,也是容易入坑的地方。很多跟证书有关的报错都是因为这里没有配置正确。
首页的左侧,点击“系统管理”。 在系统管理里面找到 Keychains and Provisioning Profiles Management,如图5-1。点击进入到图5-2所示界面。
误区1:可能有小伙伴有配置过别的东西,像极光推送之类的。看到有Provisioning Profile File,就以为另外一个要上传的是cer证书文件/p12文件。
But1:但是!但是!但是!(注意,重要的事情说3遍!!)Keychain是指login.keychain文件,而Provisioning Profile File才是我们平常用的那个Provisioning Profile File。
误区2:从图中可以看出,这里需要Keychain or(或者)Provisioning Profile File。
But2:但是!但是!但是!(注意,重要的事情说3遍!!)这里是要两个都要上传,而且分两步走。先上传login.keychain,再上传Provisioning Profile File。
5.1 上传 login.keychain文件
login.keychain文件位于【/用户/电脑用户名/Library/keychains/login.keychain】。
(1)点击界面的“选择文件”,找到login.keychain(2)点击“upload”。
(3)配置如图5-3。
图5-3 上传login.keychain后到配置
PS1:login.keychain文件上传后,界面会添加新的东西(Filename、Password等)。有的电脑会自动添加Code Signing Identity的数据,有的电脑不会自动添加;有的添加了,但是只添加了一个。可以通过点击界面的“Add Code Signing Identity”来添加上。
PS2:证书名字我们可以到钥匙串,找到对应的证书,复制证书的名字(整个名字都要复制上),粘贴到界面的Code Signing上。如图5-4。
图5-4 拷贝证书的名字
5.2 上传Provisioning Profile File文件
5.2.1 操作前的困惑
困惑1: 要上传的Provisioning Profile File到底是开发者Provisioning Profile,还是ADHoc Provisioning Profile?
答:这个要看我们要打包的ipa上传的应用托管平台而定。如果托管平台既支持开发者打包又指出ADHoc,那我们需要上传两个Provisioning Profile。否则我们可以只上传托管平台支持的那个Provisioning Profile。如fir,只支持成ADHoc,那么我们就只上传ADHoc就可以了。 不过保险起见,我把2个都上传了。
困惑2: 界面没有Add Provisioning Profile的相关按钮。既然可以上传2个文件。如何上传多个Provisioning Profile File?
答:要有多个Provisioning Profile的话,我们需要走多次上传流程。(同样的上传流程。先上传第一个Provisioning Profile,然后再上传第二个Provisioning Profile)。
5.2.2 操作起来
(1)点击界面的“选择文件”,找到我们的ADHoc Provisioning Profile File
(2)点击“upload”。上传完成后,界面也会新增新的内容(Filename、UUID)。如图5-5。
(3)上传完Provisioning Profile,我们还需要填写Provisioning Profiles Directory Path。这个地址是固定死的,比较简单,统一填写【/Users/Shared/Jenkins/Library/MobileDevice】即可。
5.3 点击保存
点击左下方“保存”按钮。至此,Keychains and Provisioning Profiles Management配置完成。从一开始到这里,整个Jenkins也配置完成了!(撒花~~~~~!!!)
6 报错问题汇总
6.1 Jenkins 配置和一般的问题
1.【问题】:在【4.2.5 构建环境-Keychains and Code Signing Identities】一节里。我按照【5 Keychains and Provisioning Profiles Management配置】配置好了系统的Keychains and Provisioning Profiles Management插件。然后就开始配置Keychains and Code Signing Identities。网上很多教程都是一选择Keychain,界面会自动填写Variables,点击Code Signing Identity的时候,会有列表出来。我的界面的数据几乎都是空白的(如图6-1)。我怀疑五我没有配置对,又反复配置了好几次。结果没有任何效果。
图6-1 没有数据出来的Keychains and Code Signing Identities
【解决方法】:只要我们做过4.2.4.2.2 Code signing & OS X keychain options步骤,并且点击了页面左下方的“保存/应用”按钮。问题就能得到解决。
【解决方法】:没有打开Apache的话,浏览器就不能访问本地。Apache是Mac自己默认安装有的。一般来说不用做多余的安 装。
因此只需启动Apache:
在终端输入命令:sudo apachectl start
等到Apache启动完成,再刷新一次。浏览器就会跳转到Jenkins到界面。
3.【问题】:启动了Apache,浏览器地址输入http://localhost:8080,依然无法访问。
【解决方法】:因为Jenkins没有启动。命令行输入命令启动。
在终端输入命令:Jenkins
4. 在插件管理里面,卸载了插件的话,要重启Jenkins才算真正的卸载。
5.【问题】:如何重启Jenkins
【解决方法】:浏览器地址输入以下地址,回车。
http://localhost:8080/exit //退出Jenkins
http://localhost:8080/restart //重启
http://localhost:8080/reload //重新加载
6.【问题】:我忘记了用户名,但是记得密码
【解决方法】:/Users/ageren/.jenkins/users下面有文件夹,名字就是用户名
6.2 Jenkins 日志报错的问题
1.【问题】:
archive error
Check dependencies The file “Pods-Swarm_swift.release.xcconfig” couldn’t be opened because there is no such file. (/Users/HW/.jenkins/workspace/SWARM/Pods/Target Support Files/Pods-Swarm_swift/Pods-Swarm_swift.release.xcconfig) ------ diff: /../Podfile.lock: No such file or directory diff: /Manifest.lock: No such file or directory error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. ** ARCHIVE FAILED **
【解决方法】:“构建”添加“Excute shell”,并放到最前面。 将pod 相关的命令复制到shell 区域。
【shell 命令】:
#!/bin/bash -l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
#pod 更新
pod install --verbose --no-repo-update
2.【问题】:requires a provisioning profile with the Push Notifications and Associated Domains features问题
【报错如下】:
Error Domain=IDEProvisioningErrorDomain Code=9 ""TestChat.app" requires a provisioning profile with the Push Notifications and Associated Domains features." UserInfo={NSLocalizedDescription="TestChat.app" requires a provisioning profile with the Push Notifications and Associated Domains features., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}
【原因分析】: 新版的Xcode 9不会允许你访问钥匙串里的内容,除非设置allowProvisioningUpdates。
【解决方法】:使用脚本代替插件(插件本质是帮助我们生成打包脚本代码)。
【做法】:
(1)在项目的配置里,切换到“构建”选项。如果已经添加了Xcode的设置,需要把Xcode删除掉。没有添加“Excute Shell”的话则添加上“Excute Shell”。在“Excute Shell”的command里添加xcodebuild -archivePath,
xcodebuild -exportArchive -archivePath的脚本命令,输出ipa包。
(2)具体命令为(命令的顺序不能出错):
xcodebuild -archivePath "/Users/你的电脑用户名/.jenkins/workspace/你新建的Jenkins的项目名(如果你新建的时候跟你的应用名字不一样,那就不是你的应用名)/build/Debug-iphoneos/你的应用名.xcarchive" -project 你的应用名.xcodeproj -sdk iphoneos -scheme "你的应用的scheme名字” -configuration "Debug" archive
xcodebuild -exportArchive -archivePath "/Users/你的电脑用户名/.jenkins/workspace/你新建的Jenkins的项目名(如果你新建的时候跟你的应用名字不一样,那就不是你的应用名)/build/Debug-iphoneos/BasketballLeague.xcarchive" -exportPath "/Users/你的电脑用户名/.jenkins/workspace/你新建的Jenkins的项目名(如果你新建的时候跟你的应用名字不一样,那就不是你的应用名)/build/你的应用名_debug" -exportOptionsPlist '/Users/你的电脑用户名/.jenkins/workspace/你新建的Jenkins的项目名(如果你新建的时候跟你的应用名字不一样,那就不是你的应用名)/build/ExportOptions.plist' -allowProvisioningUpdates
【举个例子】:
xcodebuild -archivePath "/Users/ageren/.jenkins/workspace/Vol_Chat/build/Debug-iphoneos/TestChat.xcarchive" -workspace TestChat.xcworkspace -sdk iphoneos -scheme "TestChat" -configuration "Release.Adhoc" archive
xcodebuild -exportArchive -archivePath "/Users/ageren/.jenkins/workspace/Vol_Chat/build/Debug-iphoneos/TestChat.xcarchive" -exportPath "/Users/ageren/.jenkins/workspace/Vol_Chat/build/TestChat_debug" -exportOptionsPlist '/Users/ageren/.jenkins/workspace/Vol_Chat/build/ExportOptions.plist' -allowProvisioningUpdates
3.【问题】:error: Couldn't load -exportOptionsPlist: The file “ExportOptions.plist” couldn’t be opened because there is no such file.
Error Domain=NSCocoaErrorDomain Code=260 "The file “ExportOptions.plist” couldn’t be opened because there is no such file." UserInfo={NSFilePath=/Users/ageren/.jenkins/workspace/Vol_Chat/build/ExportOptions.plist, NSUnderlyingError=0x7fb479178710 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
【原因分析】:这里还有一个问题就是命令里面提到的ExportOptions.plis文件。这个文件目前为止,在Jenkins目录下是没有的。所以需要我们自己去添加一个。怎么添加?
【解决方法】:我们在本地电脑的Xcode上,archive改App项目的development(开发者)的archive 包。从这个包的文件夹里面就有一个ExportOptions.plist,如图,直接拷过来,粘贴到命令所说的文件夹('/Users/ageren/.jenkins/workspace/Vol_Chat/build/ExportOptions.plist')里去,如图6-2。
图6-2 拷贝archive里面的ExportOptions.plist文件
4. 【问题】:Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/rn/1xn_nml56wn1zg61j9zdw7yw0000gn/T/ipatool-json-filepath-iLJOAn}。
【解决方法】:archive 完成,要export包的时候,在弹出的选择机型里面,App Thinning要选择None,而且其他地方不要打勾,如图6-3。我当时选择了“All compatible device variant”, 然后EXPORT FAILED,
图6-3. archive的时候App Thinning要选择None
【解决方法】:有2种。
(1)设置Jenkins的环境变量。
方法1:在系统设置全局里面添加。“系统管理”-“系统设置”-“全局属性”-“环境变量”,如图6-4。
1)在命令行下执行 echo $PATH,记录下输出的结果
2)在 jenkins 中系统管理-系统设置中,找到 环境变量(Environment variables)
3)在 key 中填写 $PATH,在 value 中填写第一步中输出的结果
4)保存即可
图6-4 环境变量的位置
方法2:在shell设置里面添加。
(2)更新RVM。【这个方法解决了我的问题】。命令后先后输入以下命令:
curl -sSL https://get.rvm.io | bash
source ~/.bashrc
source ~/.bash_profile
详细情况请看《shell_session_update: command not found》。
7. 参考博文
(1)《利用Jenkins进行iOS持续集成》
(2)《iOS项目持续集成》
(3)《Jenkins安装&配置》
(3)《Jenkins/git/KeyChains & Provisioning, 记录CI中的一些坑》
(4)《使用 Jenkins 持续集成 iOS 项目时碰到的一些问题》
(5)《shell_session_update: command not found》