搭建MacOS服务器持续构建环境

iMac

前言

终于买了黑苹果主机,拿来当 MacOS 服务器了,主要用于移动端的持续构建。接下来我会先安装环境,然后安装必要的软件,接着做内网穿透,最后搭建 Jenkins 环境。这篇文章就记录一下,从一台出厂的黑苹果主机到拥有可持续构建环境的服务器的过程。

安装环境

Homebrew

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

RVM

1
2
$ curl -L get.rvm.io | bash -s stable
$ rvm install 2.4 # 更新Ruby

OpenSSL

1
2
3
$ brew install openssl
# 使用 homebrew 安装的 openssl 代替系统自带的
$ sudo ln -s -f /usr/local/Cellar/openssl/1.0.2l/bin/openssl /usr/bin/openssl

Nginx

1
$ brew install nginx

Jenkins

1
$ brew install jenkins

Java JDK8

去官网下载,直接安装,无须手动配置环境变量等。

Maven

1
$ brew install maven

MySQL

1
$ brew install mysql

Tomcat

1
$ brew install tomcat

Bundler

1
$ sudo gem install -n /usr/local/bin bundler

CocoaPods

1
2
3
4
5
6
7
# 更换Ruby镜像,移除现有的Ruby镜像
$ gem sources --remove https://rubygems.org/
# 添加国内最新镜像源(淘宝的Ruby镜像已经不更新了)
$ gem sources -a https://gems.ruby-china.org/
# 安装
$ sudo gem install -n /usr/local/bin cocoapods
$ pod setup

Fastlane

1
$ sudo gem install -n /usr/local/bin fastlane

Fir-cli

1
$ sudo gem install -n /usr/local/bin fir-cli

Xcode-select

1
$ xcode-select --install

Gradle

1
$ brew install gradle

发现下载的是最新的4.1版,而目前项目却需要3.3版。

解决办法:去 https://services.gradle.org/distributions/ 下载合适的版本。
我下了 3.3-all 的版本,最后将解压后的文件放到 /usr/local/Cellar/gradle/ 即可。

还有另外一种最方便的指定版本下载的方法是用 sdkman:

1
2
$ curl -s https://get.sdkman.io | bash
$ sdk install gradle 3.3

不过我还是希望尽可能全都使用 Homebrew 去管理环境依赖,所以就还是用上面的方法。

安装软件

  • Xcode
  • TeamViewer

Xcode 是 iOS 构建必须要有的软件,而 TeamViewer 其实可有可无,我把它作为最后一道防线,当 frp 的隧道因为某种特殊原因断开的时候,可以远程连上服务器,去查看问题并解决。

内网穿透

使用 frp,下载 MacOS 平台对应的 Release 包:
https://github.com/fatedier/frp/releases/download/v0.13.0/frp_0.13.0_darwin_amd64.tar.gz

关于 frp 的配置,可以看我之前写的一篇文章:《frp端口映射穿透内网》,这里就不多说了。

搭建Jenkins

启动

手动启动

1
$ java -jar jenkins.war

后台运行(指定端口)

1
$ nohup java -jar jenkins.war -httpPort=8888 &

设置开机自启动

1
$ sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist

取消开机自启动

1
$ sudo launchctl unload -w /Library/LaunchDaemons/org.jenkins-ci.plist

管理插件

插件 说明
Xcode integration iOS专用
Keychains and Provisioning Profiles Management 签名证书管理插件
Hudson Post build task 脚本插件
build-name-setter 修改Build名称
description setter plugin 修改Build描述(二维码)
Git Changelog 获取git仓库提交的信息
Environment Injector Plugin 自定义全局变量
Email Extension Template Plugin 自定义邮件插件
Cobertura Plug 显示代码测试覆盖率报表
Junit Plugin 展示生成的单元测试报表,支持一切单测框架,如 junit、nosetests 等

系统设置

选择 系统管理 - 系统设置,进入系统设置界面,可以管理全局属性、配置邮件通知。

添加环境变量

全局属性下面,勾选 Environment variables,增加以下键值对。

Key Value
LANG zh_CN.UTF-8
PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin (终端中执行 echo $PATH 命令的输出)
ANDROID_HOME /Users/bingo/Library/Android/sdk (安卓sdk目录)

配置SSH密钥

  • 生成服务器 SSH 公私钥
  • 把公钥部署到 Coding 项目或者个人公钥上

构建项目

新建项目

一般选择自由风格,JavaEE 则选择 Maven 项目。

源码管理

使用 Git,最好用 ssh 地址,因为老版本的 git 可能还不支持 HTTPS,需要升级 git 版本。直接使用 ssh 地址,Credentials 选刚保存的私钥即可。

Branch Specifier 选定一条分支,最好确定一条分支是专门构建发布的,配合 git flow,例如 build 或者 release 分支。

构建触发器

先不管 webhook,直接 Poll SCM,轮训,日程表设置* * * * *,代表1分钟轮训一次,如果有新的 commit,就触发构建。

构建环境

下面演示一下 iOS 的构建配置。

原本 iOS 需要选 Keychains and Code Signing Identities 和 Mobile Provisioning Profiles,但是我最讨厌的就是这些繁琐的配置,之前还因为这些步骤拒绝使用 Jenkins。没错,我现在依然是拒绝的,签名依然不用 Jenkins 来做,由 fastlane 来完成。

所以,这一步,直接跳过

构建

增加构建步骤,选择 Execute shell,在 Command 中,执行 fastlane 打包脚本。

1
2
3
#!/bin/bash
bundle update
bundle exec fastlane adhoc

由于我打包的任务都已经由 fastlane 的 gym 去完成,签名也由 fastlane 的 sign 去完成,所以不需要使用 Jenkins 的 Xcode 的插件。

上传内测包分发的脚本也放在 fastlane 里,是在 fastlane 里执行了 fir-cli 的上传命令,所以也不需要使用 Jenkins 的 fir-cli 的插件。

构建后操作

简单地配一下 Editable Email Notification 即可,发邮件通知,比较灵活,自由发挥。

最后保存,就可以开始构建了。

后话

这里我只搭建了所需要的环境,以及简单演示了 iOS 的构建配置流程,当然还需要配合 fastlane,因为 fastlane 是面向项目操作的,不是面向服务器的,所以这篇文章没有提及。我还在研究 Jenkins 参数化构建等的玩法,之后会再抽一篇文章专门来写 Android、iOS、JavaEE 等项目的持续构建。

对于 JavaEE、Android 来说,Java 的跨平台做得很好,构建就太简单了,用 Gradle、Maven 等就可以很轻松方便地完成构建任务。而像 iOS 的 Cocoa 根本不开源,被封闭在 Mac 这个生态里,理所应当也要找跟前者类似的工具来完成构建任务,而不是傻傻的继续用 Xcode 的插件,fastlane 就是我的选择。

接下来每一个项目,只需要在 Jenkins 后台管理系统中去简单地操作就行了,不需要直接操作服务器了。所以,这就是个一劳永逸的过程。

  • 本文作者: Bingo
  • 本文链接: https://blog.bingo.ren/57.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!