iOS 使用Jenkins持续集成(简称CI)

  1. 安装jenkins
    1.1. 直接到官网下载安装包,通过安装包安装
    1.2. 通过Homebrew使用命令行安装
1. 安装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的页面如下图,存储password的地方就是图片上那行红色字体目录

然后将我们得到的password输入到Administrator password中,即可进入如下界面,接着安装一些建议的插件左边的,安装过程中,有的插件可能会安装失败,强烈建议点击右下角的重试,直到把建议安装的都装好

插件安装完成后,可能不会自动跳转,刷新下界面即可,在刷新后的界面中注册,输入用户名和密码,建议输入后点蓝色按钮保存完成

  1. 安装jenkins插件
    如果要使用Jenkins的插件构建工程的,需要在开始新建工程前安装一些Jenkins插件,在可选插件中选择我们需要的插件进行安装
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脚本构建工程

  1. jenkins的使用
    3.1. 构建一个自由风格的软件项目

3.2. General参数

可以设置包的保留天数和最大保留个数,这些可以根据需要进行调整,可以不要选

  • jenkins插件配置多个项目extended choice parameter插件主要是构建的时候可以多选框来选择要构建的项目模块



($+上面的Name)就可以获取该值

3.3. 源码管理



3.4. 构建触发器设置
触发器可自定义的地方很多,可以根据项目需要选择可省略

  • 定时构建:不管SVNGit中数据有无变化,均执行定时化的构建任务
  • 轮询SCM:只要SVNGit中数据有更新,则执行构建任务
    日程表的填写内容有5个参数,从左到右的参数含义如下:
    ⦁ 第1个参数:分钟minute,取值0~59
    ⦁ 第2个参数:小时hour,取值0~23
    ⦁ 第3个参数:天day,取值1~31
    ⦁ 第4个参数:月month,取值1~12
    ⦁ 第5个参数:星期week,取值0~707都是表示星期天
    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
    3.7. 构建后操作

  • 邮件通知系统,通过系统管理系统设置,进行邮件配置

  • 设置jenkins地址和管理员邮箱地址

  • 设置发件人等信息
    这里的发件人邮箱地址切记要和系统管理员邮件地址保持一致


  • 注:上图的Password为邮箱的SMTP授权秘钥,至此系统管理处的内容已配置完成

  • 配置Jenkins自带的邮件功能(测试邮件功能是否正常使用,可以不配置,不影响)

和上面Extended E-mail Notification配置一样即可,点击Test configuration,收到邮件并且显示Email was successfully sent,代表邮件配置成功,接下来可以去项目中具体配置就可以使用了

  • 进入项目,然后找到构建后操作,点击增加构建后的操作步骤,点击Editable 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/>
  1. Jenkins卸载方法(Windows/Linux/MacOS)
  • 如果使用brew安装的,可以执行以下命令$ brew uninstall jenkins

  • 注:Jenkins修改工程的工作空间
    在项目的配置中点击高级,选择使用自定义工作空间,输入工作空间路径即可


  • 注意:使用Jenkins Pipeline动态参数传递Git分支时,需要取消Pipeline轻量级检出选项,不然git分支参数传递会有问题

附:我的博客地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335