使用工作安排作业

工作流通过更快的反馈、更短的重新运行和更有效地使用资源来帮助您提高软件开发的速度。本文档描述了工作流特性,并在以下部分提供了示例配置:

概述

一个工作流程是定义作业的集合和他们的运行秩序的一套规则。工作流支持使用一组简单的配置键来帮助您解决故障迟早复杂的工作流程。

随着工作流程,您可以:

  • 使用实时状态反馈独立运行和故障排除作业。
  • 为应该只定期运行的作业调度工作流。
  • 扇出以并发地运行多个作业以进行有效的版本测试。
  • 扇入以快速部署到多个平台。

例如,如果只有一个在工作流程中作业失败,你就会知道它是实时的失败。与其浪费时间等待整个构建失败并重新运行整个作业集的,你可以重新运行只是失败的工作

工作流可能以下列状态之一出现:

状态 描述
运行 工作流程正在进行中
没有运行 工作流从未启动过
取消 工作流在完成之前被取消
失败 工作流中的作业失败
失败的 在工作流程中一个或多个作业失败
成功 工作流程中的所有作业均成功完成
搁置 在工作流程的作业,正等待审批
NEEDS SETUP 目录中没有包含工作流节或不正确config.yml文件中查找该项目

限制

  • 有管道项目启用可以使用CircleCI API来触发工作流程。
  • 没有工作流的配置需要调用作业建立

请参阅工作流常见问题的其他信息和限制部分。

工作流配置示例

为一个完整的规格工作流程键,看到工作流在配置CircleCI文档的部分。

注意:与工作流配置的项目往往包括多个就业岗位,对码头工人的图像,环境变量,或共享语法运行步骤。参考的YAML锚/别名如何别名和重用语法保持文档的信息,请.circleci / config.yml文件小。查看在CircleCI配置中重用YAML为摘要的博客文章。

要运行一组并行作业,增加一个新的工作流程:部分现有的结束.circleci / config.yml与版本和一个唯一的名称为工作流文件。下面的示例.circleci / config.yml文件显示具有两个并发作业的默认工作流编排。通过使用工作流程:关键的命名build_and_test并通过嵌套工作:与作业名称列表键。该工作没有相关性定义,因此他们会同时运行。

工作:建立:码头工人:-图像:circleci / <语言>:<版本TAG>AUTH:用户名:mydockerhub-user密码:$ DOCKERHUB_PASSWORD#上下文/项目UI env-var引用脚步:-结帐-运行:<命令>测试:码头工人:-图像:circleci / <语言>:<版本TAG>AUTH:用户名:mydockerhub-user密码:$ DOCKERHUB_PASSWORD#上下文/项目UI env-var引用脚步:-结帐-运行:<命令>工作流程:版本:2build_and_test:工作:-建立-测试

查看并行工作流配置示例对于一个完整的例子。

提示高级配置

使用工作流使用户能够在运行一组的工作创造更加高级的配置。然而,随着越来越多的定制和控制来更容易出现错误。当使用工作流尽量做到以下几点:

  • 将最快的工作移到工作流程的开始。例如,应该在长时间运行、计算开销更大的任务之前进行lint或语法检查。
  • 使用在一个“设置”工作开始工作流可以帮助做一些预检和填充下列所有作业工作区。

考虑阅读优化高级配置有关改进配置的更多技巧的文档。

顺序作业执行示例

下面的例子显示了四个连续工作的工作流。的作业能够根据配置的要求运行,每个作业等待开始直到成功地在图中所示的所需的作业完成。

连续的作业流程执行”></p>
      <p>以下<code class=config.yml代码段是为连续作业执行配置的工作流的一个例子:

工作流程:版本:2build-test-and-deploy:工作:-建立-TEST1:需要:-建立-TEST2:需要:-TEST1-部署:需要:-TEST2

属性定义依赖项要求:键如图所示。的部署:作业将不会运行,直到建立TEST1TEST2工作顺利完成。作业必须等到依赖图中所有上游作业已经运行。所以部署作业等待TEST2工作,TEST2作业等待TEST1工作和TEST1作业等待建立的工作。

查看样例顺序工作流配置对于一个完整的例子。

扇出/扇入工作流的例子

所示的示例工作流运行一个公共构建作业,然后扇入并发地运行一组验收测试作业,最后扇入运行一个公共部署作业。

扇出和扇入工作流程”></p>
      <p>以下<code class=config.yml代码段是一个为扇出/扇入作业执行配置的工作流示例:

工作流程:版本:2build_accept_deploy:工作:-建立-acceptance_test_1:需要:-建立-acceptance_test_2:需要:-建立-acceptance_test_3:需要:-建立-acceptance_test_4:需要:-建立-部署:需要:-acceptance_test_1-acceptance_test_2-acceptance_test_3-acceptance_test_4

在这个例子中,只要建立任务成功完成,所有四个验收测试工作启动。的部署作业必须等待所有四个验收测试作业成功完成后才能启动。

查看扇入/扇出工作流配置示例对于一个完整的例子。

持有用于手动审批的工作流

可以将工作流配置为等待作业的人工批准,然后再继续下一个作业。任何对存储库有推访问权的人都可以单击Approval按钮继续工作流。属性中添加一个作业工作使用键列表类型:批准。让我们来看一个评论配置实例。

#...#<<你的配置的构建,为test1,Test2和部署工作>>#...工作流程:版本:2编译 - 测试和批准部署:工作:-建立#从你的配置自定义的作业,即构建你的代码-TEST1:#您的定制工作;运行测试套件1需要:在“构建”任务完成之前,# test1将不会运行。-建立-TEST2:#另一个自定义的工作;运行测试套件2,需要:#TEST2是依赖于工作`test1`成功-TEST1-持有:#这将需要在CircleCI web应用人工审批<<<作业。类型:批准#<<<该键值对将您的工作流程设置的状态“挂起”需要:#我们只在test2成功时运行“hold”作业-TEST2#在“持有”作业得到批准后,将运行需要“持有”作业的任何后续作业。#在本例中,用户手动触发部署作业。-部署:需要:-持有

上述例子的结果是部署:单击后,作业才会运行持有工作在CircleCI应用程序的工作流程页,然后点击批准。在本实施例的目的持有任务是等待批准开始部署。一个工作在被发布后最多可以被批准15天。

在工作流中使用手动审批时,请记住以下几点:

  • 批准是一种特殊的工作类型吗只要提供给下工作工作流程关键
  • 持有作业必须是唯一的名称,其他任何作业都不能使用。
  • 也就是说,您的自定义配置工作,如建立要么TEST1在上述的例子将不给出对其的类型:批准关键。
  • 工作的名称可以是任意的——可以是任意的等待要么暂停例如,只要工作有一个类型:批准它的关键。
  • 所有工作是运行手动批准后工作必须要求:该作业的名称。请参阅部署:工作在上面的例子。
  • 直到工作流程定义的顺序运行的作业流程与工作类型:批准关键,然后是它所依赖的工作。

下面的屏幕截图演示了一个暂停的工作流。

暂停工作流中已批准的作业”></p>
      <p class=切换组织菜单”></p>
      <p>通过点击挂起作业的名称(<code class=建立在上面的截图),批准对话框,要求您批准或取消固定工作。

批准后,工作流的其余部分运行遵医嘱。

安排一个工作流

为每个分支的每个提交运行工作流可能是低效且昂贵的。相反,您可以为特定的分支安排工作流在特定的时间运行。这将禁止提交触发那些分支上的作业。

考虑运行的工作流程是资源密集型或产生按计划报告,而不是在每一个加入提交触发器配置的关键。的触发器关键是只要在加入您的工作流程关键。此特性使您能够通过使用来调度运行的工作流cron表示指定分支的协调通用时间(UTC)的语法。

注意:在CircleCI v2.1中,当配置中没有提供工作流时,将使用隐式工作流。但是,如果您声明一个工作流来运行预定的构建,隐式工作流将不再运行。您必须将作业工作流添加到配置中,以便CircleCI也能在每个提交上构建。

注意:请注意,当你安排工作流程,工作流将被算作一个单独的用户座位。

夜间的例子

默认情况下,在每个节点上触发工作流混帐推。要触发一个调度中的工作流,请添加触发器关键工作流程和指定时间表

在下面的示例中,每晚工作流被配置为每天在UTC时间中午12点运行。的cronkey使用POSIX指定crontab中语法,看crontab的手册页cron语法基础知识。工作流将在公测分支机构。

注意:预定的工作流程可能会延迟至多15分钟。这样做是为了在繁忙时间(如中午12点UTC)维护可靠性。计划的工作流不应该假设它们以精确到分钟的方式开始。

工作流程:版本:2提交:工作:-测试-部署每晚:触发器:-时间表:cron:00***”过滤器:分支机构:只要:--公测工作:-报道

在上面的例子中,提交工作流没有触发器键和将运行在每个混帐推。的每晚工作流程提供触发器,并将运行在指定的时间表

指定一个有效的时间表

一个有效的时间表需要一个cron键和一个过滤器关键。

的价值cron密钥必须是一个有效的crontab条目

注意:的Cron步骤语法(例如,* / 1,20 * /)是支持。以逗号分隔的元素列表中的Range元素也是支持。

的价值过滤器密钥必须是一个地图,定义特定的分支执行规则。

有关详细信息,请参阅分支机构部分的配置CircleCI文档。

对于一个完整的配置示例,请参阅计划工作流配置示例

在你的流程中使用上下文和过滤

以下部分提供了使用上下文和筛选器管理作业执行的示例。

使用作业上下文共享环境变量

下面的示例演示与使用上下文来共享环境变量四个连续作业的工作流。查看上下文文档在应用此设置的详细说明。

以下config.yml段是一个连续的作业的示例的工作流被配置为使用在所定义的资源org-global背景:

工作流程:版本:2build-test-and-deploy:工作:-建立-TEST1:需要:-建立上下文:org-global-TEST2:需要:-TEST1上下文:org-global-部署:需要:-TEST2

环境变量设置定义上下文如图所示,默认名称关键org-global。的TEST1TEST2该工作流示例中的作业在由组织的一部分用户发起时将使用相同的共享环境变量。默认情况下,组织中的所有项目都可以访问该组织设置的上下文。

科级作业执行

下面的示例显示了在三个分支上配置作业的工作流:Dev、Stage和Pre-Prod。工作流将忽略分支机构嵌套在键工作配置,因此如果您使用作业级别分支并在以后添加工作流,则必须在作业级别删除分支,而在您的工作流部分声明它config.yml, 如下:

科级作业执行”></p>
      <p>以下<code class=config.yml代码段是一个为分支级作业执行配置的工作流示例:

工作流程:版本:2dev_stage_pre-PROD:工作:-test_dev:过滤器:#使用正则表达式过滤器需要整个分支匹配分支机构:只要:#只有匹配下面regex过滤器的分支才会运行-dev-/用户——。* /-test_stage:过滤器:分支机构:只要:阶段-test_pre-prod:过滤器:分支机构:只要:/ pre-prod(?: - +) ? /美元

有关正则表达式的更多信息,请参阅使用正则表达式过滤标记和分支下面的部分。

有关工作流的完整示例,请参见配置文件对于带有分支项目的样例顺序工作流。

执行工作流程的一个Git标签

除非您显式地指定标记过滤器,否则CircleCI不会为标记运行工作流。此外,如果一份工作需要其他工作(直接或间接),你必须使用正则表达式为这些作业指定标记筛选器。同时支持轻量级和带注释的标记。

在下面的例子中,两个工作流定义为:

  • untagged-build运行建立工作的所有分支。
  • tagged-build运行建立所有分支机构所有标签以v
工作流程:版本:2untagged-build:工作:-建立tagged-build:工作:-建立:过滤器:标签:只要:/^v.*/

在下面的示例中,定义了两个作业build-n-deploy工作流程:

  • 建立作业为所有分支和所有标记运行。
  • 部署作业不运行分支,只运行以“v”开头的标记。
工作流程:版本:2build-n-deploy:工作:-建立:过滤器:#必须的,因为`deploy`有标记过滤器,需要`build`标签:只要:/.*/-部署:需要:-建立过滤器:标签:只要:/^v.*/分支机构:忽略:/.*/

在下面的例子中,三个作业是用定义编译 - 测试 - 部署工作流程:

  • 建立作业为所有分支运行,并且只运行以' config-test '开头的标记。
  • 测试作业为所有分支运行,并且只运行以' config-test '开头的标记。
  • 部署作业不运行分支,只运行以' config-test '开头的标记。
工作流程:版本:2编译 - 测试 - 部署:工作:-建立:过滤器:#必须的,因为`test`有标记过滤器,需要`build`标签:只要:/ ^ config-test。* /-测试:需要:-建立过滤器:# required,因为“deploy”有标签过滤器,需要“test”标签:只要:/ ^ config-test。* /-部署:需要:-测试过滤器:标签:只要:/ ^ config-test。* /分支机构:忽略:/.*/

在下面的示例中,定义了两个作业(测试部署)和三个工作流程利用这些工作:

  • 建立工作流为所有分支运行,除了主要并不是在标签上运行。
  • 暂存工作流将只在运行主要分支,而不是在标签上运行。
  • 生产对于没有分支,只用于开头为标签的工作流程运行v。
工作流程:建立:这个工作流将在除“main”之外的所有分支上运行,不会在标签上运行工作:-测试:过滤器:分支机构:忽略:主要暂存:#该工作流将只在“主”运行,并且不会在标签上运行工作:-测试:过滤器:&filters-staging#这个yaml锚定器将这些值设置为“过滤器-暂存”分支机构:只要:主要标签:忽略:/.*/-部署:需要:-建立过滤器:<<:* filters-staging#这是调用预先设定的YAML锚生产:这个工作流将只在标签上运行(特别是以'v.'开始),而不会在分支上运行工作:-测试:过滤器:&filters-production#这个yaml锚将这些值设置为“过滤器生成”分支机构:忽略:/.*/标签:只要:/^v.*/-部署:需要:-建立过滤器:<<:* filters-production#这是调用预先设定的YAML锚

注意:Webhook有效负载来自GitHub最多5MB对于一些事件最多3个标签。如果你同时推送几个标签,CircleCI可能不会收到所有的标签。

使用正则表达式过滤标记和分支

CircleCI分支和标签过滤器支持正则表达式模式匹配的Java的变种。当编写过滤器,CircleCI精确匹配的正则表达式。

例如,只:/ ^ config-test /仅匹配config-test标签。匹配所有标签config-test,使用只:/ ^ config-test。* /代替。

使用标签语义版本是一种常见的情况。为了配合补丁版本3-7 2.1版本的,你可以写/ ^版本2 \。1 \[3 - 7]。/

有关模式匹配规则的详细信息,请参见java.util.regex中的文档

使用工作区在作业之间共享数据

每个工作流都有一个相关联的工作空间,可以在工作流进行时将文件传输到下游作业。工作区是数据的唯一添加存储。作业可以将数据持久化到工作空间。此配置将对数据进行归档,并在非容器存储区中创建一个新层。下游作业可以将工作区附加到它们的容器文件系统上。附加工作空间可以根据工作流图中上游作业的顺序下载和解包每一层。

工作空间数据流”></p>
      <p>使用工作区来传递下去所特有的这种运行,这是需要下游的就业数据。工作流包括多个分支正在运行的作业可能需要数据使用工作区共享。工作区也是有用的用于在其中收集的数据由测试容器中使用的项目。</p>
      <p>例如,Scala项目通常需要大量CPU来编译构建作业。相比之下,Scala测试作业不是cpu密集型的,可以很好地跨容器并行化。对构建作业使用更大的容器,并将编译后的数据保存到工作区中,这样测试容器就可以从构建作业中使用编译后的Scala。</p>
      <p>第二个例子是有一个项目<code class=建立构建jar并将其保存到工作区的作业。的建立工作向外扩散集成测试,单元测试代码覆盖使用jar并发运行这些测试。

要持久化作业中的数据并使其对其他作业可用,请将作业配置为使用persist_to_workspace关键。目录中命名的文件和目录路径:的属性persist_to_workspace将被上传到工作流的临时工作空间相对与指定的目录关键。然后上传文件和目录,供后续作业(以及工作流的重新运行)使用。

配置工作,通过配置得到保存数据attach_workspace关键。以下config.yml文件定义了两个职位,其中下游的工件的工作。工作流程配置是连续的,从而使下游需要完成之后,才能开始。

#注意下列节使用CircleCI 2.1尽量使用可重复使用的执行者#这样定义泊坞窗图像跨越作业重用。访问//www.drag240sx.com/docs/2.0/ reusing-config/#authoring-reus-executescher.com了解更多信息。版本:2.1执行人:my-executor:码头工人:-图像:buildpack-deps:杰西AUTH:用户名:mydockerhub-user密码:$ DOCKERHUB_PASSWORD#上下文/项目UI env-var引用working_directory:/ tmp工作::执行者:my-executor脚步:-运行:mkdir - p工作区-运行:回声“Hello, world !”>工作区/ echo-output#坚持指定的路径(工作区/回波输出)到工作区中用于下游作业中使用。-persist_to_workspace:必须是working_directory的绝对路径或相对路径。这是容器上的一个目录#取为工作空间的根目录下。:工作空间#必须是从根相对路径路径:-echo-output下游:执行者:my-executor脚步:-attach_workspace:必须是working_directory的绝对路径或相对路径:/ tmp /工作区-运行:|如果[[' cat /tmp/workspace/echo-output ' == "Hello, world!"]];然后回声“它的工作!”其他回应“不!”;出口1fi工作流程:版本:2btd:工作:--下游:需要:-

对于使用工作区通过构建和部署作业之间的数据的活生生的例子,见config.yml它被配置为构建CircleCI文档。

有关使用工作区、缓存和工件的其他概念性信息,请参考在工作流中持久化数据:何时使用缓存、工件和工作区博客文章。

重新运行工作流程的作业失败

当您使用工作流时,您提高了快速响应失败的能力。只重新运行工作流的失败工作,单击工作流在应用程序图标,然后选择一个工作流来查看每个作业的状态,然后点击重新运行按钮,然后选择重新从失败

CircleCI工作流程页面”></p>
      <h2 id=故障排除

本节介绍了工作流的常见问题和解决方案。

工作流和后续作业不会触发

如果您没有看到您的工作流触发,一个常见的原因是配置错误阻止工作流启动。因此,工作流不会启动任何作业。导航到项目的管道,并单击工作流名称,以识别可能失败的部分。

重新运行工作流失败

我们观察到,在某些情况下,在工作流运行之前(在管道处理期间)会发生故障。在这种情况下,重新运行工作流将失败,即使它在停机之前是成功的。要解决这个问题,可以向项目存储库推送一个更改。这将首先重新运行管道处理,然后运行工作流。

工作流程等待在GitHub的状态

如果您已经在GitHub存储库的一个分支上实现了工作流,但是状态检查从未完成,那么可能需要取消在GitHub中的状态设置。例如,如果您选择保护您的分支,您可能需要取消选择CI / circleci地位的关键,因为这支票是指默认CircleCI 1.0检查,具体如下:

取消选中状态GitHub的钥匙”></p>
      <p>有<code class=CI / circleci当使用工作流时,启用复选框将阻止在GitHub中显示完成状态,因为CircleCI将状态通过一个键发送到GitHub,该键包含任务的名称。

进入设置>在GitHub的分行,并单击保护分支的编辑按钮取消设置,例如https://github.com/your-org/project/settings/branches。

另请参阅

  • 了解从1.0迁移时如何在配置中添加工作流的过程说明circle.yml文件到2.0.circleci / config.yml文件中,看到了步骤配置工作流的迁移的部分为1.0至2.0的文档。

  • 有关工作流的常见问题和答案,请参阅工作流常见问题的部分。

  • 有关配置工作流的演示应用程序,请参阅CircleCI演示工作流程在GitHub上。

视频:配置多个作业与工作流

视频:如何安排构建来自动测试和部署