CircleCI管道是使用YAML语法定义的,它已被许多软件工具和解决方案广泛采用。YAML是一种人类可读的声明性数据结构,用于配置文件(如CircleCI管道的配置文件)和正在存储或传输数据的应用程序中。管道配置文件中的数据指定并控制工作流程和作业在平台上被触发时的执行方式。配置文件中的这些管道指令往往会变得重复,这可能会导致配置语法的数量增加的情况。随着时间的推移,这种数量的增加使得配置更难维护。因为YAML是一种数据结构,只有最小的语法重用能力(锚点和别名)可以用来解决数量增加的问题。锚点和别名太有限了,对于定义CI/CD管道来说是很有用的。幸运的是,CircleCI配置参数功能为封装和重用功能数据提供了强大的能力,否则这些数据将是多余的。
在这篇文章中,我将介绍管道配置参数,并解释在你的管道配置中采用它们的一些好处。
什么是配置参数?
执行者、工作和命令被认为是管道配置文件中的对象。像面向对象编程(OOP)范式中的对象一样,管道对象可以被扩展以提供自定义的功能。CircleCI配置参数让开发人员通过提供创建、封装和重用管道配置语法的方法来扩展执行器、作业和命令的功能。
执行器、作业和命令是具有自己独立属性的对象。参数也有自己独特的属性,可以与对象互动。参数的组成和属性包括。
parameters:
|_ parameter name: (Specify a name the parameter)
|_ description: (Optional. Describes the parameter)
|_ type: (Required. datatype string, boolean, integer, enum)
|_ default: (The default value for the parameter)
复制代码
什么时候应该在流水线配置中使用参数?
当数据和功能在管道内重复时,使用参数。换句话说,如果你的管道中有任何执行者、工作或命令在你的管道中被定义或执行不止一次,我建议识别这些模式或元素,并在你的配置文件语法中把它们定义为参数。使用参数使你有能力集中管理和维护功能,并极大地减少了冗余数据和配置文件中的语法总行数。提供可变参数的能力也是一个好处,而且管道语法的整体可读性也得到了改善。
我如何创建参数?
正如我前面提到的,执行器、作业和命令是可以用参数扩展的配置元素。决定扩展这些元素中的哪一个,将取决于你的具体使用情况。
注意。 参数功能仅在CircleCI 2.1及以上版本中可用。版本必须像这样在配置文件的顶部定义。 version: 2.1
以使参数被平台识别。
让我给你举个例子,在一个jobs:
对象内为并行量定义一个参数。
version: 2.1
jobs:
build_artifact:
parameters:
parallelism_qty:
type: integer
default: 1
parallelism: << parameters.parallelism_qty >>
machine: true
steps:
- checkout
workflows:
build_workflow:
jobs:
- build_artifact:
parallelism_qty: 2
复制代码
在这个例子中,build-artifact:
工作有一个定义为parameters:
的键,名称为parallelism_qty:
。这个参数的数据类型为整数,默认值为1。平行度:键是jobs:
对象的一个属性,定义了在steps:
列表中生成和执行命令的执行器数量。在这种情况下,特殊的checkout
命令将在所有被催生的执行器上执行。该作业的parallelism:
键已被赋予值` " parameters.parallelism_qty ", which references the
parallelism_qty:`参数定义在它上面。这个例子显示了参数如何为你的管道结构增加灵活性,并为集中管理管道语法中重复出现的功能提供了一种方便的方法。
在作业对象中使用参数
使用前面的例子,工作流块中的parallelism_qty:
参数演示了如何在配置语法中使用参数。因为parallelism_qty:
是在一个作业对象中定义的,所以它可以作为工作流中指定的作业来执行。
workflows:
块有一个jobs:
列表,指定了build_artifact:
。它还为parallelism_qty:
赋值为2个执行者,这将催生2个执行者并执行steps:
列表中的命令。如果这个值是3,那么build_artifact作业将产生3个执行器并运行3次命令。
执行器、作业和命令是具有属性的对象,可以在整个管道配置语法中定义、定制和重复使用。
在管道配置中重用执行器对象
上一节演示了如何在作业对象中定义和使用参数。在本节中,我将描述如何在执行器中使用参数。执行者定义了用于执行管道作业和命令的运行时间或环境。执行者对象有一套自己独特的属性,参数可以与之互动。这是一个定义和实现可重用的执行器的例子。
version: 2.1
executors:
docker-executor:
docker:
- image: cimg/ruby:3.0.2-browsers
ubuntu_20-04-executor:
machine:
image: 'ubuntu-2004:202010-01'
jobs:
run-tests-on-docker:
executor: docker-executor
steps:
- checkout
- run: ruby unit_test.rb
run-tests-on-ubuntu-2004:
executor: ubuntu_20-04
steps:
- checkout
- run: ruby unit_test.rb
workflows:
test-app-on-diff-os:
jobs:
- run-tests-on-docker
- run-tests-on-ubuntu-2004
复制代码
这个例子展示了如何在你的管道配置中定义和实现可重用的执行器。我在文件的开头使用了executors:
键来定义2个执行器,一个名为docker-executor:
,一个名为ubuntu_20-04-executor:
。第一个指定使用Docker执行器,第二个指定使用Ubuntu 20.04操作系统镜像的机器执行器。通过这种方式预设执行器,开发者可以创建一个执行器资源列表,用于该管道,并集中管理与执行器类型相关的各种属性。例如,Docker执行器的属性与机器执行器无关,也不能用于机器执行器,因为机器执行器的类型不是docker
。
重用对象将语法量保持在最低水平,同时提供简洁的对象实现,优化代码的可读性和功能的集中管理。
jobs:
块定义了run-tests-on-docker:
和run-tests-on-ubuntu-2004:
;两者都有一个指定的executor:
键,其值被指定为该作业的适当执行器。run-tests-on-docker:
工作使用docker-executor
定义执行其步骤,run-tests-on-ubuntu-2004:
工作在ubuntu_20-04
定义上执行。正如你所看到的,在他们自己的节中预先定义这些执行器,使配置语法更容易阅读,这将使它更容易使用和维护。对执行器的任何修改都可以在各自的定义中进行,并将传播到任何实现它们的作业中。这种对定义的执行器的集中管理也可以适用于以类似方式定义的作业和命令对象。
在workflows:
块中,test-app-on-diff-os:
工作流触发了两个并行的作业,在各自的执行器环境中执行单元测试。当你想了解应用程序在不同操作系统中的表现时,使用不同的执行器运行这些测试是很有帮助的。这种类型的测试是常见的做法。这里的收获是,我只定义了一次执行器,并在多个作业中轻松实现了它们。
可重复使用的命令对象
命令也可以在配置语法中被定义和实现,就像执行器和作业一样。尽管命令对象的属性与执行器和作业不同,但定义和实现它们是相似的。下面是一个显示可重用命令的例子。
version: 2.1
commands:
install-wget:
description: "Install the wget client"
parameters:
version:
type: string
default: "1.20.3-1ubuntu1"
steps:
- run: sudo apt install -y wget=<< parameters.version >>
jobs:
test-web-site:
docker:
- image: "cimg/base:stable"
auth:
username: $DOCKERHUB_USER
password: $DOCKERHUB_PASSWORD
steps:
- checkout
- install-wget:
version: "1.17.0-1ubuntu1"
- run: wget --spider https://www.circleci.com
workflows:
run-tests:
jobs:
- test-web-site
复制代码
在这个例子中,一个可重用的命令已经被定义并由一个作业实现。配置顶部的command:
键定义了一个名为install-wget:
的命令,安装了一个特定版本的wget客户端。在这种情况下,定义了一个参数来指定安装哪个wget的版本号。如果没有指定值,default:
键会安装默认值1.20.3-1ubuntu1
。steps:
键列出了1个run:
命令,该命令安装了versions:
参数中指定的wget版本。versions:
参数是由<< parameters.version >>
变量引用的。
如例子所示,定义的命令可以由工作对象实现和使用。test-web-site:
工作中的步骤节实现了- install-wget:
命令。它的version:
参数被设置为一个较早的、较老的wget版本,而不是默认的版本值。作业中的最后一条run:
命令使用wget来测试来自给定URL的响应。这个例子运行了一个简单的测试,以检查一个网站是否对请求做出响应。
workflows:
块,像往常一样,触发了- test-web-site
作业,它执行了可重复使用的install-wget
命令。就像执行器和作业一样,命令带来了重用代码的能力,集中管理变化,并提高了管道配置文件中语法的可读性。
总结
在这篇文章中,我描述了使用管道参数和可重用的管道对象的基本知识:执行者、作业和命令。主要的收获是。
- 执行器、作业和命令被认为是具有属性的对象,可以在整个管道配置语法中定义、定制和重复使用。
- 重用这些对象有助于将语法量降到最低,同时提供简洁的对象实现,优化代码的可读性和功能的集中管理
尽管我写这篇文章是为了向你介绍参数和可重用对象的概念,但我想鼓励你查看《可重用配置参考指南》。它将帮助你更深入地了解这些功能,以便你能充分利用这些很棒的功能。