基于Jenkins 搭建的 iOS 持续集成实践总结

5,476 阅读4分钟

用 jenkins 有什么好处

  1. 通过规范化来完成,简单,繁琐,浪费时间的重复工作
  2. 规范化工作,以免出现低级错误
  3. 实现随时随地任何人一键构建
  4. ......

安装 jenkins

以 Mac 设备为例(Windows 步骤类似),帮你一步一步搭建好 jenkins。jenkins 属于 java 项目 依赖于 java,需要先安装 java jdk,具体安装方式请自行百度。

安装 jenkins 有常用的三种方式。

使用 pgk 安装包安装

官网 下载 pgk 安装包,使用安装器安装,按照流程安装即可。此安装方式会在 Mac 系统里创建一个名为 jenkins 用户,jenkins 服务就部署在这个用户下。

此种方式不推荐。

使用 war 安装

直接去官网下载 war 文件,并 cd 到 jenkins.war 所在目录,执行:

java -jar jenkins.war --httpPort=8080

war 包自带 jetty 服务器,以上命令会自动启服务器,并完成部署。

此种方式安装,会在当前用户的根路径下创建 .jenkins 隐藏文件,并产生多余的配置文件,需手动管理,且不方便卸载。

此种方式也不推荐。

使用 Homebrew 安装

Homebrew 作为 macOS 下的包管理器使用起来异常的简单快捷方便。 安装 Homebrew 之前, 首先安装 Command Line Tools for Xcode,命令如下:

xcode-select --install

Homebrew 依赖 Command Line Tools for Xcode,Xcode 命令行工具包含在 Xcode 中,如果 mac 设备已经安装 Xcode,请忽略此步。

安装完上面的编译依赖之后,通过下面的代码完成 Homebrew 的安装:

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

完成 Homebrew 安装。

可通过以下命令查看当前 Homebrew 管理的服务:

brew services list

使用 Hombrew 安装 jenkins,执行以下命令:

brew install jenkins

此步,Homebrew 会下载并安装自动完成所有依赖,包括 java。并会创建 ‘jenkins’ 命令。

同时,卸载 jenkins 的方式为:

brew uninstall jenkins

启动 jenkins 服务的方式为:

brew services start jenkins

使用此种方式启用 jenkins 服务支持后台运行,可以关闭终端工具。

也可以使用 jenkins 命令来启用 jenkins 服务。但此种方式不支持后台运行,关闭命令行工具,服务自动关闭。

另,常用命令还有:

重启 jenkins 服务的方式为:

brew services restart jenkins

停止 jenkins 服务的方式为:

brew services stop jenkins

通过此种方式安装,不会在系统中产生垃圾文件和多余的配置文件,所有的文件都是用 Homebrew 来管理,并且方便卸载。

此种方式强烈推荐。

如安以上方式安装后,localhost 打不开,可能的情况一般有:java jdk 未正确安装或配置,8080端口被占用,安装路径权限不够等等的问题,遇到这样的问题最好的办法是:卸载重装。不同的安装方式,卸载方式也会不同。具体可参看这个教程

另,也有如下方式操作 Jenkins 服务

http://localhost:8080/exit //停止服务

http://localhost:8080/restart //重启服务

http://localhost:8080/reload // 重新载入服务

配置 jenkins

创建用户

完成 jenkins 安装以后,在浏览器种打开 localhost ,会进入配置 jenkins 页面。

按照提示,找到/Users/Shared/Jenkins/Home/ 这个目录下,打开 initialAdminPassword 文件,复制出密码并填入,点击继续,进入安装插件页面。

建议选择 Install suggested plugins。

等待插件安装完成后,jenkins 会重启,等待重启完成后,会进入创建用户页面。

填写用户信息后,保存即可。请务必记住用户名和密码信息,否则重置用户信息非常麻烦。

安装插件

登录 http://localhost:8080 ,选择“系统管理”——“管理插件”,在“可选插件”中选中“GitLab Plugin”、“Gitlab Hook Plugin”、“Xcode integration"等常用插件,然后安装。

安装完成插件后,就可以新建项目了!

其他常用插件有:

Email Extension Plugin 该插件用于替换 Jenkins 自带的邮件发送,更加的强大。

Git Plugin 该插件允许使用GIT作为一个构建SCM(源代码控制管理系统)。

Post build task 该插件允许用户依据构建日志的输出执行一个shell/批处理任务。

Ruby Plugin 该插件允许用户在构建脚本中使用 Ruby。

Python Plugin 添加执行 Python 脚本作为Hudson的构建步骤。

Gradle Plugin 该插件允许Hudson调用Gradle构建脚本作为主体构建的步骤。

FTP-Publisher Plugin 该插件能上传项目构件和整个目录到一个FTP服务器。

Extended Choice Parameter plugin 该插件可以扩展参数化构建过程

Extended Choice Parameter Plug-In 该插件可以扩展参数化构建过程

Dynamic Extended Choice Parameter Plug-In 该插件可以扩展参数化构建过程

git parameter Plug-in 该插件可以扩展参数化构建过程

fir-plugin 该插件是 fir.im 分发平台提供的 jenkins 插件,用于上传安装包到 fir.im 平台。此插件安装方式与上面的插件安装方式不同,具体安装方式见文末。

新建项目

点击新建,在新建项目页面输入项目名称,选择“构建一个自由风格的软件项目”,然后进入配置页面

源码管理中 选择 Git ,填写仓库地址

如出现红色警告,说明 Jenkins 访问不了 Git 仓库,一般是因为没有权限导致。点击 Credentials 项的 Add ,在打开的 Jenkins Credentails Provider:Jenkins 页面,在 Username 和 Password 输入 Git 仓库的用户名和密码,完成添加。不必担心用户信息外泄,Jenkins 服务和所有配置都保存在本地。

还可以通过配置 Git SSH 的方式赋予 Jenkins 访问 Git 仓库的权限,按此方法较为麻烦,具体步骤略。

在 Branches to build 中设置 Branch Specifier 要构建的分支,默认为 master。

构建触发器中设置构建自动化的触发器。

其中 Build periodically,为定时 build,在日程表里设置 build 时间,如设置 00 20 * * * 表示每天 20 点执行定时 build。

Poll SCM (poll source code management) 轮询源码管理,表示在指定的时间点去轮询 Git 仓库,看是否有新的 commit,如有,则触发构建。如设置 0/5 * * * * 表示每5分钟轮询一次。

完成此步骤后,剩余的工作,皆可通过 Execute shell 脚本来执行。不同类型项目执行脚本不同。

脚本构建

以构建 iOS 的 SellerPlatform 迷橙商家端项目上传 fir.im 分发平台为例完成创建。

第一步 归档

archive.sh

`#! bin/bash

export LCALL=zhCN.GB2312; export LANG=zh_CN.GB2312

gitMessage=git log --pretty=format:"%s";

stringTag=${gitMessage%%】}; #%%[ 表示从右边开始,删除最后(最左边)一个 [ 号及右边的字符

debug="【Debug"; preRelase="【PreRelase"; relase="【Relase";

if [[ stringTag!=stringTag != debug && stringTag!=stringTag != preRelase && stringTag!=stringTag != relase ]] then exit 1 else echo "触发非参数化构建 暗号:$stringTag】" fi

echo ">>>>>>>>>>>>>>>>>>>开始构建项目,当前选择构建类型:" + BUILDTYPEecho">>>>>>>>>>>>>>>>>>>当前workspace"+BUILDTYPE echo ">>>>>>>>>>>>>>>>>>>当前 workspace " +WORKSPACE

if [ BUILDTYPE == "Release"\]; then xcodebuild archive -workspace WORKSPACE/SellerPlatform/SellerPlatform.xcworkspace -archivePath $WORKSPACE/build/SellerPlatform.xcarchive -sdk iphoneos -scheme SellerPlatform -configuration Release

else xcodebuild archive -workspace WORKSPACE/SellerPlatform/SellerPlatform.xcworkspacearchivePathWORKSPACE/SellerPlatform/SellerPlatform.xcworkspace -archivePath WORKSPACE/build/SellerPlatform.xcarchive -sdk iphoneos -scheme SellerPlatform -configuration Debug

fi

echo ">>>>>>>>>>>>>>>>>>>构建完成"

以上脚本实现的功能是:当在 git commit messge 里包含指定的标记号,即可完成对应标记号的构建。把控制权延伸到 git commit 操作里。

其中 【Debug】 代表打 debug 版本包,【PreRelase】代表打 preRelase 版本包,【Relase】代表打 relase 版本包。

首先,通过执行 git log --pretty=format:"%s" 命令,格式化输出 git commit log, 通过 %%】* 操作,是要拿到最后标记号【Debug】或【PreRelase】或【Relase】,如果拿到对应的标记号,则完成对应方式的构建。

另,Jenkins 会为每个工程项目创建一个本地目录空间,并提供了 $WORKSPACE 环境变量来直接访问。

第二步 签名

signature.sh

echo "开始签名"

xcodebuild -exportArchive -archivePath WORKSPACE/build/SellerPlatform.xcarchiveexportPathWORKSPACE/build/SellerPlatform.xcarchive -exportPath WORKSPACE/build -exportOptionsPlist $WORKSPACE/build/ExportOptions.plist -allowProvisioningUpdates

echo "ipa文件已生成"

echo "开始上传fir"

以上脚本实现的功能是:根据第一步归档出来的projectName.xcarchive 完成签名打包。

第三步 上传

首先,打开终端,安装 fir-clifir 的命令行工具,用于通过命令行上传安装包。 需要先装好 ruby 再执行

gem install fir-cli

上传打 fir 命令

fir publish ${ipa_path} -T fir_token -c "${commit_msg}"

upload.sh

echo ">>>>>>>>>>>>>>>>>>>开始上传到 fir" if [$BUILDTYPE == "Debug" ]; then

fir publish WORKSPACE/build/SellerPlatform.ipaTWORKSPACE/build/SellerPlatform.ipa -T token --password rose888 -c $CHANGELOG

elif [ $BUILDTYPE == "PreRelease" ]; then

fir publish WORKSPACE/build/SellerPlatform.ipaTWORKSPACE/build/SellerPlatform.ipa -T token --password rose888 -c $CHANGELOG

else

fir publish WORKSPACE/build/SellerPlatform.ipaTWORKSPACE/build/SellerPlatform.ipa -T token --password rose888 -c $CHANGELOG

fi

echo ">>>>>>>>>>>>>>>>>>>上传成功啦"

至此,就完成了持续集成的流程。

完成后建构,还可以通过 Email Extension Plugin 插件,邮件通知到相关人员。还可以定制邮件内容。在邮件内容里,还可以放置二维码,方便下载安装。

更进一步,参数化构建

参数化构建,顾名思义,就是可以指定构建参数,完成高度可定制化构建。

首先,需要安装 git parameter Plug-in 插件,然后项目配置页面,在 General 中,选中‘参数化构建过程’,然后选择 git parameter。如图所示:

设置 name 为 git_branch,即为变量名,然后 Parameter type ,就是 选择 branch/tag/branch or tag 三种类型,在源码管理中 Branches to build 中设置 Branch Specifier 为 $git_branch 。即可完成自定义分支构建。

同样,可以设置构建的版本类型。在构建的时候,进行选择。在此不再赘述。

fir-plugin 安装与使用

在上面的例子里,使用的是 fir.im 提供的命令行工具完成后建构的上传,也可以通过 fir-plugin 插件来完成上传。

安装

首先去下载插件 。然后,进入"系统管理"->"管理插件"->"高级"->"上传插件"

选择已下载好的 fir-plugin.hpi 插件,点击上传。

安装完成后重启服务。

使用

构建后操作 选择"Upload to fir.im",并添加 api token 并校验

立即构建项目,成功之后,在工程里的 Console Output 中有如下日志

说明成功了。

其他配置

内网访问

首先,拿到 jenkins 服务器所在设备上的内网 IP,执行如下命令可获得

ifconfig en0

进入"系统管理"->"系统设置" 找到 Jenkins Location 在 Jenkins URL 中设置地址,并加上端口号,格式如:172.0.0.1:8080/,然后保存。重启服务,内网其他设备输入地址即可访问。

当其他设备不能访问时,一般原因有:jenkins 服务器没启动,设备处于休眠模式,设备内网 IP 被重新分配。

觉得不错的话,欢迎关注我的公众号哦!