美文网首页Tommy 的自留地@IT·互联网程序员
在 macOS 下用 Bamboo 实现可持续集成

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

作者: TommyLau | 来源:发表于2017-02-08 09:37 被阅读121次
    Xcode 8.2.1

    几经磨难以后,终于在 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 也介绍过好多次了,不了解的同学可以看这里

    一行命令搞掂。

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

    安装 Ruby

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

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

    更新 Ruby Gem 镜像

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

    $ 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 并不能很好的支持一些新的特性了。

    安装依然很简单很粗暴:

    $ gem install shenzhen
    $ ipa --version
    ipa 0.14.3
    

    自动化编译

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

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

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

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

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

    $ cd project
    $ ipa build
    Successfully built:
    /Users/builder/project/Project.ipa
    

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

    自动启动 Bamboo Agent

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

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

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

    <?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 安装说明一步一步操作就好了。

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

    $ 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
    

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

    $ 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 文件,收工。

    参考

    相关文章

      网友评论

        本文标题:在 macOS 下用 Bamboo 实现可持续集成

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