iOS 使用Jenkins持续集成(简称CI)
- 安装Jenkins工具
1.1. 可可通过官网下载并安装Jenkins官方版本
1.2. 使用Homebrew命令完成软件的安装
安装Homebrew
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2. 安装Jenkins
$ brew install jenkins
3、启动Jenkins
$ jenkins
注:此处补充说明了一些额外的信息
正常情况下,在浏览器中输入 http://localhost:8080/, 就能成功启动 Jenkins 环境, 如果用户更换了端口, 则应使用最新的那个端口号继续连接. 在完成 Jenkins 登录后, 会引导您进入一个填写密码的页面(如下图所示), 密码存储的位置位于图片中标注的那一行红色字体处.

将获取的password赋值给Administrator password变量,并点击其左侧以完成身份验证操作;随后,在左侧功能列表中选择并安装一至多个推荐功能;在安装过程中,请注意部分插件在初次安装时可能出现问题;遇到无法正常安装的情况时,请尝试点击右下角的"重新尝试"按钮;直至所有推荐的功能均成功安装

安装完成后可能不会直接跳转至目标页面。您可以尝试以下方法:首先点击刷新按钮后返回至当前页面,在返回页面后进行注册操作,请在此处输入您的用户名和密码信息。建议在此处点击带有蓝色标记的保存按钮完成操作。
- 安装Jenkins plugin
如果您希望使用Jenkins plugin来构建项目,请先从可选功能中选择所需的 plugin 进行安装。然后,在开始新建项目之前,请从选项菜单中选择所需的功能模块,并完成相应的安装步骤。
Git Parameter
这是一个参数构建扩展,可以在构建的时候选择git的某一个分支来构建服务。
Git Parameter
官方地址:http://wiki.jenkins-ci.org/display/JENKINS/Git+Parameter+Plugin
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:在参数化构建步骤当中,可添加Git的branch或者tag来作为参数进行构建。
Active Choices
官方地址:https://wiki.jenkins.io/display/JENKINS/Active+Choices+Plugin
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:根据所选参数,自动调出对应参数所依赖的后续参数。
我们今天使用Execute shell Shell脚本构建工程
jenkins的使用
3.1. 构建一个自由风格的软件项目

3.2. General参数

该包支持设置保存期限和最大存储数量;其中包含‘保存期限’和‘最大存储数量’两个参数项;这两个参数项都是可选配置项。
在Jenkins环境中设置多个项目时,在构建过程中使用Extended Choice Parameter插件可以在配置界面中提供多选组件供用户选择所需的模块。




3.3. 源码管理


3.4. 配置触发器参数 触发器具备多种可调节的参数设置,在项目需求分析阶段可以选择是否进行某些功能的配置
- 定时构建:不管
SVN或Git中数据有无变化,均执行定时化的构建任务 - 轮询
SCM:只要SVN或Git中数据有更新,则执行构建任务
日程表的填写内容有5个参数,从左到右的参数含义如下:
⦁ 第1个参数:分钟minute,取值0~59
⦁ 第2个参数:小时hour,取值0~23
⦁ 第3个参数:天day,取值1~31
⦁ 第4个参数:月month,取值1~12
⦁ 第5个参数:星期week,取值0~7,0和7都是表示星期天
5个参数可选择性设定,不写死的参数用*号代替,参数之间用空格隔开。例如:
"0 21 * * *"表示每晚21点0分自动化构建一次
"0 * * * *"表示每个小时的第0分钟执行一次构建
"H/5 * * * *"每隔5分钟构建一次
"H H/2 * * *"每两小时构建一次
"H H 30 * *"每月30号构建一次
"H(0-29)/10 * * * *"每个小时的前半个小时内的每10分钟
"0 8-17/2 * * 1-5"周一到周五,8点~17点,两小时构建一次
"H H 1,15 1-11 *"每月1号、15号各构建一次,除12月等

3.5. 构建环境设置
在构建环境中采用了shell脚本构建工程的方式,并因此可以省略相关步骤
3.6. 构建
在打包过程中存在两个方案可以选择:一个是利用Xcode插件进行打包操作;另一个是通过编写相应的Shell脚本完成打包任务。经过权衡与分析后,在多种方案中选择了后者。

iOS自动打包—Jenkins Shell如下:
## !/bin/sh
## 项目名
TARGET_NAME=NNAlgorithm
## Scheme名
SCHEME=NNAlgorithm
##=======================
## 编译类型
BUILD_TYPE=Release
## 当前目录
SORCEPATH=${WORKSPACE}
## workspace名
SPACE=${WORKSPACE}/${TARGET_NAME}.xcodeproj
##xcarchive文件的存放路径
ARCHIVEPATH=$SORCEPATH/build/$SCHEME.xcarchive
## ipa文件的存放路径
EXPORTPATH=$SORCEPATH/build/$SCHEME
## ExportOptions.plist文件的存放路径,该文件要存放在这个路径下内容如下
EXPORTOPTIONSPLIST=$SORCEPATH/build/ExportOptions.plist
## 导出后的ipa路径
EXPORTPATHIPA=$SORCEPATH/build/$SCHEME/$SCHEME.ipa
echo -e "============First Build Clean============"
## 清理缓存
## 如果工程使用的是cocoapods,则'-project %s.xcodeproj'替换为'-workspace %s.xcworkspace'
xcodebuild clean -project $SPACE -scheme ${SCHEME} -configuration ${BUILD_TYPE}
echo -e "============Build Clean============"
## 输出关键信息
echo -e " TARGET_NAME : ${TARGET_NAME}"
echo -e " BUILD_TYPE : ${BUILD_TYPE}"
echo -e " SORCEPATH : ${SORCEPATH}"
echo -e " ARCHIVEPATH : ${ARCHIVEPATH}"
echo -e " EXPORTPATH : ${EXPORTPATH}"
echo -e " EXPORTOPTIONSPLIST : ${EXPORTOPTIONSPLIST}"
echo -e "============Build Archive============"
## 导出archive包
xcodebuild archive -project ${SPACE} -scheme ${SCHEME} -archivePath $ARCHIVEPATH
echo -e "============Build Archive Success============"
echo -e "============Export IPA============"
## 导出IPA包
xcodebuild -exportArchive -archivePath $ARCHIVEPATH -exportPath ${EXPORTPATH} -exportOptionsPlist ${EXPORTOPTIONSPLIST}
echo -e "============Export IPA SUCCESS============"
## 编译完成时间 20181030_0931
BUILD_DATE="$(date +'%Y%m%d_%H%M')"
## info.plist路径
PROJECT_INFOPLIST_PATH="${SORCEPATH}/${TARGET_NAME}/Info.plist"
## 取版本号
BUNDLESHORTVERSION=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${PROJECT_INFOPLIST_PATH}")
## 取build值
VERSION=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${PROJECT_INFOPLIST_PATH}")
## ipa更名规则 项目名V版本_年月日_时分
IPANAME="${TARGET_NAME}V${BUNDLESHORTVERSION}_${BUILD_DATE}.ipa"
## 更名后ipa路径
EXPORTPATHNEWIPA=$EXPORTPATH/$IPANAME
echo -e "============Export end :${BUILD_DATE}============"
echo -e "============IPA Old Name: ${EXPORTPATHIPA}============"
echo -e "============IPA New Name: ${EXPORTPATHNEWIPA}============"
## IPA更名
cp $EXPORTPATHIPA $EXPORTPATHNEWIPA
echo -e "============Create New Name Success============"
## 删除老IPA
rm $EXPORTPATHIPA
echo -e "============Delete Old Name Success============"
#userKey和apiKey需要在蒲公英的账号设置中查找
userKey="xxx"
apiKey="xxx"
#蒲公英打包
curl -F "file=@${EXPORTPATHNEWIPA}" \
-F "uKey=${userKey}" \
-F "_api_key=${apiKey}" \
-F "isPublishToPublic=2" \
http://www.pgyer.com/apiv1/app/upload
ExportOptions.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>provisioningProfiles</key>
<dict>
<key>com.Y***ane</key>
<string>azur***_dev</string>
</dict>
<key>method</key>
<string>development</string>
<key>signingCertificate</key>
<string>iPhone Developer</string>
<key>signingStyle</key>
<string>manual</string>
<key>teamID</key>
<string>42***ZL</string>
<key>compileBitcode</key>
<false/>
<key>uploadSymbols</key>
<false/>
</dict>
</plist>
其中 plist 文件中的 method 参数主要涵盖以下几个方面:包括 app store、ad hoc、enterprise 和 development 等主要类型
邮件通知系统,通过系统管理→系统设置,进行邮件配置
设置jenkins地址和管理员邮箱地址

请配置发件人等相关信息。必须确保这里的发件人邮箱地址与系统管理员的邮件地址保持一致性。

注释内容:在当前页面上设置的Password字段被指定为邮箱系统的SMTP授权秘钥。至此,在系统管理界面中相关信息已完成设置
请设置Jenkins内置的邮件功能模块,并验证其在正常运行状态下是否有效工作。无需特别设置此功能即可。

如同之前设置相同的情况下即可选择测试配置选项后系统会向您发送一封邮件并在界面上显示"成功发送"的状态这表明邮件配置已完成之后您可以在项目中进行详细设置以便后续使用
进入项目界面后,在功能选项中依次选择"增强功能"下的"构建后操作"模块。随后,在弹出的设置对话框中选择"新建行为步骤"选项卡并完成相关参数设置。最后,在编辑页面中找到并点击"Edit Email Notification"参数项进行配置设置。


至此所有的配置已完成,点击应用后保存,enjoy it!
Project Recipient List:这个项目的需要发送邮件给哪些人,可以在这里输入多个邮箱,中间以英文逗号隔开
Project Reply-To List:保持默认即可,这个是收到邮件的人回复邮件时候回复给谁用的,一般不会回复邮件
Content Type:可以选择Html或者Default也行,因为我们在jenkins系统设置中的默认格式就是html
Default Subject: 邮件主题,可以书写成:XXX项目iOS打包通知:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS! 分析下这几个参数什么意思:$PROJECT_NAME 构建项目的名称;$BUILD_NUMBER 构建的号码;$BUILD_STATUS 构建状态,这几个参数,它会自动读取,按照这种格式书写即可
Default Content:邮件内容,以下内容为模板,可直接复制修改使用:
<hr/>
本邮件是程序自动下发的,请勿回复!<br/><hr/>
项目名称:$PROJECT_NAME<br/><hr/>
构建编号:$BUILD_NUMBER<br/><hr/>
构建状态:$BUILD_STATUS<br/><hr/>
触发原因:${CAUSE}<br/><hr/>
构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console/</a><br/><hr/>
构建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/><hr/>
构建报告:<a href="${BUILD_URL}testReport">${BUILD_URL}testReport/</a><br/><hr/>
变更集:${JELLY_SCRIPT,template="html"}<br/><hr/>
Jenkins的卸载步骤(适用于Windows、Linux和macOS系统)
- 如果您采用
brew进行安装,则可执行以下命令$ brew uninstall jenkins- 说明:Jenkins用于调整项目的工作空间位置
在高级设置中选择"自定义"选项卡,并在"工作空间位置"字段中输入所需路径即可
- 说明:Jenkins用于调整项目的工作空间位置


请特别注意,在操作过程中使用Jenkins Pipeline进行Git分叉的动态参数传递时,请确保禁用Pipeline的轻量级检测选项。如果不这样做的话,Git分叉的参数传递可能会出现问题。
