CI/CD,即持续集成(Continuous Integration)和持续交付/部署(Continuous Delivery/Deployment),是一种软件开发实践,通过引入自动化的构建、测试和部署过程,来提升软件质量并加速交付周期;

使用 CI/CD 可以协助开发和运维人员保障我们软件工程质量

  1. 频繁的集成

    在CI/CD流程中,开发人员会频繁地将代码合并到主分支,这可以避免长时间的分支开发导致的集成问题。

  2. 自动化构建和测试

    每次代码变动都会触发自动化的构建和测试过程,这样可以及时发现并解决问题,而不是在软件开发周期的后期进行手动测试。自动化测试覆盖了单元测试、集成测试、功能测试、性能测试等,保证了代码的健壮性和可靠性。

  3. 快速反馈

    如果在构建或测试阶段发现任何问题,开发人员会立即收到通知。这样,问题可以在早期阶段解决,修复的成本和影响将降到最低。

  4. 一致性的构建和部署环境

    CI/CD可以确保在同一环境中构建和部署软件,从而避免了“在我机器上运行得好好的”问题。通过容器化技术,可以确保开发、测试和生产环境的一致性。

  5. 自动化部署

    在持续部署模型中,如果所有的测试都通过,新的代码变更将自动部署到生产环境。这降低了人为错误,并加快了软件交付的速度。

  6. 版本控制

    CI/CD工具链通常与版本控制系统(如Git)结合使用,可以清晰地追踪每个版本的更改,这对于问题追踪和解决非常重要。

  7. 监控和日志

    CI/CD流程也可以集成软件性能监控和日志收集,以便在软件上线后进行问题定位和性能优化。

下面我们就在 Flutter 项目一步一步的使用 Github Action 进行持续集成和持续部署吧

1. 新建或者打开你的 Flutter 项目

2. 在 Flutter 配置 Github Action

项目的根目录中设置一个新的目录和文件 .github/workflows/ci_cd.yml

xxx.yml是github action 工作流的配置文件.我们可以在配置文件里面设置触发条件, 打包方式,运行环境等以及相关的工作流信息

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

# 这是GitHub Actions的工作流配置文件
# 当你推送代码或者创建标签时,这个工作流就会被触发
name: CI/CD with Flutter

on:
# 当代码被推送到任意分支时,或者有新的Pull Request时,触发工作流
push:
branches: [ main ]
pull_request:
branches: [ main ]

tags:
- 'v*' # 当推送的标签名以v开头时,触发工作流,这常用于发布新版本

jobs: # 定义了一系列的工作,这些工作可以并行执行,也可以按照依赖顺序执行
build_and_test: # 这是第一个工作的名称,你可以自行定义
# 工作运行的环境
runs-on: ubuntu-latest
# 工作中的步骤,步骤会按照从上到下的顺序执行
steps:
- name: Checkout code # 第一步,检出代码
uses: actions/checkout@v2

- name: Setup Flutter # 第二步,设置Flutter环境
uses: subosito/flutter-action@v1
with:
flutter-version: '2.2.3' # 指定Flutter版本号

- name: Install dependencies # 第三步,安装依赖
run: flutter pub get

- name: Run tests # 第四步,运行测试
run: flutter test

- name: Build APK # 第五步,构建APK
run: flutter build apk

- name: Archive production artifacts # 第六步,归档产物,你可以在Actions的界面下载到这个文件
uses: actions/upload-artifact@v2
with:
name: release-apk
path: build/app/outputs/flutter-apk/app-release.apk
build_ios:
runs-on: macos-latest # 注意这里选择了macOS环境
steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Setup Flutter
uses: subosito/flutter-action@v1
with:
flutter-version: '2.2.3'

- name: Install dependencies
run: flutter pub get

- name: Build iOS
run: flutter build ios --release --no-codesign # 构建iOS版本

- name: Archive iOS
uses: actions/upload-artifact@v2
with:
name: release-ios
path: build/ios/iphoneos/Runner.app # iOS应用的路径

deploy: # 这是第二个工作的名称,你可以自行定义
# 这个工作需要在build_and_test工作成功后才会运行
needs: build_and_test
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Setup Flutter
uses: subosito/flutter-action@v1
with:
flutter-version: '2.2.3'

- name: Install dependencies
run: flutter pub get

- name: Build APK
run: flutter build apk

- name: Deploy to Release # 最后,部署到你的发布页面或者服务器
# 这个部分取决于你使用什么方式来发布你的应用
run: |
VERSION=${GITHUB_REF#refs/tags/}
echo "Deploying version $VERSION"
# 这里添加你的部署代码

参考上面的配置文件信息, 我们工作流的主要流程如下:

  1. 当有新的推送(push)或者拉取请求(pull request)到主分支时,触发工作流。
  2. 在一个新的 Ubuntu 虚拟环境中运行步骤。
    检出代码。
  3. 设置 Flutter 环境。
  4. 获取 Flutter 依赖。
  5. 运行 Flutter 测试。
  6. 构建 Flutter APK。
  7. 上传构建的 APK 作为工作流的工件。