你上次更新你的CI/CD工作流程是什么时候?一年前?从来没有?你并不孤单,我的朋友。重新配置工作流程可能是DevOps从业者最令人生畏的任务之一。
使用并发性和并行性可以大大减少你的构建时间。但你需要知道它们是什么,以及如何在你的配置文件中找到它们。
什么是并发性?
并发意味着多个计算任务在同一时间发生。它在计算中无处不在。我们有这么多事情在同时发生:应用程序在运行,计算机在网络中通信,甚至用户在访问网站。并发是如此普遍,以至于我们很容易认为我们知道它是如何工作的。虽然定义始终保持不变,但并发的实际应用可能有细微差别。那么,在CircleCI中,并发是什么意思?
简单地说,CircleCI中的并发性是指在任何时间点上正在执行的任务的数量。 例如,CircleCI的免费计划提供了一个30的并发性限制,这意味着你可以在同一时间运行多达30个任务。
计算有多少并发任务正在发生,比找出有多少作业正在运行或有多少容器正在使用要复杂一些。管道可以有各种各样的曲折,改变并发任务的数量,比如条件逻辑或测试分割。在这篇文章中,我将专注于如何管理并发性,以及什么时候它是重要的。
什么是并行性?
在写CircleCI的并发性时,很难不谈及并行性。这两个概念经常被混为一谈,但有不同的应用。我们已经知道,并发性是指在工作流程中任何特定时间内执行的任务数量。我们可以通过改变并行性来影响并发性,这就是一些混淆的开始。
并行性将工作在一个特定工作的相同副本之间分割。
平行性最常被用来分割测试套件。所有作业的副本都有相同的指令,但运行时有不同的变量。平行性是在CircleCI配置文件中设置的,平行作业的数量计入你的并发总数。
应用并发性和并行性
下面是一个使用CircleCI免费计划的例子,它的并发数限制为30。假设你有10个作业,每个作业需要1分钟的时间来执行。如果没有并发性,这个工作流程将需要10分钟才能完成。有了并发性,这些作业中的每一个都可以同时运行,工作流将在1分钟内完成,而不是10分钟。如果你将并行性设置为3,你仍然可以同时运行10个作业,并且在并发性限制之内。你可以运行10个作业的3个副本,在1分钟内完成30个总任务。
你也可以很容易地在7个作业上运行4个副本(平行度为4),总共有28个并发任务。免费计划允许最大并行度为4,但如果你真的需要速度,其他计划有更多选择。
如果你有一个同时进行的任务总数超过30的情况,一些工作将不得不等待。例如,如果你在8个作业上将并行性设置为4,其中一个作业(以及它的所有副本)将不得不等待,直到有资源空闲。并行创建的作业副本总是同时运行的,所以即使你只比并发限制多了2个(如本例),一个作业的所有4个副本都将等待,直到另一个作业完成。
如何在你的管道中添加并行性和并发性
大多数时候,你不需要担心并发性问题。并发限制是由你的CircleCI计划设置的,并在后台强制执行。你可能根本不需要管理并发性。最常见的情况是,你将通过使用并行性工作来利用你的并发性。设置并行性很容易:在config.yml中设置并行性键的值。任何大于1的值都意味着你正在运行并行任务。
如何设置并行性
~/.circleci/config.yml
version: 2
jobs:
test:
docker:
- image: cimg/<language>:<version TAG>
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
parallelism: 3
这个例子有一个工作(名为test)在Docker上运行。将parallelism设置为3意味着这个作业的三个副本(称为tasks)将同时运行在三个独立的Docker容器上。这些任务之间的唯一区别是环境变量,这样工作就可以在这些任务之间分工。这最常用于测试拆分,你可以在我们的文档中阅读更多信息。
总结
作为DevOps从业者,我们关心并发性,因为它有助于通过同时运行多个进程来快速完成工作。了解你的计划的并发性限制和所有计入该计划的任务有助于你优化你的构建。
并发可以是一个简单的概念。当至少有一些任务可以同时运行时,这些任务会更快完成。并行性可以帮助你定制哪些任务是同时进行的,并且可以在配置文件中轻松设置。并发和并行都有助于更快地完成任务,这样你就可以开始进行失败、通过和运送软件的重要工作了。