使用 Bitbucket 管道进行 CI

我们花费了大量精力来构建我们的自动化测试和解决方案代码,所有这些努力都是为了帮助我们开发可维护性更强、更可靠的软件。CI 是一种能够整合来自不同来源的代码变更的做法。随着自动化测试的加入,我们一直在编写的所有测试将开始在更大范围内回报我们的辛勤工作。这将有助于防止我们将回归引入主代码库。例如,如果自动测试存在缺陷,CI 流程就会拒绝 git 拉取请求。

有很多 CI 工具,但在本例中,由于我使用 Bitbucket 进行项目的版本控制,我将只使用 Bitbucket Pipelines,因为它已与 Bitbucket Cloud 很好地集成在一起。正如你将看到的那样,它非常易于使用。让我们开始吧:

  1. 在 Bitbucket Cloud 仪表板中,选择您用于项目的存储库,然后单击左侧菜单上的 Pipelines 链接:

    image 2023 10 24 16 15 03 063
    Figure 1. Figure 9.7 – Create your first pipeline
  2. 然后,选择 Build PHP Application 框。您将看到用于创建第一个管道的示例模板:

    image 2023 10 24 16 15 52 433
    Figure 2. Figure 9.8 – Create your first pipeline
  3. 在这里,您将看到一个简单的 .yml 文件;您可以编辑它来运行您的脚本。对于我们的示例项目,您可以使用以下内容:

    bitbucket-pipelines.yml
    image: 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.shcodebase/behat/setup.sh 文件来安装 Symfony 和 Behat 应用程序所需的所有依赖项和库。这包括创建我们在 Symfony 应用程序中使用的 carscars_test 数据库!

  4. 将脚本粘贴到文本区域,然后单击 “提交文件” 按钮。您将被重定向到 “管道” 页面,您将在其中看到正在运行的构建:

    image 2023 10 24 16 22 17 340
    Figure 3. Figure 9.9 – Pipeline running

从前面的截图中你会发现,我们可以在本地机器上构建与我们工作相同的容器。

构建运行需要几分钟时间。在这里,我们希望在 CI 云中发生以下情况:

  1. 创建主机。

  2. 安装运行 docker-compose 所需的必要库。

  3. 构建我们用于解决方案的 Docker 容器。

  4. 安装 Symfony 的 Composer 软件包。

  5. 运行 Symfony 的 Doctrine 数据库迁移。

  6. 执行 Symfony 的 runCoverage.sh 测试脚本。

  7. 确保我们通过所有 Symfony 测试。

  8. 安装 Behat 的 Composer 软件包。

  9. 执行 Behat 的 runBehatTests.sh 测试脚本。

  10. 确保我们通过所有 Behat 测试。

步骤太多了!但我们需要做所有这些事情,以确保我们能像在本地机器上一样运行自动测试。几分钟后,在你的 Build 上查看我们是否通过了 Symfony 测试:

image 2023 10 24 16 25 53 808
Figure 4. Figue 9.10 – CI pass Symfony tests

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

image 2023 10 24 16 26 54 928
Figure 5. Figure 9.11 – CI pass Behat tests

从日志中可以看到,我们通过了与之前在本地开发机器上通过的相同的五个场景!

在这个阶段,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 构建:

image 2023 10 24 16 29 10 962
Figure 6. Figure 9.12 – Jira and Pipelines integrated

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

image 2023 10 24 16 30 07 476
Figure 7. Figure 9.13 – Pipelines builds popup from the Jira page

这是一套非常强大的工具。您的团队可以使用 Jira 监控任务,您可以在决定是否部署解决方案之前,确保您或任何其他开发人员推送的源代码不会对现有软件造成损害。

如果开发人员推送的代码会对应用程序的行为造成负面影响,而又有足够的自动测试来覆盖它,那么你就能发现问题,因为它将导致 CI 构建失败。

总结

在本章中,我们将介绍如何设置更新后的开发环境,其中包含构建示例项目所需的所有测试和解决方案代码。我们创建并使用 shell 脚本来帮助我们安装依赖项、设置数据库和种子数据,以确保我们拥有从本地机器或云中轻松运行测试所需的一切。

我们还创建了第一个 Bitbucket 管道,帮助我们实现持续集成。通过使用 CI,我们可以在云中运行所有自动化测试,确保每次提交和推送变更到分支时不会破坏代码库中的任何内容。

在下一章中,我们将把解决方案部署到外部网络服务器中,在那里我们还可以使用网络浏览器测试应用程序。