如何用CircleCI运行器进行本地测试

700 阅读6分钟

在这篇文章中,你将学习如何在你的本地机器上设置CircleCI runner代理来运行测试。您还将学习如何配置您的CircleCI管道,使运行器被正确调用。

许多开发团队开始他们的CI/CD之旅,有一个本地的构建盒(或六个)来运行他们的测试。例如,在我工作的几个移动团队中,我们有几个Mac Mini盒子,上面插着物理设备,我们用来运行本地UI和单元测试。最终,我们迁移到了基于云的解决方案,这给我们带来了更大的稳定性和许多新的功能。但迁移到云端也意味着我们的本地硬件被淘汰了。我们不得不依靠仿真,或者选择另一个基于云的设备场来进行仿真。

有了CircleCI的运行器,你可以继续使用你自己的设备来运行测试,同时受益于CircleCI云中的其他一切。您还可以将运行器用于需要在您自己的基础设施上运行的测试,用于安全关键的场景,或者当您正在开发自己的硬件。

随着CircleCI免费计划的推出,像运行器这样的功能现在对每个人都可用。在这篇文章中,你将学习如何在你的本地机器上设置CircleCI运行器代理来运行测试。你还将学习如何配置你的CircleCI管道,使运行器被正确调用。

前提条件

本教程假定有一些CircleCI的经验,并了解如何配置管道来构建和测试软件项目。

我已经创建了一个样本项目,展示了运行器的配置。

你也可以在样本项目的CircleCI仪表板中找到它的构建。

注意这个例子显示了一个Android应用程序和测试,在macOS上使用运行器。不过它背后的原则可以普遍适用:适用于iOS应用程序、自定义硬件,或用于不同基础设施上的运行器,如Docker容器、Windows、Linux机器等。

运行器如何工作

运行器是一个安装在你的基础设施上的进程,与CircleCI进行通信。运行器的功能是他们自己的资源类。您的config.yml ,仍然定义了管道、作业和工作流程,但不是使用CircleCI的基于云的资源,如容器和虚拟机,而是在您自己身上执行。

首先,在本地安装运行器代理。这是一个在后台运行的守护进程,检查来自CircleCI的提示。当CircleCI发出信号说必须在运行器上触发一项工作时,代理就会执行该工作负载。它还可以访问与CircleCI的云版本相同的凭证,因此它可以无缝运行,并可以从您的存储库获取代码。

一旦工作完成,结果和任何工件都被送回云服务。只有实际工作的执行是在您的基础设施上完成的。

执行

实施包括这些过程。

  • 在本地设置运行器代理
  • 从你的CircleCI调用运行器config.yml

设置运行器代理

安装运行器代理取决于你所使用的平台。

对于我的示例应用程序,我在一台Mac电脑上安装了运行器代理。

注意这些步骤只是一个简单的概述,不是一个完整的指南。

设置运行器的主要步骤是。

  1. 在你的组织中注册一个新的运行器
  2. 按照你的平台的说明,安装运行器代理
  3. 启动运行器守护程序,并确保它在系统启动时运行

使用circleci CLI工具,在你的组织中注册一个新的运行器。如果这是你的第一个运行器,你可能需要在该组织中创建一个命名空间。你将在CircleCI配置中使用该完全合格的名称来引用该特定的运行器。在我的例子中,那是zan_demos_namespace/mac_runnermac_runner 是运行器的名字,zan_demos_namespace 是我使用的命名空间。

下面是一个命令示例。

$ circleci runner resource-class create zmarkan-demos-namespace/local-mac-runner "Local Mac OS Runner" --generate-token

这个命令还将为这个运行器设置一个新的API令牌,以便在组织中使用CircleCI API。这是由于--generate-token 标志而实现的。请务必存储该令牌以备不时之需。

在向CircleCI注册运行器后,安装运行器代理。该设置需要预装curl,sha256sum,tar, 和gzip 等软件。可能还需要其他软件。

设置一些守护神脚本,并传入这些值。

  • 在上一步中创建的API令牌
  • 运行器的命名空间
  • 你指定的名称

这些项目的具体内容根据你所使用的平台而有所不同。例如,在Mac上,你需要创建一个launchd.plist ,并用launchctl 来启动它。在Linux上,它将是一个新的服务,以systemctl 开始。

从管道中调用运行器

一旦运行器代理开始运行,你可以从.circleci/config.yml 文件中的作业中调用它。请确保指定machine 执行器类型和资源类与你的运行器的命名空间和运行器名称。这里有一个例子。

 runner-test:
    machine: true
    resource_class: zmarkan-demos-namespace/local-mac-runner
    environment:
      JAVA_HOME: /Users/zmarkan/libs/jdk-11.0.2.jdk/Contents/Home
      ANDROID_SDK_ROOT: /Users/zmarkan/Library/Android/sdk
    steps:
      - checkout
      - run:
          name: Run connected check on local runner
          command: |
            ./gradlew connectedDebugAndroidTest

在我的例子中,我有一些安卓设备连接到我的Mac上,所以运行器可以访问这些本地硬件,在上面运行测试。

我还需要传入一些特定的值,这些值在使用CircleCI自己的基础设施时是开箱即用的,比如JAVA_HOMEANDROID_SDK_ROOT 。这是因为它们在CircleCI runner使用的特定shell中不容易访问。在大多数现代Mac上,使用的shell是Zsh;CircleCI默认运行的是Bash。

其余的步骤很简单,取决于你的应用程序和你想执行的内容。在我的例子中,这是从 repo 中检查出代码并运行测试。你也可以使用store_artifactsstore_test_results 来处理测试并保存输出。然后,输出结果将在你的CircleCI云计算仪表板中可用。

总结

在这篇文章中,你已经学会了如何设置一个本地CircleCI运行器,以便在你的本地基础设施上执行CircleCI云工作负载。运行器有许多使用情况,从安全到定制硬件上的执行,都有基于云的CircleCI提供的相同的CI/CD体验。