众所周知,发布iOS应用程序在开发者社区有一个复杂而繁琐的过程。发布过程包括处理代码签名的构建和苹果公司设定的审查过程,以决定它是否符合他们公开发布的标准。而为了帮助你更快地达到目的,你需要一套好的工具来自动测试和部署你的应用程序。
这就是持续集成(CI)理念的帮助所在。它主要鼓励开发者在一个项目中自动进行测试和合并提交的过程,以确保代码质量和产品的稳定性。
在本文中,您将学习如何使用Semaphore为您在iOS中的Flutter应用程序设置CI管道。
前提条件
- Flutter SDK 2.0 及以上版本
- 一个现有的 Flutter 项目或使用此启动项目
我建议阅读Semaphore 核心概念 和我之前的文章《在 Android 中使用 Semaphore 的 Flutter 应用程序》,让您有一个初步的了解。
使用 Flutter 构建 iOS 应用程序
Flutter 的官方网站。见flutter.dev
Flutter 是一个 UI 工具包,用于为您的想法和应用程序制作漂亮的用户界面和体验。在 Android 和 iOS 之间共享代码,几乎不需要改变任何平台特定的配置代码。它还支持一套丰富的软件包,使您能够遵循行业标准的设计语言,如Material和Cupertino主题。
项目概述
该项目是一个简单的todo应用。它是用Flutter 2.0编写的,支持null safety,包括单元和部件测试,以及UI测试。
iOS应用程序的开发
开发iOS应用需要Xcode和一台macOS机器。与在Android上开发不同,它可以在Windows、Linux和macOS上运行。你还需要像iOS一样的设备,或者在机器上使用预制的模拟器。
在最新版本的Xcode(13.1)上运行的Flutter iOS项目
在iOS中为Flutter创建部署需要你有一个苹果开发者账户,并为你的项目注册一个独特的捆绑标识符。关于这一点的更多信息。
为了确保您的Flutter应用程序已经准备好用于iOS开发,请运行flutter doctor 。
flutter doctor -v
…
[✓] Xcode - develop for iOS and macOS
• Xcode at /Applications/Xcode.app/Contents/Developer
• Xcode 12.5.1, Build version 12E507
• CocoaPods version 1.11.2
[✓] Connected device (3 available)
• iPhone SE (2nd generation) (mobile) • 696A6A49-8419-4E05-9D95-9EEC78B8084F • ios • com.apple.CoreSimulator.SimRuntime.iOS-14-5 (simulator)
• macOS (desktop) • macos • darwin-x64 • macOS 11.5 20G71 darwin-x64
• Chrome (web) • chrome • web-javascript • Google Chrome 96.0.4664.55
运行flutter doctor ,您可以得到Flutter SDK和Xcode安装的诊断,以及可用于测试的设备。如果所有项目都被选中,您就可以开始了。
iOS的持续集成
开发iOS应用程序的Xcode要求意味着您将为项目使用的CI环境需要一个以macOS为操作系统的虚拟机(VM)。
使用Semaphore进行持续集成
在继续之前,我建议你阅读Semaphore的核心概念,以了解它成为你的应用程序的快速和强大的CI/CD服务的基础。Semaphore对用户足够友好,这里讨论的大多数步骤都是可视化的,不需要编辑YAML文件。
了解可视化生成器
Semaphore的可视化生成器
Semaphore的Visual Builder是建立CI管道的一种直观方式。你的应用程序的整个工作流程 ,可能由一个或多个工作流程管道组成。每个工作流管道可以有一个或多个块 ,默认情况下,从左到右依次执行。而且,每个块 都可以有作业(任务或命令),可以并行运行。
这篇文章主要是针对iOS上的Flutter,所以你必须使用macOS虚拟机与macos-xcode13 镜像。
在Semaphore中设置你的项目
到现在为止,你应该对Semaphore有一个很好的了解。让我们通过创建或登录Semaphore的账户,开始建立我们的持续集成管道。
从左上角,点击**+创建新** 项目来创建一个新项目。
接下来,从你的Github账户中选择想要的项目。
然后,点击 "自定义" ,从头开始设置我们的自定义工作流程。
就这样,你已经把你的项目添加到Semaphore。让我们来创建你的第一个工作流管道吧!
设置你的第一个块
Install dependencies是一个块,用于下载并缓存虚拟机上的Flutter SDK和其他依赖项。
创建一个名为Install Dependencies的块。
接下来,添加一个名为 "安装和缓存Flutter " 的工作和以下命令。
checkout
cache restore flutter-packages-$SEMAPHORE_GIT_BRANCH-$(checksum pubspec.yaml),flutter-packages-$(checksum pubspec.yaml),flutter-packages
flutter pub get
cache store flutter-packages-$SEMAPHORE_GIT_BRANCH-$(checksum pubspec.yaml),flutter-packages-$(checksum pubspec.yaml),flutter-packages /root/.pub-cache
(可选)如果你想测试它是否工作,点击运行工作流,然后点击编辑工作流,继续更新工作流。
设置lint
Lint是一个块,它要检查你的项目的代码质量。这个lint块有两个平行运行的作业。如果其中任何一项工作失败,lint块就会停止运行。如果你想最大限度地提高速度,并行运行作业是很有帮助的,特别是当作业不需要相互依赖的时候
创建一个名为Lint的块。
接下来,添加一个名为Format的作业,并添加命令。
flutter format --set-exit-if-changed .
然后,添加一个名为Analyze的作业,并添加命令
flutter analyze .
这个项目使用由very_good_analysis包设置的lint规则,这应该足以让你开始编写并在团队中执行高质量的代码。
最后,为了使用缓存的依赖关系,在程序块的Prologue部分添加以下内容。
checkout
cache restore flutter-packages-$SEMAPHORE_GIT_BRANCH-$(checksum pubspec.yaml),flutter-packages-$(checksum pubspec.yaml),flutter-packages
flutter pub get
序幕在执行每个作业前执行你添加的命令。
(可选)如果你想测试lint块是否工作,点击运行工作流,然后点击编辑工作流,继续更新工作流。
运行测试
运行测试是一个块,它包含您的Flutter应用程序的单元和部件测试。这些测试位于根文件夹的测试目录中。
创建一个名为 "运行测试"的块。 使用Lint作为该块的依赖项,这样如果Lint块失败,它就不会运行。
接下来,添加一个名为Unit and widget tests的工作,并添加以下内容。
flutter test test
最后,为了使用缓存的依赖关系,在该块的序言部分添加以下内容。
checkout
cache restore flutter-packages-$SEMAPHORE_GIT_BRANCH-$(checksum pubspec.yaml),flutter-packages-$(checksum pubspec.yaml),flutter-packages
flutter pub get
(可选)如果你想测试测试块是否工作,点击运行工作流,然后点击编辑工作流,继续更新工作流。
运行UI测试
UI或集成测试允许您测试集成在您的应用程序中的一个或多个用户流。对于Flutter,我们使用官方的`integration_test`包,它包含了让你在测试设备上编写和运行模拟测试的工具,如iOS的模拟器。
创建一个名为运行UI测试的块。
接下来,添加一个名为添加新项目的工作,并添加以下内容。
flutter test integration_test/add_new_todo_item_test.dart
对在integration_test 目录下找到的其他集成测试重复同样的步骤。
接下来,在序言部分添加以下代码,用于重复使用缓存的依赖。
checkout
cache restore flutter-packages-$SEMAPHORE_GIT_BRANCH-$(checksum pubspec.yaml),flutter-packages-$(checksum pubspec.yaml),flutter-packages
flutter pub get
最后,在序言部分的底部添加以下内容 ,在运行集成测试之前设置模拟器。
device_uuid=$(xcrun simctl create ios-simulator com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-14-5)
xcrun simctl boot $device_uuid
(可选)如果你想选择一个不同的模拟器,运行xcrun simctl list ,它应该显示来自虚拟机的可用模拟器列表。
创建构建档案
最后,你需要检查项目是否可以用从拉动请求或提交中得到的修改来构建。
创建一个名为Build Artifact的块。
接下来,添加一个名为Generate IPA或Artifact 的工作,内容如下。
flutter build ios --no-codesign
artifact push job build/ios/iphoneos/Runner.app
Artifact是一个命令,用于将Flutter中的IPA或Runner.app文件上传到Semaphore,以便日后使用。
最后,为了使用缓存的依赖性,在区块的序言部分添加以下内容。
checkout
cache restore flutter-packages-$SEMAPHORE_GIT_BRANCH-$(checksum pubspec.yaml),flutter-packages-$(checksum pubspec.yaml),flutter-packages
flutter pub get
(奖励)发送Slack通知
Semaphore支持发送Slack通知,而你不必处理其中的复杂问题。如果你想在新的构建档案被上传和代码修改在集成过程中失败时通知你的团队,设置Slack通知是很有帮助的。
构建成功后由Semaphore触发的Slack消息。
在Semaphore设置中设置一个新的Slack通知
在右上角,点击你的账户,然后点击设置。
创建一个新的Slack通知
确保添加项目名称,以便工作流程只为该特定项目运行,这样就不会产生不必要的构建运行。
设置传入的webhook URL
你需要在你的Slack工作区创建一个传入的webhook URL,并在这里输入Slack端点和通道的值。
这里是项目的最终工作流程。
你可以在这里下载最终项目。
结论
确保你向用户发布的产品在规模上是可用的和稳定的,这需要的不仅仅是手动测试和部署。投资于CI管道和自动化等工具,可以为你分担大部分重复性和临时性的工作。Semaphore可以帮助你实现这一目标,而不需要你在设置CI管道时写很多行代码。有了一套好的测试和稳定的CI管道,你就有更多的时间来关注真正重要的事情,也就是为你的用户构建解决方案。
The postContinuous Integration for Flutter Apps on iOS with Semaphoreappeared first onSemaphore.