搭建MacOS服务器持续构建环境
# 前言
终于买了黑苹果主机,拿来当 MacOS 服务器了,主要用于移动端的持续构建。接下来我会先安装环境,然后安装必要的软件,接着做内网穿透,最后搭建 Jenkins 环境。这篇文章就记录一下,从一台出厂的黑苹果主机到拥有可持续构建环境的服务器的过程。
# 安装环境
# Homebrew
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# RVM
$ curl -L get.rvm.io | bash -s stable
$ rvm install 2.4 # 更新Ruby
2
# OpenSSL
$ brew install openssl
# 使用 homebrew 安装的 openssl 代替系统自带的
$ sudo ln -s -f /usr/local/Cellar/openssl/1.0.2l/bin/openssl /usr/bin/openssl
2
3
# Nginx
$ brew install nginx
# Jenkins
$ brew install jenkins
# Java JDK8
去官网下载,直接安装,无须手动配置环境变量等。
# Maven
$ brew install maven
# MySQL
$ brew install mysql
# Tomcat
$ brew install tomcat
# Bundler
$ sudo gem install -n /usr/local/bin bundler
# CocoaPods
# 更换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
2
3
4
5
6
7
# Fastlane
$ sudo gem install -n /usr/local/bin fastlane
# Fir-cli
$ sudo gem install -n /usr/local/bin fir-cli
# Xcode-select
$ xcode-select --install
# Gradle
$ brew install gradle
发现下载的是最新的4.1版,而目前项目却需要3.3版。
解决办法:去 https://services.gradle.org/distributions/ 下载合适的版本。
我下了 3.3-all 的版本,最后将解压后的文件放到 /usr/local/Cellar/gradle/
即可。
还有另外一种最方便的指定版本下载的方法是用 sdkman:
$ curl -s https://get.sdkman.io | bash
$ sdk install gradle 3.3
2
不过我还是希望尽可能全都使用 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
# 启动
# 手动启动
$ java -jar jenkins.war
# 后台运行(指定端口)
$ nohup java -jar jenkins.war -httpPort=8888 &
# 设置开机自启动
$ sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist
# 取消开机自启动
$ 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 打包脚本。
#!/bin/bash
bundle update
bundle exec fastlane adhoc
2
3
由于我打包的任务都已经由 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 后台管理系统中去简单地操作就行了,不需要直接操作服务器了。所以,这就是个一劳永逸的过程。