使用 Bitbucket 管道进行 CI
我们花费了大量精力来构建我们的自动化测试和解决方案代码,所有这些努力都是为了帮助我们开发可维护性更强、更可靠的软件。CI 是一种能够整合来自不同来源的代码变更的做法。随着自动化测试的加入,我们一直在编写的所有测试将开始在更大范围内回报我们的辛勤工作。这将有助于防止我们将回归引入主代码库。例如,如果自动测试存在缺陷,CI 流程就会拒绝 git
拉取请求。
有很多 CI 工具,但在本例中,由于我使用 Bitbucket 进行项目的版本控制,我将只使用 Bitbucket Pipelines,因为它已与 Bitbucket Cloud 很好地集成在一起。正如你将看到的那样,它非常易于使用。让我们开始吧:
-
在 Bitbucket Cloud 仪表板中,选择您用于项目的存储库,然后单击左侧菜单上的 Pipelines 链接:
Figure 1. Figure 9.7 – Create your first pipeline -
然后,选择 Build PHP Application 框。您将看到用于创建第一个管道的示例模板:
Figure 2. Figure 9.8 – Create your first pipeline -
在这里,您将看到一个简单的
.yml
文件;您可以编辑它来运行您的脚本。对于我们的示例项目,您可以使用以下内容:bitbucket-pipelines.ymlimage: docker:stable options: docker: true pipelines: default: - parallel: - step: name: Prepare environment script: - set -eu - apk add --no-cache py-pip bash - apk add --no-cache gcc - apk add --update --no-cache --virtual.tmp-build-deps gcc libc-dev linux-headers postgresql-dev && apk add libffi-dev - apk update && apk add python3-dev gcc libc-dev - pip install --upgrade pip setuptools wheel - pip install --no-cache-dir docker-compose - docker-compose -v - ls -lap - pwd - cd docker - docker-compose build && docker-compose up -d - docker exec -i docker_server-web_1 /var/www/html/symfony/setup.sh - docker exec -i docker_server-web_1/var/www/html/symfony/runCoverage.sh - docker exec -i docker_server-web_1/var/www/html/behat/setup.sh - docker exec -i docker_server-web_1/var/www/html/behat/runBehatTests.sh caches: - composer
正如你所看到的,这些只是我们在设置需要在 CI 云中使用的 Docker 容器时要运行的一些命令。你会注意到,我们正在使用
codebase/symfony/setup.sh
和codebase/behat/setup.sh
文件来安装 Symfony 和 Behat 应用程序所需的所有依赖项和库。这包括创建我们在 Symfony 应用程序中使用的cars
和cars_test
数据库! -
将脚本粘贴到文本区域,然后单击 “提交文件” 按钮。您将被重定向到 “管道” 页面,您将在其中看到正在运行的构建:
Figure 3. Figure 9.9 – Pipeline running
从前面的截图中你会发现,我们可以在本地机器上构建与我们工作相同的容器。
构建运行需要几分钟时间。在这里,我们希望在 CI 云中发生以下情况:
-
创建主机。
-
安装运行
docker-compose
所需的必要库。 -
构建我们用于解决方案的
Docker
容器。 -
安装 Symfony 的 Composer 软件包。
-
运行 Symfony 的 Doctrine 数据库迁移。
-
执行 Symfony 的
runCoverage.sh
测试脚本。 -
确保我们通过所有 Symfony 测试。
-
安装 Behat 的 Composer 软件包。
-
执行 Behat 的
runBehatTests.sh
测试脚本。 -
确保我们通过所有 Behat 测试。
步骤太多了!但我们需要做所有这些事情,以确保我们能像在本地机器上一样运行自动测试。几分钟后,在你的 Build 上查看我们是否通过了 Symfony 测试:

好极了!通过在 CI 内部运行 runCoverage.sh shell
脚本,我们可以确保所有测试和代码都能按预期运行!现在,让我们看看 Behat 测试是否也通过了。继续向下滚动构建屏幕,直到找到 Behat 测试结果:

从日志中可以看到,我们通过了与之前在本地开发机器上通过的相同的五个场景!
在这个阶段,Pipelines 会显示一个绿色的勾选条,表示我们已经通过了整个构建过程。
在第 2 章 "了解和组织项目的业务需求" 中,我们创建了一些 Jira ticket,并将 Bitbucket 仓库集成到了 Jira 项目中。现在,这对 Bitbucket Pipelines 来说将非常方便,因为它也与 Jira 无缝集成。
在从 https://github.com/PacktPublishing/Test-Driven-Development-with-PHP-8/tree/main/Chapter%209 克隆的解决方案代码根目录中,你会发现一个 bitbucket-pipelines.yml
文件,其中包含我们用来运行第一个管道的脚本。现在,每次将更新推送到与正在处理的 Jira ticket 相连的 Bitbucket 分支时,Jira 就会自动检测到正在为 Jira ticket 运行的 Pipelines 构建:

点击前面截图中突出显示的 "创建拉取请求" 链接区域下方的 "1 构建未完成" 链接,你会看到一个弹出窗口,其中包含该分支和票据已执行的构建列表:

这是一套非常强大的工具。您的团队可以使用 Jira 监控任务,您可以在决定是否部署解决方案之前,确保您或任何其他开发人员推送的源代码不会对现有软件造成损害。
如果开发人员推送的代码会对应用程序的行为造成负面影响,而又有足够的自动测试来覆盖它,那么你就能发现问题,因为它将导致 CI 构建失败。