https://github.com/coder-dongjiayi/flutter_pack_script
flutter 自动化打包脚本
https://github.com/coder-dongjiayi/flutter_pack_script
Last synced: 4 days ago
JSON representation
flutter 自动化打包脚本
- Host: GitHub
- URL: https://github.com/coder-dongjiayi/flutter_pack_script
- Owner: coder-dongjiayi
- Created: 2021-09-18T07:00:35.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2021-09-18T08:08:05.000Z (almost 4 years ago)
- Last Synced: 2025-03-16T05:26:59.181Z (3 months ago)
- Language: Swift
- Size: 67.4 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 使用swift 编写自动化打包脚本
> 本教程适合中小型公司,内部实现自动化打包,方便、稳定。彻底解放程序员的双手,无需部署繁琐的Jenkins,只要简单几步即可,可以不局限于flutter,原生Android和iOS都可以,思路都一样。使用jenkins打完包以后 钉钉机器人在群里通知打包的测试同学。
## 为什么要自动化(手动打包存在的痛点)
### 1.加班到半夜打包发版,容易出错,因为此时的人极度疲劳,更容易出问题
在flutter工程中我们一般用多个文件入口来表示多套开发环境比如```main.dart ```表示生产环境``` main_t.dart```表示测试环境,如下图所示

我们通过运行不同的入口文件来运行不同的环境,如下
但是这种方式存在一个问题,我们无法在原生工程中一眼就看出当前运行的环境,以iOS为例,我可能需要打开```Generated.xcconfig ```这个文件才能看到我当前的环境 如下图
**假设如果此时加班到很晚,人会感到疲劳,极其容易忽略当前打包的环境,导致可能发错包。这样的话造成的后果是灾难性的**### 2. 打包效率问题
一般情况下稍微有点规模的app 怎么也得打个3、5分钟,比如我现在用的这台电脑每次打包都得10多分钟,如果你在打包的同时想在运行其他的项目,那么效率会更低,尤其是在发版的前几天可能需要频繁的打包,这一天下来啥也没干成,净给测试同学打包了
### 3.测试同学以及其他有关联的部门总跟你要包
我觉得这个原因可能是绝大多数移动端开发同学的的困惑,改点东西,就要给测试打包,测试同学翻来覆去老找你要包。而且有多个测试同学,可能测的分支、功能都不一样,总是要给测试打包。非常影响我们对业务的专注度。我们在解决Bug或者是写业务的时候,突然有个人跟你要包,又很着急的样子。你要马上给他打包,这样就中断了自己的思路,效率反而又降低了
> 总之不管什么原因,我们自动化的目的都是为了公司或者个人提高工作效率,只要能达到这个目的就可以了
## 编写swift代码
> 打包原理:使用```swift```编写打包命令,其本质就是 整合flutter和iOS平台提供的打包命令,来达到自动打包的目的,所以在编写代码之前 要先认识几条我们常用的命令* ```Flutter```平台
```js
flutter clean
flutter pub upgrade
```* ```Android```平台打包命令
```js
// 正常可测试的aab文件
flutter build apk lib/mian.dart
// 上架google商店的aab文件
flutter build appbundle --target-platform android-arm64
```
* ```iOS```平台```js
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
```
对于以上几个命令明确以后,剩下的代码就简单了,核心代码就一句,就是执行上面几行命令,如下
全部流程的代码,我放到了 [github上](https://github.com/coder-dongjiayi/flutter_pack_script),有兴趣的可以自行查看。文章里面只阐述主要流程的代码
#### 1.入口参数选择
为了使我们的打包命令既能在命令行方便的执行,又能兼容jenkins传参
上图中 ```readLine()``` 就是获取命令行输入的参数 编译我们的工程```cmd+B```,在工程中的Products目录下得到我们的 ```match-o```文件如下

在flutter工程下执行这个二进制文件,如下
### 2.ipad导出
我的打包命令在测试环境只能导出一个dev开头的包但是在生产环境打包的时候iOS端会产出两个ipa文件,Android也会产出两个包,如下图所示

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

其实就是执行了一个 ```curl ``` 的命令,至于如何@钉钉群里的同事,[请查看钉钉官方文档](https://developers.dingtalk.com/document/robots/custom-robot-access?spm=ding_open_doc.document.0.0.62846573szVHol#topic-2026027)
> 至此编写代码的核心流程就完成,下面就是如何部署jenkins的问题## 部署Jenkins
> 本文不教你怎么安装jenkins ,请自行搜索 我假设你已经安装好了jenkins 并且可以看到下面的登录页面
曾几何时,对于使用```Jenkins```,尤其是部署 iOS工程,真是一顿折腾,而且还没那么稳定。今天提供一种新的思路,就是用jenkins直接调用我们上面编写的二进制文件,所有jenkins上关于``iOS`` 或者 ``Xcode``的插件都不需要安装,也不需要知道怎么使用。只需要用到一个Jenkins插件``build user vars `` 这个插件是用来获取当前登录用户信息的,如果你不需要在最后钉钉机器人上显示打包人的姓名,那么这个插件也不需要了。
#### 1.创建一个自由风格的软件项目
#### 2.添加构建参数,平台、环境、和git地址



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

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