使用swift编写命令,并且部署jenkins 实现flutter工程自动化打包

681 阅读6分钟

本教程适合中小型公司,内部实现自动化打包,方便、稳定。彻底解放程序员的双手,无需部署繁琐的Jenkins,只要简单几步即可,可以不局限于flutter,原生Android和iOS都可以,思路都一样。使用jenkins打完包以后 钉钉机器人在群里通知打包的测试同学。

20210918113209.jpg

为什么要自动化(手动打包存在的痛点)

1.加班到半夜打包发版,容易出错,因为此时的人极度疲劳,更容易出问题

在flutter工程中我们一般用多个文件入口来表示多套开发环境比如main.dart 表示生产环境 main_t.dart表示测试环境,如下图所示

20210918111345.jpg 我们通过运行不同的入口文件来运行不同的环境,如下

20210918111543.jpg 但是这种方式存在一个问题,我们无法在原生工程中一眼就看出当前运行的环境,以iOS为例,我可能需要打开Generated.xcconfig 这个文件才能看到我当前的环境 如下图

20210918111906.jpg 假设如果此时加班到很晚,人会感到疲劳,极其容易忽略当前打包的环境,导致可能发错包。这样的话造成的后果是灾难性的

2. 打包效率问题

一般情况下稍微有点规模的app 怎么也得打个3、5分钟,比如我现在用的这台电脑每次打包都得10多分钟,如果你在打包的同时想在运行其他的项目,那么效率会更低,尤其是在发版的前几天可能需要频繁的打包,这一天下来啥也没干成,净给测试同学打包了

3.测试同学以及其他有关联的部门总跟你要包

我觉得这个原因可能是绝大多数移动端开发同学的的困惑,改点东西,就要给测试打包,测试同学翻来覆去老找你要包。而且有多个测试同学,可能测的分支、功能都不一样,总是要给测试打包。非常影响我们对业务的专注度。我们在解决Bug或者是写业务的时候,突然有个人跟你要包,又很着急的样子。你要马上给他打包,这样就中断了自己的思路,效率反而又降低了

总之不管什么原因,我们自动化的目的都是为了公司或者个人提高工作效率,只要能达到这个目的就可以了

编写swift代码

打包原理:使用swift编写打包命令,其本质就是 整合flutter和iOS平台提供的打包命令,来达到自动打包的目的,所以在编写代码之前 要先认识几条我们常用的命令

  • Flutter平台
flutter clean
flutter pub upgrade
  • Android平台打包命令
// 正常可测试的aab文件
flutter build apk lib/mian.dart 
// 上架google商店的aab文件
flutter build appbundle --target-platform android-arm64
  • iOS平台
flutter build ios lib/main.dart
//生产archive文件
xcodebuild  archive -workspace ios/Runner.xcworkspace -scheme Runner -configuration Release -archivePath \(archivePath)  -destination 'generic/platform=iOS' | xcpretty > \(xcodeBuildLogPath)
//导出ipa文件
xcodebuild -exportArchive -archivePath \(archivePath).xcarchive -exportPath \(exportPath) -exportOptionsPlist ExportOptions_development.plist

对于以上几个命令明确以后,剩下的代码就简单了,核心代码就一句,就是执行上面几行命令,如下

20210918135523.jpg 全部流程的代码,我放到了 github上,有兴趣的可以自行查看。文章里面只阐述主要流程的代码

1.入口参数选择

为了使我们的打包命令既能在命令行方便的执行,又能兼容jenkins传参

20210918141857.jpg

上图中 readLine() 就是获取命令行输入的参数 编译我们的工程cmd+B,在工程中的Products目录下得到我们的 match-o文件如下

20210918142235.jpg 在flutter工程下执行这个二进制文件,如下

20210918142656.jpg

2.ipad导出

我的打包命令在测试环境只能导出一个dev开头的包但是在生产环境打包的时候iOS端会产出两个ipa文件,Android也会产出两个包,如下图所示

20210918143238.jpg

20210918143153.jpg

为什么要这么设计呢? 我们知道iOS端正常情况下Development的这种发布方式,只能通过添加内测udid这种方式安装到手机上,却不能发布到AppStore。而使用AppStore这种方式,又不能直接安装到手机上,为了保证测试测的代码和上传AppStore的代码的一致性,在最后导出ipa的时候,就把两种包都导出来,一旦测试通过 就可以直接通过 Transporter 提交到应用商店。既保证了代码一致性又提高了效率,重点是 这样提包的方式不依赖于Xcode 如果开发人员不在,测试和产品也可以提交App到应用商店。

3.钉钉通知打包的同学进行测试,代码如下

20210918145039.jpg 其实就是执行了一个 curl 的命令,至于如何@钉钉群里的同事,请查看钉钉官方文档

至此编写代码的核心流程就完成,下面就是如何部署jenkins的问题

部署Jenkins

本文不教你怎么安装jenkins ,请自行搜索 我假设你已经安装好了jenkins 并且可以看到下面的登录页面

20210918150922.jpg

曾几何时,对于使用Jenkins,尤其是部署 iOS工程,真是一顿折腾,而且还没那么稳定。今天提供一种新的思路,就是用jenkins直接调用我们上面编写的二进制文件,所有jenkins上关于iOS 或者 Xcode的插件都不需要安装,也不需要知道怎么使用。只需要用到一个Jenkins插件build user vars 这个插件是用来获取当前登录用户信息的,如果你不需要在最后钉钉机器人上显示打包人的姓名,那么这个插件也不需要了。

1.创建一个自由风格的软件项目

20210918152057.jpg

2.添加构建参数,平台、环境、和git地址

20210918152305.jpg

20210918152325.jpg

20210918152414.jpg

3.执行打包命令

注意:这里有个问题,好像jenkins不能直接调用 match-o,所以我这里先让jenkins执行 shell ,在shell里面调用 match-o 如下

20210918153049.jpg

20210918153130.jpg 保存,开始构建 可以试一下效果了

20210918153506.jpg

所以基于以上步骤来看,只要我们用swift 编写的打包命令没有问题,那么jenkins就可以正常打包,如果jenkins出现了异常,程序员手动执行命令也是一样的效果