iOS打包自动化实践(三)

上一篇:iOS打包自动化实践(二)

自动打包项目优化

本篇文章介绍了jenkins email通知、使用swift脚本自动升级build号、自动上传蒲公英并自动发送链接到钉钉群等功能。

添加E-mail通知

1、安装Jenkins插件:系统管理-管理插件中,搜索"Email-ext plugin"和"Email-ext Template Plugin"并安装。

2、在"系统设置"中找到"邮件通知"和"Extended E-mail Notification", 163邮箱配置如图(注意:如果邮箱开启了客户端授权码,需要填写授权码而不是密码, 即"设置 -->POP3/SMTP/IMAP-->客户端授权密码"):

邮箱.png

3、在项目配置的"构建后操作"中,添加"Editable Email Notification",在"Project Recipient List"中填写需要收取邮件的邮箱地址,"Default Content"中可以直接使用jenkins的全局环境变量, "${BUILD_STATUS}", "${BUILD_URL}"等,填写

\${SCRIPT, template="groovy-text.template"}

可以收到基本信息,也可以点击如图链接,查看所有可用的环境变量并在邮件内容中使用。

环境变量.png

4、点击"Adcanced Settings-Add Trigger",可以设置发送邮件的触发时机,设置"Send To"为"Recipient List".

5、点击保存,完成。

自定义Email内容

适用场景: 需要在脚本中生成log并发送邮件。比如脚本中有打包,下载metadata,上传ipa三步,当任务build失败时,我们需要在邮件中打印log来快速定位是哪一步出了问题。原理是先在shell中把log写入文件,再把文件内容读取到邮件的内容中。

1、在"Execute shell"中把log写入文件:

echo "test log" > /file/path/logFile.txt

2、在"Editable Email Notification-Default Content"中写如下代码:

${FILE,path="/file/path/logFile.txt"}

自动升级build号和自动获取版本号

由于swift是可以用来写脚本的,再加上iOS程序猿都比较熟悉swift语法,因此这里自动升级build号的工作我编写了一个简单的swift脚本来实现,十分的方便,这里语法不多介绍了大家都会,简单介绍下如何把swift脚本跑起来。

1、创建modifyBuildNumber.swift文件, 并将其放在远程CI机器上。

2、文件头部添加代码, 指定编译器:

#!/usr/bin/env xcrun swift

3、接下来就可以愉快的编写swift代码了,通过读取并修改info.plist中的CFBundleVersion字段来达到自动升级build号的功能。若修改失败,执行代码"exit(1)", 修改成功不执行或者执行代码"exit(0)"。

4、在shell中执行swift脚本并获取swift脚本执行结果:

#获取swift脚本路径
modify_build_number_script="file/path/modifyBuildNumber.swift"

#修改脚本权限为可执行
chmod +x $modify_build_number_script

#获取脚本执行结果
RESPONSE=`$modify_build_number_script`

#判断上一条命令是否执行成功。
if [ $? -ne 0 ]; then
    echo "swift脚本执行失败:$RESPONSE" 
fi

在swift脚本中执行print命令打印的log, 会作为swift脚本的执行结果,并赋值给RESPONSE这个变量。(但是我发现通过这种方式只能获取一行,对于目前的需求肯定是够用了。不过如果大家有更好的办法欢迎评论告诉我).

自动获取版本号更加的简单,使用swift脚本直接读取info.plist中的CFBundleShortVersionString字段,并使用print命令打印,在shell中直接使用变量获取swift脚本执行结果即可(获取的版本号主要用于deliver命令)。

自动触发打包任务

实现了自动修改build号和自动获取版本号的功能之后,是不是发现这个系统需要人工操作的地方更少了?接下来介绍如何自动触发打包上传任务。

我们公司使用了TestFlight进行内测期间的回归测试工作,因此一旦有新的代码合并进入release-test分支,就需要打包上传到TestFlight。这个功能利用jenkins也很好实现。

1、进入任务的配置界面,在"构建触发器"栏中勾选Poll SCM,并填写代码:"* * * * *", 这代表每分钟jenkins自动检测一次你在"源码管理-Branches to build"栏中填写的分支是否有代码变化,一旦有变化即触发自动打包。

2、检测时间间隔可以自行调整,比如"H * * * *":每小时检测一次,"H */2 * * *":每两小时检测一次。

3、上传到iTC之后,testFlight每次都会询问是否修改了加密协议,不能自动发布testflight版本,这时需要在info.plist中加入字段"App Uses Non-Exempt Encryption", 值设置为NO。 即可实现每次上传之后都会自动触发testflight版本发布。

jenkins中的全局环境变量"BUILD_CAUSE"代表了触发原因,值为"SCMTRIGGER"时表示自动触发,"MANUALTRIGGER"表示手动触发。

打包脚本的版本管理

项目优化到这一步我们发现脚本越来越长,而且增加了几个swift脚本,还有ExportOptions.plist文件,已经略显庞大。而且脚本直接写在jenkins的"Execute shell"中很不安全,一旦误删前功尽弃。这时可以考虑给所有的打包脚本和工具放在一个单独的Git仓库中,每次触发构建时拉取最新的脚本和项目代码,进行打包。这样做方便自动打包项目的维护和移植。

1、使用Execute shell中的代码建立archive_upload.sh文件,并把ta和刚刚建立的swift脚本,ExportOptions.plist文件放在一起,单独建立git仓库。

2、在"Jenkins-插件管理"中下载插件"Multiple SCMs Plugin"

3、在项目配置页面,"源码管理"中勾选"Multiple SCMs",分别配置项目git地址和脚本git地址,并通过"Additional Behaviours-Check out to a sub-directory"分别建立下级文件夹。

4、修改Execute shell为:

#!/bin/sh

root_path=`pwd`
project_path="$root_path/ProjectPath"
script_path="$root_path/AutoPackScripts/archive_upload.sh"

chmod +x $script_path

#执行脚本
$script_path\
    --projectPath $project_path\
    --zhHans $release_notes_zhHans\
    --zhHant $release_notes_zhHant\

5、给archive_upload.sh脚本增加参数解析功能,shell脚本的参数数量和名称是可以任意拓展的。在archive_upload.sh中添加如下代码即可解析:

while [ -n "$1" ]
do
    case "$1" in
    --projectPath)
        #工程目录
        project_path=$2
        shift
        ;;
    --zhHans)
        #简中发版文案
        release_notes_zhHans=$2    
        shift
        ;;
    --zhHant)
        #繁中发版文案
        release_notes_zhHant=$2
        shift
        ;;
    *)
        ;;
    esac
    shift
done

企业包自动上传至蒲公英并自动发送下载链接到钉钉群

到现在我们的项目已经可以自动打release包上传到iTC了,那么自动打企业包只需要更换证书和修改ExportOptions.plist文件即可,这里不多介绍,直接介绍如何自动上传到蒲公英并发送二维码到钉钉群的功能。

假设你的项目已经可以成功打出企业签名的包并且导出了ipa

1、在Jenkins-插件管理中安装插件"Upload to pgyer".

2、在项目配置的"构建"中,点击"添加构建步骤-Upload to pgyer", 并填写api_key,在"file wildcard"中填写导出的ipa路径.

蒲公英配置.png

3、在你的钉钉群中添加机器人,并复制其webhook链接。

4、在jenkins上创建一个新的任务"DingTalk_Sender", 直接在"Execute shell"中写如下代码:

#!/bin/sh

curl 'https://oapi.dingtalk.com/robot/send?access_token=xxx' \
   -H 'Content-Type: application/json' \
   -d '
  {     "msgtype": "link", 
        "link": {
        "text":"测试", 
       "title": "测试", 
        "picUrl": "", 
        "messageUrl": "https://www.pgyer.com/xxxx"
    }
    
  }'

curl填你的机器人的webhook链接, messageUrl字段填写你的项目在蒲公英的地址。

4、回到你的打包上传任务中,在"构建后操作"中,添加"Build other projects",填写"DingTalk_Sender".这样就使两个任务相关联,执行完上传后即自动执行DingTalk_Sender任务。

FAQ

1、邮箱配置时,发送测试邮件报错:javax.mail.authenticationfailedexception: 535,有两种可能:

  • 密码填写错误
  • 邮箱开启了客户端授权码,但是密码没有填写授权码而是填写了邮箱密码

2、邮箱配置成功且测试邮件发送成功,但是build成功之后发送邮件时控制台输出显示:Connection error sending email, retrying once more in 10 seconds...并且发送邮件失败。

在jenkins的系统设置中找到"Extended E-mail Notification",并按照之前的配置重新配置一遍。

Note also that depending on your plug-in set up, you may have another place to configure SMTP server. For example under "Manage Jenkins" -> "Configure System" -> "E-mail Notification".

That is not needed for this particular plug-in but it may lead you think you have everything done, while it is not :)

3、配置多个SCM之后,只要有一个仓库发生变化都会触发Poll SCM自动构建,如何使其忽略某个仓库?

在"源码管理"中,在该仓库下的'Advanced clone behaviors'中,选择'Polling ignores commits in certain paths',并在'Excluded Regions'中填写'.*'。

忽略某个repo.png

下一篇:iOS打包自动化实践(四)

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

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,937评论 3 118
  • 62、“当我达到一定量的销售时,就会停产这个产品……,’ 这种“产品停产”策略告诉你的潜在客户,他们最好现在就购买...
    追着太阳的尾巴阅读 260评论 0 0
  • 神农币是一只母狗,短腿,微黄的毛发,是某种狗和中华田园犬的杂交品种,母亲收留它时就是看上它长不高的个头。 刚到我家...
    艾米小姐阅读 1,022评论 0 2
  • 【七月影语】20170731学习力践行Day71 1.听鹅妈妈磨耳朵 2.大街上识认汉字“川,药,草,电,工,生”...
    暖小柒阅读 139评论 0 0
  • 所受辛劳都是应该的,今天看到那句话说:怎么样的努力发展才能赶得上父母老去的速度。可能也是之前幼稚,很多东西都没有看...
    星辰大衍阅读 176评论 0 0