美文网首页我的专题ToolsiOS 伪组件专题
史上最全Jenkins+SVN+iOS+cocoapods环境搭

史上最全Jenkins+SVN+iOS+cocoapods环境搭

作者: hansfeng | 来源:发表于2017-04-06 09:23 被阅读2216次

    前言


    持续集成是敏捷开发中重要的一部分,为保证新功能的开发,又保证旧功能的维护,从一个冲刺到下个冲刺。持续集成工具是我们保证开发和维护并行的护航者,现在流行的集成工具有很多,例如:

    1.Jenkins

    2.Buildbot

    3.Travis CI

    经过对比,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安装都很简单,安装过程这里就省略了。

    JDK

    2.搭建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账号和密码。假如这栏没有报红,基本上地址什么的都是正确的了。

    配置svn

    3.构建环境

    接下来配置构建环境,这里我们勾选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勾上

    大家可以把遇到的问题留言,我们共同解决

    相关文章

      网友评论

      • 杨国泰:Using sole credentials yanggt/****** in realm ‘<http://192.168.101.110:80>; Authorization Realm’
        [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
        这脚本报错 找不到原因 大神求救
        杨国泰:@hansfeng 谢谢大神 已经成功打出ipa 还有个问题 打出的ipa 用什么方法上传至svn ? SVN Publisher plugin 这个插件 好像没得下载了!
        hansfeng:@杨国泰 报错说找不到你的文件,你对比下文章关联文件那块
      • CocoLeo:/Users/Shared/Jenkins/tmp/jenkins3504667797147414929.sh: line 6: cd: /Users/Shared/Jenkins/Home/workspace/差客Test/shanglv51: No such file or directory
        CocoLeo:一直设置workspace 一天了,还有那几个目录文件,都设置不上,请教一下如何配置啊 救急!
      • 用回忆下酒:大大请问这个该如何处理 我加了用户可以访问这台电脑
        + 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
      • 羊子222:楼主,麻烦问一下 有没有遇到过这个问题啊,下面安装不了的地址是写在 podfile 里面的私有库。

        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`.
      • 领头羊的幸福生活:楼主你好 ,我用Jenkins的svn拉下来的代码 framework是空的,这是什么原因呢
        hansfeng:@领头羊的幸福生活 可以的,配置下输出路径
        领头羊的幸福生活:@hansfeng 可以将Jenkins里面的ipa包用命令行拷贝到指定目录下吗
        hansfeng:@领头羊的幸福生活 得配置脚本,文中有提到
      • Alger_梁:No global development team or local team ID was configured. 请问您与碰见这个问题吗
        hansfeng:@青青是老大要听青青话 这是证书问题…
      • DamonYYB:No profiles for 'com.xxx.xxx' were found: Xcode couldn't find a provisioning profile matching 'com.xxx.xxx'. Code signing is required for product type 'Application' in SDK 'iOS 10.3' 请问是什么原因? 找了很久都没找到
        hansfeng:@DamonYYB 把你的证书和描述文件拷贝到Jenkins用户下看能不能打包
        DamonYYB:@hansfeng 确认是对的 证书和描述文件 我把本地的全部证书和描述文件都删了 重新导入的证书,描述文件也是xcode 编译的时候生成的新的描述文件
        hansfeng:@DamonYYB 证书或者描述文件错误了,重新配置
      • 秒赞不是偶然:xcodebuild: error: The flag -scheme is required when specifying -archivePath but not -exportArchive. 请问这个问题 是什么意思
        hansfeng:@秒赞不是偶然 pod 的不需要设置
        秒赞不是偶然:@hansfeng 设置了。pod 是所有的都设置吗
        hansfeng:@秒赞不是偶然 target设置一下share试下
      • Zd_silent:楼主你好,我在构建版本的时候失败,提示如下
        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
        你知道什么原因么?
        1条大菜狗:楼主遇到一个难以解决的问题了,能帮忙指导一下嘛
        hansfeng:@Zd_silent 应该是描述文件配置错误了,检查下Keychains and Provisioning Profiles Management配置和查看xcode build里面对应的地方
      • wangbobo:你好,我在一台 Mac 上部署 jenkins,然后在另一台 Mac 上可以触发构建吗?
        hansfeng:@wangbobo 可以的,映射jenkins地址出去,保持部署的mac开机状态能够访问就行了
      • 会疼的白痴:The following build commands failed:
        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天了,还没解决,求帮忙
        hansfeng:@会疼的白痴 还是pods的问题,检查下你Jenkins用户下有没有cocoapods,去那边pod一下看能不能运行,如果能就是Jenkins配置错误了
      • 不是好程序:/Users/mini5/Desktop/SmartHomeV6Code_IOS/SmartHomeV6/PrefixHeader.pch:18:9: fatal error: 'AFNetworking.h' file not found
        #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打包没问题,有时间帮忙看下?
        不是好程序:@hansfeng pod是成功的还是这个错误,我现在项目不使用git使用本地项目打包还是报这个错,感觉可能与配置有关,但也不知是哪里?
        hansfeng:@不是好程序 这是pod的错误,看下我文章里面的方法
      • 戎码一生为了谁:你好,方便交流一下么,看到你的简书文章有几个小问题卡住了,想问下,我的QQ:303757045,麻烦看到的话加我一下,比较着急,谢谢啦
      • 黄卷青灯空离别:Going to invoke xcodebuild:, scheme: /Users/Shared/Jenkins/Home/workspace/METEST/, sdk: DEFAULT, workspace: /Users/Shared/Jenkins/Home/workspace/METEST/mejinrong, configuration: Release, clean: YES, archive:NO, symRoot: DEFAULT, configurationBuildDir: /Users/Shared/Jenkins/Home/workspace/METEST/build, codeSignIdentity: DEFAULT
        [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

        这是什么原因啊 始终找不到问题
        hansfeng:@黄卷青灯空离别 1.检查一下scheme是否share。2.scheme路径是否写错了
      • 这个汤圆没有馅:构建项目失败,报错是【FATAL: Unable to unlock the keychain.】,说loginkeychain not found。请问这是什么原因呢?我是按博主的步骤下来的
        hansfeng:检查一下有keychain路径的地方。1.Keychains and Provisioning Profiles Management配置,2.查看xcode build里面的钥匙串路径。3.检查一下钥匙串密码
      • 凉风有性:Build step 'Xcode' marked build as 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
        这个怎么解决啊 按你步骤 一步一步下来的
        hansfeng:@凉风有性 这是权限问题,你可以把证书拷贝到Jenkins用户下,然后放到要是串中,在Jenkins用户下编译一次,其中编译过程会向你请求访问权限
        凉风有性:xcrun: error: unable to exec Xcode native xcrun (Permission denied).
        FATAL: Check your Xcode installation. Jenkins cannot retrieve its version.
        Build step 'Xcode' marked build as failure
        Finished: FAILURE 这个报错是我哪里没处理那 试了好多方法都没用
        hansfeng:应该是svn的路径错误了,路径精确到iOS项目
      • 我是大杯具:楼主你好,我配置好证书和配置文件后,构建时提示No signing certificate "iOS Development" found: No "iOS Development" signing certificate matching team ID "XXXXXX" with a private key was found.,但是这个XXXXXX对应的只有distribution的证书ID,developer证书没有对应这个teamID的,我新创建的也无法匹配这个XXXXXX的team ID,请问应该怎么解决呀?
        hansfeng:@我是大杯具 应该不是构建设置的问题,看一下这个
        http://stackoverflow.com/questions/22375665/xcode5-1-xcrun-error-unable-to-find-utility-packageapplication-not-a-develo
        我是大杯具:@hansfeng 谢谢楼主,确实是因为证书问题,现在已经buildSuccess了,但是xcrun报xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH,请问应该增加什么构建设置吗?
        hansfeng:这个是证书的问题,应该与team无关,你看下/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles 下有没有你的描述文件,然后检查一下证书名字是否正确,再去检查一下系统管理->keychain and Provisioning Profiles 路径有没有写错
      • 9e51517211ce:cocoapods 一直更新不下来,有什么好的办法呢?
        hansfeng:如果不用Jenkins可以正常pod吗?如果可以的话进注销当前用户,进去Jenkins用户看Jenkins用户下的cocoapods是否正常

      本文标题:史上最全Jenkins+SVN+iOS+cocoapods环境搭

      本文链接:https://www.haomeiwen.com/subject/ipiiottx.html