前言
持续集成是敏捷开发中重要的一部分,为保证新功能的开发,又保证旧功能的维护,从一个冲刺到下个冲刺。持续集成工具是我们保证开发和维护并行的护航者,现在流行的集成工具有很多,例如:
1.Jenkins
2.Buildbot
经过对比,Jenkins工具搭建相对简单(仅指安装),打包速度也比较快,得到很多朋友的青睐,所以本文是以描述Jenkins搭建环境为主旨。(踩了好多坑啊哈哈哈)
Jenkins 的 好处
在写本文之前,我觉得有必要提一下Jenkins 对一个团队的好处。
最简单粗暴的好处就是降低 开发团队与测试团队的耦合,Jenkins也支持定时自动打包,上传等,省去了“修改配置项--编译---连接设备--运行打包--装ipa--然后交给等待的测试人员”这些简单繁琐的步骤。也避免测试人员测错包之类,把开发已经修改的bug打回来这种问题。
注意:打包ipa包需要有xcode环境,所以要想在公司的服务器配置iOS打包环境,要求服务器必须是Mac OS系统,Linux和Windows只能靠边了。我是在一台Mac mini 下配的环境。
步骤大致可以分为以下几步:
1.搭建Java环境
2.搭建Jenkins环境
3.配置证书和描述文件、钥匙串
4.配置项目
5.配置xcode 环境
1.配置java环境
浏览器打开 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 选择Mac OS 的安装包下载,JDK安装都很简单,安装过程这里就省略了。
JDK2.搭建Jenkins环境
浏览器打开 Jenkins官网 点击下载Jenkins,选择Mac OS安装包,我现在装的是2.46.1
选择jenkins安装包接下来就是傻瓜式的下一步安装,这里就不一一贴图了。
安装完成后浏览器一般会自动打开 http://localhost:8080,如果不自动打开可以手动打开这个链接,然后会提下下列的错误信息
unlock Jenkins顾名思义,我们要去log路径下取到password,输入才能进入Jenkins。右键 Finder->前往文件夹->输入/Users/Shared/Jenkins/Home 回车后应该看到下面
jenkins psd看到secrets文件是有个减号的,右键secrets->显示简介->共享与权限->将everyone权限改成 读与写。
secret权限双击点开secrets之后应该如下所示:
initialAdminPassword同理,因为我们没有initialAdminPassword的读写权限是无法打开的,右键 initialAdminPassword->显示简介->everyone权限改成读与写
initialAdminPassword权限然后用文本来打开initialAdminPassword,把里面那串数字复制,把这串数字填到Jenkins启动的那个页面,如果你不小心关了上面那个页面,打开http://localhost:8080即可。
解锁然后continue,这时会看到以下页面,选择红色框里的 Install suggested plugins(Jenkins建议安装的插件)
customize Jenkins看到这个页面之后,等待Jenkins把插件下载完
下载插件这里创建下Admin User,把这些项都填完之后点击save and finish就OK了。注意要记得用户名和密码,以后你登录要用到的,忘记密码就麻烦了。
创建用户名和密码 ready到这步已经说明Jenkins环境已经搭建好了。点击start using jenkins
进入jenkins页面这时需要配置一下插件,系统管理->管理插件->可选插件
插件管理第一步因为项目是配置svn为管理器的,git管理代码的可以参照其他同学的教程自行配置。我们先下载svn插件,在过滤输入框中输入svn,勾选 SVN Publisher plugin。点击直接安装。
插件管理-svn同理,我们要下载 xcode integration 和keychains and Provisioning Profiles Management 这两个插件。
插件管理-xcode integration 插件管理- keychain and profiles把这两个搜索出来,勾选然后直接安装。然后等待完成
等待插件安装完成安装完成后我们重启下jenkins,重新加载下插件。可以滑到最底下勾选重启,或者也可以在地址栏输入http://localhost:8080/restart
完成安装插件重启Jenkins重启之后应该要输入用户名和密码,把刚刚注册的用户名密码输入进去。
还有一个重要的步骤,我们先给Jenkins用户管理员的权限,避免后续的访问问题。
系统偏好设置->用户与群组->点开锁,然后在Jenkins用户下勾选“允许用户管理这台电脑”。
到这步最好给Jenkins用户设置一个密码,便于后期检查是否Jenkins配置错误或者是检查代码错误。
Jenkins用户权限问题3.配置证书和描述文件、钥匙串
点击系统管理->keychain and provision Profiles Management
keychain and provision在这之前,我准备了开发证书.p12 + 描述文件,生产证书.p12 + 描述文件,分别用来上线打包和测试打包。这步并不需要我们上传证书,而是上传需要描述的文件和login.keychain。login.keychain有坑!有坑!有坑!!!!! 之前我是把login.keychian 复制到桌面然后上传的,构建的时候总是报错keychian 权限问题。然后我是按照以下方式来做的。
配置keychain 证书和描述文件在此之前先普及一下,jenkins其实是自己开了一个用户,用于存储一些配置文件和信息等。我们可以在finder里面找到Jenkins用户的文件夹,点击前往上层文件夹
寻找上层文件夹然后找到共享中的jenkins用户
jenkins目录1.Finder->前往文件夹->/Users/“你的mac用户名”/library
2.找到keychains 这个文件夹,拷贝
3.用上面那种方法放到Jenkins->Library文件夹下
拷贝keychain文件为了避免描述文件也出现类似的找不到的错误,我们也把描述文件拷贝到Jenkins用户->Library。
1.Finder->前往文件夹->/Users/“你的mac用户名”/library(或者还有一个方法,打开xcode->preferences->找到你账号下的描述文件)
2.找到keychains 这个文件夹,拷贝"MobileDevice"整个文件夹
3.用上面那种方法放到Jenkins->Library文件夹下。
拷贝mobileDevice文件接下来就是上传keychain和描述文件了。
上传keychain和描述文件这里我们选刚刚拷贝过去的Jenkins文件目录下的keychain和描述文件。点击选取文件->搜索login.keychain,这里要注意下是否为Jenkins目录下的keychain。
上传keychain上传完之后打开钥匙串,找到我需要上传的两本证书的名字,因为我想上传一个开发证书和一个生产证书,所以上传两个。把这两个证书的名字复制下来
证书名字然后点击 Add Code Signing Identity,分别把这两个名字粘贴过去。完成了之后大概如下:
keychain接下来就是描述文件了。这里要注意一点,在Provisioning Profiles填上/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles这个地址。然后按照上传keychain的步骤,把Jenkins用户目录下的描述文件上传上去就行啦
Provisioning Profile地址完了之后是这样的。
keychain描述文件成功图4.配置项目
keychain配置好之后,接下来就是新建一个工程了。输入你的项目名称(项目名称会在Jenkins下生成一个文件夹)。构建一个自由风格的软件项目,点击ok
新建项目1.General
新建完之后点选丢弃旧的构建,配置一下保持构建的天数和最大个数
配置旧的构建2.源码管理
然后配置源码管理,这是Jenkins拉取代码的路径(尽量精确到项目位置),如果Credentials没有,则点击右边的add,填上自己的svn账号和密码。假如这栏没有报红,基本上地址什么的都是正确的了。
配置svn3.构建环境
接下来配置构建环境,这里我们勾选Keychains and Code Signing Identities,选择login.keychain,然后选择对应的证书名字。同样勾选Mobile Provisioning Profiles,选择对应的描述文件。
构建环境4.构建
因为我项目用到cocoapods,所以要先在构建这里选执行脚本,在里面输入
#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
cd $WORKSPACE/你的项目名称
/usr/local/bin/pod update --verbose --no-repo-update
注意:没有#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8 /usr/local/bin/ 这几句可能会造成编译器读不懂pod语句。当你构建的时候提示pod语句出错,百分之九十都是这个错误。
创建脚本 输入接下来添加xcode构建工具
添加xcode构建工具首先配置General,这里又有一个坑!!!!输出路径必须是workspace路径下的,然后会报权限不够等之类的问题
xcode-general配置之后是Code signing & OS X keychain options
Code signing & OS X keychain options接下来是配置 Advanced Xcode build options。
tips:jenkins会在它的目录Home->workspace下建一个文件夹,这个文件夹名字就是你的项目名字(比如你的项目名字叫JenkinsProj,那么会存在Jenkins->Home->workspace->JenkinsProj这个文件夹)。${WORKSPACE}一般都会到Jenkins创建的文件夹下。
Build output diretory 还是老实点写在workspace下比较好,因为Jenkins创建的目录我觉得足够清晰了。之前我写在另一个用户下就会报权限问题。
advance配置一般这样配置完就可以成功打包了,在整个配置过程中,都不能粗心大意或者自以为是的随意配置。可能文章还有写的不够的地方或者错误的地方,欢迎大家指正完善。也希望大家把遇到的问题多多分享一下~
错误大全
1.钥匙串的错误
类似下面的钥匙串错误,我给大家个tips:
1、钥匙串无非是两个地方设置和用到,分别为系统管理->Keychains and Provisioning Profiles Management 和 项目配置里面->构建环境下的Keychains and Code Signing Identities 这两个地方去找,看有没有不匹配的地方,或者按照上面说到的相应步骤重新来。
钥匙串错误2.cocoapods错误
类似下面的错误,一般先要检查项目配置里面->构建->Execute shell 有没有写错。
#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
cd $WORKSPACE/你的项目文件
/usr/local/bin/pod update --verbose --no-repo-update
如果这样写还不行,mac注销当前用户,进入Jenkins用户,看是否安装了cocoapods,如果没有安装,需要安装一下,并且版本要与当前用户一致(Jenkins用户的密码可以在系统偏好设置->用户与群组设置。)
cocoapods错误3.Xcode终止打包
遇到Xcode终止打包这时进入Jenkins用户,在Jenkins下编译看有没有问题。如果有问题,这时候就要检查下你svn上的项目是否正确了。
4.scheme错误
打开Xcode->manageSchema,把share勾上
大家可以把遇到的问题留言,我们共同解决
网友评论
[iosc2b] $ /bin/sh -xe /var/folders/f0/x0kq42xd3bg36dvpgt873hc00000gn/T/jenkins5253628196169611145.sh
+ TARGET_NAME=c2b_phone
+ APP_NAME=BR
+ CODE_SIGN_DISTRIBUTION='iPhone Distribution: Shenzhen Brightoil EC Ltd (MQ5A3K35HV)'
+ project_infoplist_path=./c2b_phone/Info.plist
++ /usr/libexec/PlistBuddy -c 'print CFBundleShortVersionString' ./c2b_phone/Info.plist
Print: Entry, "CFBundleShortVersionString", Does Not Exist
+ bundleShortVersion='File Doesn'\''t Exist, Will Create: ./c2b_phone/Info.plist'
Build step '执行 shell' marked build as failure
Finished: FAILURE
这脚本报错 找不到原因 大神求救
+ wget -O /Users/finedo/Desktop/ipa/icon.png 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1522135757&di=3dbcdf3f039b99107783b78eee418746&imgtype=jpg&er=1&src=http%3A%2F%2Fimg4.duitang.com%2Fuploads%2Fblog%2F201308%2F03%2F20130803202431_nkmhr.thumb.700_0.jpeg'
/Users/finedo/Desktop/ipa/icon.png: Permission denied
Build step 'Execute shell' marked build as failure
Finished: FAILURE
Update all pods
Preparing
Cloning spec repo `gitee-sfriend-repos` from `https://gitee.com/sfriend/repos.git`
$ /usr/bin/git clone https://gitee.com/sfriend/repos.git gitee-sfriend-repos
Cloning into 'gitee-sfriend-repos'...
fatal: could not read Username for 'https://gitee.com': Device not configured
[!] Unable to add a source with url `https://gitee.com/sfriend/repos.git` named `gitee-sfriend-repos`.
(/usr/bin/git clone https://gitee.com/sfriend/repos.git gitee-sfriend-repos
Cloning into 'gitee-sfriend-repos'...
fatal: could not read Username for 'https://gitee.com': Device not configured
)
You can try adding it manually in `~/.cocoapods/repos` or via `pod repo add`.
FATAL: String index out of range: 15
java.lang.StringIndexOutOfBoundsException: String index out of range: 15
at java.lang.String.substring(String.java:1963)
at com.sic.plugins.kpp.provider.KPPBaseProvisioningProfilesProvider.removeUUIDFromFileName(KPPBaseProvisioningProfilesProvider.java:171)
at com.sic.plugins.kpp.model.KPPProvisioningProfile.getProvisioningProfileFilePath(KPPProvisioningProfile.java:76)
at com.sic.plugins.kpp.KPPProvisioningProfilesBuildWrapper.copyProvisioningProfiles(KPPProvisioningProfilesBuildWrapper.java:157)
at com.sic.plugins.kpp.KPPProvisioningProfilesBuildWrapper.setUp(KPPProvisioningProfilesBuildWrapper.java:99)
at hudson.model.Build$BuildExecution.doRun(Build.java:157)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:534)
at hudson.model.Run.execute(Run.java:1728)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:405)
Archiving artifacts
Finished: FAILURE
你知道什么原因么?
PhaseScriptExecution [CP]\ Embed\ Pods\ Frameworks /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/XWWYProject-dcjhiofujhoxeqexvhjybnwdaxyy/Build/Intermediates/ArchiveIntermediates/XWWYProject/IntermediateBuildFilesPath/XWWYProject.build/Debug-iphoneos/XWWYProject.build/Script-429FC18FE7C3B9CB10DF1862.sh
(1 failure)
Build step 'Xcode' marked build as failure
Finished: FAILURE
大神,我现在一直报这个错误,已经处理了1天了,还没解决,求帮忙
#import "AFNetworking.h"
^
1 error generated.
** BUILD FAILED **
The following build commands failed:
ProcessPCH /Users/mini5/Library/Developer/Xcode/DerivedData/SmartHomeV6-fowrnpddbbgfbydxolgytkmwlayk/Build/Intermediates/PrecompiledHeaders/PrefixHeader-flfvjvthseypmichkmpngfeuqkfv/PrefixHeader.pch.pch SmartHomeV6/PrefixHeader.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler
ProcessPCH /Users/mini5/Library/Developer/Xcode/DerivedData/SmartHomeV6-fowrnpddbbgfbydxolgytkmwlayk/Build/Intermediates/PrecompiledHeaders/PrefixHeader-fzzpxgxcbjvjogckqoqukzkgrydt/PrefixHeader.pch.pch SmartHomeV6/PrefixHeader.pch normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler
hello,jenkins打包遇到这个问题,但使用XCode打包没问题,有时间帮忙看下?
[METEST] $ /usr/bin/xcodebuild -scheme /Users/Shared/Jenkins/Home/workspace/METEST/ -workspace /Users/Shared/Jenkins/Home/workspace/METEST/mejinrong.xcworkspace -configuration Release clean build CONFIGURATION_BUILD_DIR=/Users/Shared/Jenkins/Home/workspace/METEST/build
Build settings from command line:
CONFIGURATION_BUILD_DIR = /Users/Shared/Jenkins/Home/workspace/METEST/build
xcodebuild: error: The workspace named "mejinrong" does not contain a scheme named "/Users/Shared/Jenkins/Home/workspace/METEST/". The "-list" option can be used to find the names of the schemes in the workspace.
Build step 'Xcode' marked build as failure
Finished: FAILURE
这是什么原因啊 始终找不到问题
ERROR: No artifacts are configured for archiving.
You probably forgot to set the file pattern, so please go back to the configuration and specify it.
If you really did mean to archive all the files in the workspace, please specify "**"
Finished: FAILURE
这个怎么解决啊 按你步骤 一步一步下来的
FATAL: Check your Xcode installation. Jenkins cannot retrieve its version.
Build step 'Xcode' marked build as failure
Finished: FAILURE 这个报错是我哪里没处理那 试了好多方法都没用
http://stackoverflow.com/questions/22375665/xcode5-1-xcrun-error-unable-to-find-utility-packageapplication-not-a-develo