CI 与 CD¶
- 持续集成(Continuous integration, CI),一般指在代码发生变化时持续进行测试,确保代码在更改的过程中不出现问题。
- 持续部署(Continuous distribution / deliver, CD),一般指在需要发布应用时借助平台进行自动化部署,节省各个平台发布的操作。
这两个概念个人认为是和 twelve-factor app 相得益彰的,偏架构设计和工作流管理。
基于 Git 和 GitHub 的团队合作开发模式¶
写代码离不开 Git 的提交和回退功能,Git 的分支功能则方便开多点发和部署,GitHub 作为远端的 Git 仓库,结合很多好用的功能助力团队合作开发。
Flutter 程序基于 GitHub workflows 可以很方便的通过配置文件开启 CI CD 服务,GitHub 提供了一定程度的免费额度,基本上可以满足小团队的应用开发需求。
发布网页版和 APK¶
我们可以将 APK 的构建和网页版的部署变为自动化的流程。
新建 .github/workflows/
文件夹,在其中新建文件 deploy-apk-and-web.yml
,添加如下内容:
YAML | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
这个配置文件让 GitHub 在每次有新的代码在主分支提交的时候,自动构建网页版并部署到 GitHub Pages、自动构建 APK 并上传到 GitHub 可以下载。
然后需要对网页端做一些配置,打开 web/index.html
,将 L17 <base href="$FLUTTER_BASE_HREF">
中的 $FLUTTER_BASE_HREF
改为 GitHub 上的仓库名字,仓库名字是 repo_name
就改为 <base href="/repo_name/">
。这样做的原因官方在 web/index.html
的注释中也给出了说明:
If you are serving your web app in a path other than the root, change the href value below to reflect the base path you are serving from.
The path provided below has to start and end with a slash "/" in order for it to work correctly.
For more details: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
This is a placeholder for base href that will be replaced by the value of the
--base-href
argument provided toflutter build
.
之后提交上传至 GitHub,可以看到工作流已经开始执行。
执行完毕之后,我们需要在 Settings 中打开 GitHub Pages 服务,选择 gh-pages
分支。然后稍等片刻,即可得到网页端部署的网址。
在工作流的历史界面可以看到构建好的 APK 文件,点击即可下载。
Dart 官网的测试部分也推荐了一篇简单易懂的基于 GitHub Actions 结合 coverage 的测试教程,同学可以参考 Testing Dart packages with GitHub Actions。
官方资源¶
我们刚刚讲了通过 GitHub workflows 进行自动化操作,这事实上是一种通用的处理方式。如果仅仅针对应用测试和发布,有很多很不错的工具使用体验超过 GitHub workflows 的手动配置,官方也提到了一些工具,有需求的同学可以查看: