在 macOS 下用 Bamboo 实现可持续集成

几经磨难以后,终于在 KVM 中跑起了 macOS 虚拟机

当初答应过大家会做一个自动化编译的后记,说到做到。还是老样子,继续使用 Atlassian 全家桶配套的 Bamboo 来做可持续集成。

准备工作

在进入正题之前,我们需要做以下的准备工作:

  • 安装 Xcode
  • 安装 Brew
  • 安装 Ruby
  • 安装 Shenzhen

安装 Xcode

这个没有什么好说的了,Mac App Store 直接下载安装。如果是公共服务器,不想用自己的 Apple ID 登录的话,也可以登录 Apple Developer 网站下载。

Stack Overflow 有个不错的回答,大家可以参考下:http://stackoverflow.com/questions/10335747/how-to-download-xcode-4-5-6-7-8-and-get-the-dmg-or-xip-file?answertab=votes#tab-top

安装 Brew

Brew 也介绍过好多次了,不了解的同学可以看这里

一行命令搞掂。

1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装 Ruby

为了不破坏系统自带的 Ruby,我还是习惯性安装一个新版本的,另外升级什么的也比较方便。

1
2
3
$ brew install ruby
$ ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]

更新 Ruby Gem 镜像

官方的镜像经常无法访问或者出现各种各样的异常,所以使用 Ruby China 的镜像就好了。

1
2
3
4
5
$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
$ gem sources -l
*** CURRENT SOURCES ***

https://gems.ruby-china.org

今天写文章才发现,原来的大阿里淘宝镜像也合并到 Ruby China 了,有意思。

安装 Shenzhen

Shenzhen 并不是我们理解的深圳市,而是一个基于 Xcode 6 API 的命令行编译工具。嗯,好像 Xcode 6 是有点旧了……

写这篇文章的时候发现了一个新的叫做 gym 的东东,看来稍后要有新的东西研究了,毕竟现在都开始往 Swift 3 迁移了。似乎 Shenzhen 并不能很好的支持一些新的特性了。

安装依然很简单很粗暴:

1
2
3
$ gem install shenzhen
$ ipa --version
ipa 0.14.3

自动化编译

这个步骤比较啰嗦和繁琐,但是基本上都是基于 Apple 的要求。

简单说,就是参考其他文章生成签名的证书或者是导入已有证书。

然后打开需要自动化编译的项目,配置好 Team 和 Bundle ID。

有了 Shenzhen 这个工具,我们只需要一个命令行就可以解决编译的问题了。

命令行进入项目目录,运行 ipa build 命令来编译 iOS App:

1
2
3
4
$ cd project
$ ipa build
Successfully built:
/Users/builder/project/Project.ipa

就是这么简单,就可以命令行编译 iOS 的应用了。

自动启动 Bamboo Agent

最后是配置 Bamboo Agent,好让 Bamboo Server 可以把任务发到 Mac 上编译。

之前都是先启动好 Mac,然后登录,然后开终端,手动运行 Bamboo Agent,但是这个真的是太傻缺了。

所以新搭建的环境,要再自动化一点。看了下文章,编写了如下配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.atlassian.bamboo-agent</string>
<key>ProgramArguments</key>
<array>
<string>/Users/builder/bamboo-agent-home/bin/bamboo-agent.sh</string>
<string>console</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceDescription</key>
<string>Atlassian Bamboo Agent for macOS</string>
<!--
<key>StandardErrorPath</key>
<string>/Users/builder/bamboo-agent-home/logs/bamboo-agent.err</string>
<key>StandardOutPath</key>
<string>/Users/builder/bamboo-agent-home/logs/bamboo-agent.out</string>
-->
<key>KeepAlive</key>
<true/>
<key>UserName</key>
<string>builder</string>
<key>SessionCreate</key>
<true/>
</dict>
</plist>

将该文件保存为 com.atlassian.bamboo-agent.plist 便可,当然也可以是你自己喜欢的名字。

注意:这里的 SessionCreate 一定要加,否则 security cms 无法提取 provisioning 文件中的信息,一直报 write permission 错误,导致无法正确签名,这里查了好久。
另外注释了两个 log 输出,因为 Bamboo Server 本身也会记录,有需要的可以自行打开。

在设置守护进程之前,记得务必要先用 builder 用户单独运行一次 Bamboo Agent,以便生成用户目录下的 bamboo-agent-home 目录。相关的操作直接按照 Bamboo Server 上 Remote Agent 安装说明一步一步操作就好了。

最后把写好的配置文件扔到系统守护进程目录里面,并启动之:

1
2
3
$ sudo mv com.atlassian.bamboo-agent.plist /Library/LaunchDaemons/
$ sudo chown root:wheel /Library/LaunchDaemons/com.atlassian.bamboo-agent.plist
$ sudo launchctl load /Library/LaunchDaemons/com.atlassian.bamboo-agent.plist

检查一下看看是不是已经在运行了:

1
2
$ ps aux | grep bamboo
builder 43 0.0 0.1 2442612 2324 ?? Ss 11:55AM 0:00.03 /bin/sh /Users/builder/bamboo-agent-home/bin/bamboo-agent.sh console

一切正常,在 Bamboo Server 上配置一个 Plan,运行一下编译,成功生成 IPA 文件,收工。

参考