使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成

编写于 2014-12-29

这篇博客主要讲解如何用 xcodebuild 命令行打包,利用 Jenkins 做持续集成,以及使用 Mac 自带的 Apache 服务将 ipa 存放的目录分享出去。

Xcodebuild 打包

命令的基础使用

只要安装了 Xcode , 就可以在命令行里使用 xcodebuild 命令进行打包。
假设我有个需要打包的工程 BuildDemo ,在个人( mark )目录下。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

我现在想把它打包成 ipa 格式的文件则需要打开终端。
首先进入项目:

cd BuildDemo/

打包成 .xcarchive 到 buildserver 目录下

xcodebuild -archivePath "/Users/mark/buildserver/BuildDemo.xcarchive" -workspace BuildDemo.xcworkspace -sdk iphoneos -scheme "BuildDemo" -configuration "Debug" archive

由于我这个项目只是个简单的 project 并没有 workspace 所以命令需要去掉 -workspace BuildDemo.xcworkspace 这个参数。执行后会产生 log , 下图为一部分

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

打包后可以看到指定文件夹下有我们刚才生成的 xcarchive 文件

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

然后我们开始打包成 ipa 文件
使用命令

xcodebuild -exportArchive -exportFormat IPA -archivePath "/Users/mark/buildserver/BuildDemo.xcarchive" -exportPath "/Users/mark/buildserver/BuildDemo.ipa"

执行后依旧生成 log , 最后是 ** EXPORT SUCCEEDED **

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

使用 xcodebuild 生成 ipa 文件就完成了。

指定 Configuration 和配置文件来生成 IPA 文件

有的时候我们不仅仅是简单的设置 configurationDebugRelease ,可能还有 AdHoc 版啊, Inhouse 版去给用户或者测试使用。这时候需要我们在项目中去配置更多的 configuration

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

点击箭头所在的地方我们可以添加比如 Debug.Inhouse Release.Adhoc Release.Inhouse

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

我们需要在 targetbuildsettings 中去指定不同的配置,比如代码签名和配置文件

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

或者是针对不同版本指定不同的宏, BundleIDBundleDisplayName 等等。

然后我们使用 xcodebuild 时可以生成不同版本的 xcarchive 以及 ipa 文件了,举个例子,比如我想根据 Adhoc 的配置去打包则命令如下

xcodebuild -archivePath "/Users/mark/buildserver/BuildDemo.Adhoc.xcarchive" -sdk iphoneos -scheme "BuildDemo" -configuration "Release.Adhoc" archive

xcodebuild -exportArchive -exportFormat IPA -exportProvisioningProfile "指定的配置文件名称" -archivePath "/Users/mark/buildserver/BuildDemo.Adhoc.xcarchive" -exportPath "/Users/mark/buildserver/BuildDemo.Adhoc.ipa"

打包完成

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

注意: 如果你的 workspace 使用了 CocoaPods 那么需要也为你的 Pods 工程添加 configuration ,下图为我为其他 workspace 添加的 configuration

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

Jenkins CI

Java 环境

Jenkins 需要 Java 环境来运行,如果没有需要自行下载。

安装 JDK 8 可能会遇到的问题

安装 JDK 8 可能在一开始提示: “This Installer is supported only on OS X 10.7.3 or Later”,这是由于安装包中的一个函数发生了错误,我们需要将函数修改后重新打包。

流程:

  1. 打开下载好的 jdk 安装包的 DMG .这时候你会在 finder 左侧能看到已经被挂上了。

  2. bash 中运行:pkgutil –expand /Volumes/JDK\ 8\ Update\ 05/JDK\ 8\ Update\ 05.pkg /tmp/jdk8.unpkg (解释:通过 pkgutil 命令把刚刚下载好的 dmg 解压开来,存放到 /tmp/jdk8.unpkg 这个目录中去。)

  3. 走入到 /tmp/jdk8.unpkg 目录中去。你可以通过 finder 也可以通过终端命令进入。

  4. 找到目录下的 Distribution 文件,用vim或者是编辑器 (open -e) 打开。

  5. cmd+f找到里面的 pm_install_check 这个函数。

     function pm_install_check() {
       if(!(checkForMacOSX('10.7.3') == true)) {
         my.result.title = 'OS X Lion required';
         my.result.message = 'This Installer is supported only on OS X 10.7.3 or Later.';
         my.result.type = 'Fatal';
         return false;
       }
       return true;
     }
    

    修改成:

     function pm_install_check() {
       return true;
     }
    

    保存。

  6. 然后我们重新打包。命令如下:
    pkgutil –flatten /tmp/jdk8.unpkg/ /tmp/jdk8.pkg

  7. 打开 /tmp/jdk8.pkg 文件。
    open /tmp/jdk8.pkg 或者是从 finder 中找到并点击打开,你就会发现可以正常安装了。

下载运行 Jenkins

去 Jenkins 官网下载 Web Archive (.war)

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

下载后进入该 .war 目录执行

java -jar jenkins.war --httpPort=9000

这个 http 端口 9000 可以根据情况自由指定。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

看到红色标识的 log 标明 Jenkins 服务已经运行。

打开浏览器,输入 localhost:9000 可以看到

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

配置服务

一开始我们可以做一些基础配置

点击左侧的系统管理

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

最上面有个执行者数量表示可以同时执行的 Build 数,同时 Build 同一个项目可能会发生一些问题,我会将其更改为1,其他触发的 Build 则会加入到队列中等待之前的 Build 完成才开始构建。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

这里设置 Jenkins 的 URL 以及系统管理员的邮箱。在公司里可能我们需要一台机器专门进行持续集成,那么需要这台机器手动指定 IP ,邮箱则是可以在构建失败的时候,将失败的 Log 发送到指定的开发人员邮箱中,让开发人员得知 svn 或者 git 等代码 Build 会有问题。不过我们需要指定 SMTP 地址,系统管理员的邮箱也需要开通 SMTP 服务。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

设置完成后可以勾选 通过发送测试邮件测试配置 来先尝试发送一个测试邮件。

添加一个构建

在首页我们点击添加一个新的构建

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

填写构建的名称及类型,这里勾选的是自由风格的软件项目。创建完成后进入该构建的详细配置界面。我们首先要指定要构建的项目的根目录,以及是否使用 SVN 或者 GIT 进行源码管理。如果指定 svn 的话,每次构建将会先使用你指定的步骤去 svn 进行 svn up (或者其他你指定的步骤) 对代码进行更新后再进行构建。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

然后我们可以选择执行的触发条件,比如你想每周一到周五,早上九点到下午六点,每二十分钟进行一次触发构建,那么可以按下面进行填写。具体的语法格式可以点击右侧的问号查询。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

注意的是,如果采用了源码管理,如果这个期间没有版本更新,则不会继续进行构建。

下面添加构建步骤, Mac 下我们则选择 shell 来执行步骤命令。然后将我们之前的 xcodebuild 指令直接拷贝到这个步骤里就可以,两步即可完成 ipa 的生成。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

如果你想执行一些定制化的构建,可以使用一些自己编写或开源的脚本,比如 Facebook 的 xctool : https://github.com/facebook/xctool

在构建中我们可以加入一些参数。点击 command 下的查看环境变量的参数列表。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

可以看到有 build_id 对应构建时间, svn 版本号等等。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

然后是添加邮件通知。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

每次构建失败时会发送构建失败的邮件到指定邮箱中。之后保存即可。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot
《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

保存后我们对这个项目进行立即构建,很快发现构建完成时状态是红色,这次构建失败了。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

进入这次构建,选择查看控制台输出可以查看整个构建过程的日志。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

同时,这次失败的构建也会给我们发送邮件。查看邮件中的日志我们发现项目中并不存在 “BuildDemo.xcworkspace”

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

原来在命令中多了一个 workspace 的参数,而这个项目中并不存在,于是把这个参数删除并再次进行构建。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

完成后发现在指定目录下多了 BuildDemo_2.ipa 的文件。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

同时 jenkins 会发送一个构建回复正常的邮件到之前指定的邮箱中。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

Jenkins 基础的配置及构建就进行完成,由于支持中文,使用起来并不困难,其余的功能可以自己进行了解。

Apache 分享文件目录

启动 Apache

Mac 下自带 Apache 服务,所以并不需要很多的步骤,只要打开终端 $ sudo apachectl start 即可以启动。

暂停 : sudo apachectl stop
重启 : sudo apachectl restart

分享目录

如果你的系统是 Yosemite ,则需要对 apache 的 httpconfig 进行一些修改才可以分享个人目录。

找到下面的位置,改成想分享出去的指定目录。
并添加 “Indexes”

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

如果没有权限更改上述文件,简单的可以先拖到桌面上来进行修改然后放回之前位置覆盖即可。

更改完成后重启 apache 服务。

然后我们再访问 localhost 或 127.0.0.1 就可以发现可以访问指定的文件夹下的文件了。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

这些 ipa 可以直接点击下载即可。由于在公司中可能指定机器的 ip 会更换,可以通过更改网络偏好配置来设置手动 ip 。这样以后其他人就可以通过指定的 ip 来直接访问这个文件目录了。每次构建完成后,每个人都可以自己打开浏览器下载最新的 ipa 即可。

《使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成》 screenshot

至此,使用 xcodebuild + jenkins + apache 来做 ios 项目基本的持续集成步骤已经全部完成。

— EOF —

欢迎提出建议,个人联系方式详见关于

    原文作者:Hanran
    原文地址: https://www.jianshu.com/p/fd22bb5c01e5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞