开始使用预定管道

159 阅读10分钟

CircleCI的预定管道让你以固定的时间间隔运行管道;每小时、每天或每周。如果你已经使用了预定的工作流程,你会发现用预定的管道来代替它们会给你更多的权力、控制和灵活性。在本教程中,我将指导你了解预定管道如何工作,描述它们的一些很酷的用例,并告诉你如何开始为你的团队设置预定管道。我将演示如何使用API和UI,以及如何从头开始设置预定管道或从预定工作流迁移到它们。

前提条件

以下是您在学习本教程时需要的东西。

你可以在完成这些步骤时使用样本项目

[

请看这个视频演示。CircleCI计划流水线|入门

](www.youtube.com/watch?v=x3r…)
CircleCI developer advocate Zan Markan explains how to use CircleCI scheduled pipelines.

CircleCI开发者倡导者Zan Markan解释了计划管道的工作原理、常见的使用案例以及如何开始。

安排定期构建和测试

安排CI/CD工作有很多原因,而不是在你推送代码到存储库时才执行。安排工作的第一个也是最明显的原因是要定期构建软件。通常,开发团队以外的人(产品经理、QA工程师和其他利益相关者)需要访问你和你的团队正在开发的软件的最新版本。当然,你总是可以根据需要手动触发构建,但这可能会让你和团队中的其他开发人员分心。将这一过程自动化,并将所有利益相关者指向他们可以找到最新的构建的地方,就会容易得多。这适用于从网络应用和移动应用,到后台服务、库,以及两者之间的任何东西。

预定的构建会在夜间或非工作时间自动构建软件,此时没有开发工作。这些夜间构建(有时也被称为)从你的主分支中取出最新的修订版,并产生一个软件的暂存版或测试版。

你可以使用预定的管道来运行整个测试套件,这样夜间构建也会验证你的软件是否工作,并在你开始下一个工作日时准备好等待。排程允许你运行那些昂贵和耗时的功能或集成测试,你不希望在每次提交时都运行。构建不需要每晚都运行。你可以按照适合你的团队的节奏来运行它,每隔几个小时,甚至每小时几次。

安排其他类型的工作

但是,为什么只停留在构建上呢?你也可以安排那些不一定是构建但需要定期发生的工作,比如批处理、数据库备份或重新启动服务。如果它可以被添加到可以访问你的环境的机器上的一个脚本中,它就可以在CI/CD系统中完成。

传统的调度方式--计划工作流

对CircleCI来说,安排工作的能力并不完全是新的。开发团队已经能够将调度作为配置的一部分,在工作流层面上使用cron语法定义时间表。不过,这种方法也有一些缺点。

  • 它需要开发工作来对时间表进行任何修改,甚至需要审查已经存在的时间表。
  • 在CircleCI中,流水线被触发,而不是工作流。
  • 微调权限是困难的,因为并不总是清楚谁安排了被触发的工作。

预定管道如何改善开发人员的经验

以下是预定管道的一些好处。

  • 你可以安排整个管道,包括你想传递的任何管道参数。
  • 通过在配置文件之外处理调度,你可以使用API和UI查询和设置调度。这种能力为管理调度和执行的人提供了更大的灵活性。
  • 调度的管道与上下文一起工作。上下文为你提供了对谁有权限执行和调度某些工作的细粒度控制。你可以把你的部署凭证只给有足够权限的工程师,所以其他人不能设置这些时间表。 上下文也可以与动态配置一起使用,为你的CI/CD设置释放更多的灵活性。

现在我们已经涵盖了关于计划管道的一些基本事实,我们可以实现一个。

实施预定管道

首先,我们需要一个流水线来安排。幸运的是,我有一个项目曾经使用过预定工作流程。它是一个开源的Android库项目,每晚都会进行部署,所以它是调度用例的理想选择。我建议你在GitHub上分叉这个项目,并把它设置为CircleCI上的一个项目。

对于我们的示例计划,我们希望每晚运行一个构建,并将其部署到Sonatype快照库中。这个构建使得任何人都可以使用该仓库,并获得最新鲜的代码。

在我们的.circleci/config.yml -nightly-snapshot 中已经为它定义了一个工作流程。

  parameters:
    run-schedule:
        type: boolean
        default: false

  nightly-snapshot:
    when: << pipeline.parameters.run-schedule >>
    jobs:
      - android/run-ui-tests:
          name: build-and-test
          system-image: system-images;android-23;google_apis;x86
          test-command: ./gradlew assemble sample:connectedDebugAndroidTest
      - deploy-to-sonatype:
          name: Deploy Snapshot to Sonatype
          requires:
            - build-and-test

该工作流有两个工作:一个是运行测试,另一个是部署快照。除了一个when 语句检查run-schedule 管道参数外,管道本身没有调度逻辑。我们的调度器将在触发管道时设置该参数。

使用API来调度管道

要开始使用API进行调度,你需要API令牌。要获得该令牌,请登录CircleCI并点击左下角的头像。点击你的头像可以打开用户设置。导航到个人API令牌,创建一个新的令牌,并把它保存在安全的地方。在示例项目中,有一个build-scheduling 目录,其中有一个文件叫.env.sample 。你可以将该文件复制到.env ,并将占位符替换为你的标记。你应该对.env 文件的其他部分做同样的处理:PROJECT_IDORG_NAME

CIRCLECI_TOKEN=YOUR_CIRCLECI_TOKEN
PROJECT_ID=YOUR_PROJECT_ID
ORG_NAME=YOUR_VCS_USERNAME
VCS_TYPE=github

设置好环境变量后,我们就可以进行API调用了。计划管道使用CircleCI API v2。 要发布一个新的计划,你需要向端点发出POST请求。该端点由你的CircleCI项目、你的用户名和你的VCS提供者组成。这里有一个例子。https://circleci.com/api/v2/project/github/zmarkan/android-espresso-scrollablescroll/schedule

这个来自setup_nightly_build.js 脚本的POST调用例子使用了Axios JavaScript库。

const token = process.env.CIRCLECI_TOKEN

axios.post("https://circleci.com/api/v2/project/github/zmarkan/android-espresso-scrollablescroll/schedule", {
    name: "Nightly build",
    description: "Builds and pushes a new build to Sonatype snapshots every night. Like clockwork.",
        "attribution-actor": "system",
        parameters: {
          branch: "main",
          "run-schedule": true
        },
        timetable: {
            per_hour: 1,
            hours_of_day: [1],
            days_of_week: ["TUE", "WED", "THU", "FRI", "SAT"]
        }
    },{
        headers: { 'circle-token': token }
    }
)

主体有效载荷包含日程表名称(必须是唯一的)和一个可选的描述。它包括一个归属行为者,可以是system ,代表一个中立行为者,也可以是current ,代表你当前用户的权限(根据你使用的token)。有效载荷还包括一些参数,比如在触发管道时使用哪个分支,以及你所设置的任何其他参数。本教程在配置文件中使用run-schedule 。主体的最后一部分是timetable ,这是我们定义何时和多长时间运行我们的计划管道的地方。这里要使用的字段是per_hour,hours_of_day, 和days_of_week 。请注意,这不需要一个cron表达式,这使得人类在推理API时更容易解析它。

在页眉中,我们将使用先前在CircleCI用户界面中生成的令牌传递一个circle-token

在时间表中,我们把一切都设置为在星期二至星期六的凌晨1点(UTC)运行,即工作结束后的晚上。我们不需要在周日和周一运行,因为在我们的例子项目中,没有人在周末工作。代码库在那几天不会有变化。

除了POST方法外,API还提供了其他方法,如GET、DELETE和PUT,用于检索、删除和更新时间表。在资源库中,有get_schedules.jsdelete_schedule.js 的样本。

使用GUI

不使用API,你可以在CircleCI的仪表板上设置计划管道。在CircleCI的项目中,进入项目设置,并从左边的菜单中选择触发器

点击 "添加预定触发器",打开页面,你可以设置一个新的预定管道。该表格有与API相同的选项:触发器名称、星期几、开始时间、参数、归属用户,以及其他。

点击保存触发器来激活它。触发器将准备好在你指定的日期和时间开始调度你的管道。

Trigger set up in the GUI

从预定的工作流程迁移

到目前为止,我们已经探索了设置管道,并使用API和GUI审查它们。现在,我们可以专注于将你现有的预定工作流程迁移到更有利的预定管道。

这个例子显示了一个预定工作流,所有的东西都在配置文件中定义。它包括工作流定义中的触发器配置,通过cron表达式传入时间表。

nightly-snapshot:
    triggers: #use the triggers key to indicate a scheduled build
      - schedule:
          cron: "0 0 * * *" # use cron syntax to set the schedule
          filters:
            branches:
              only:
                - main
    jobs:
      - android/run-ui-tests:
          name: build-and-test
          system-image: system-images;android-23;google_apis;x86
          test-command: ./gradlew assemble sample:connectedDebugAndroidTest
      - deploy-to-sonatype:
          name: Deploy Snapshot to Sonatype
          requires:
            - build-and-test

在我们的例子中,这是在每天的午夜运行,我们希望只在主分支上触发它。

要迁移,有几个步骤需要完成。

  1. 触发预定管道中现有的nightly-snapshot 工作流。
  2. 引入一个新的流水线变量,称为run-schedule ,就像我们在第一个例子中做的那样。
  3. 对于所有的工作流程,添加when 表达式,表明当run-scheduletrue 时运行它们,除非run-schedulefalse ,否则不要运行其他工作流程。
parameters:
  run-schedule:
    type: boolean
    default: false

workflows:
  build-test-deploy:
    when:
      not: << pipeline.parameters.run-schedule >>
    jobs:
      ...

  nightly-snapshot:
    when: << pipeline.parameters.run-schedule >>
    jobs:
      ...

其余的过程与从头开始设置时相同。

  1. 解决cron表达式;你可以使用像这样的在线工具
  2. 使用API或GUI,用新的时间表配置,以及run-schedule 管道参数来设置时间表。

总结

预定管道是你的CI/CD工具包的一个多功能组件,允许你。

  • 在循环基础上触发你的构建
  • 利用管线参数
  • 对谁可以设置管道进行微调控制
  • 明确定义使用CircleCI上下文运行时所需要的权限

在本教程中,你已经了解了预定管道在CircleCI中如何工作,以及如何设置它们,无论是从头开始还是从预定工作流程移植。我们还涵盖了如何使用API和Web UI,并回顾了一些使用案例,让你开始。

让我们知道你和你的团队如何使用预定管道,移植你的预定工作流程,或者如果你想看到任何增加的用户界面或API功能。

如果你对我接下来要讲的话题有任何反馈或建议,请在Twitter上联系我- @zmarkan