迁移 Zuul V2 CI 任务到 V3¶
OpenStack CI 系统已从 Zuul v2 迁移到 Zuul v3,所有 CI 任务也已迁移到新的 CI 系统。所有任务都已自动迁移到与 Zuul v3 兼容的格式;但是,以这种方式生成的任务并非最佳,并且未使用 Zuul v3 引入的功能,这些功能允许以 Ansible roles 的形式重用任务部分,以及任务之间的继承。
DevStack 托管一组 roles、plays 和 jobs,其他仓库可以使用它们来定义基于 DevStack 的 jobs。为了充分利用它们,必须将任务从旧的 v2 格式迁移到 v3 原生格式。
本文档提供指导和示例,以使迁移过程尽可能无痛且顺利。
在哪里托管任务定义。¶
在 Zuul V3 中,任务可以定义在包含它们所执行代码的仓库中。如果您正在为 OpenStack 服务编写 CI 任务,可以将基于 DevStack 的 CI 任务定义在托管服务代码的仓库之一中。如果您有一个无分支仓库,例如 Tempest 插件,那么这将是一个方便的选择来托管任务定义,因为不需要将任务更改回移植。例如,请参阅 sahara Tempest 插件仓库中的 .zuul.yaml 的开头
# In https://opendev.org/openstack/sahara-tests/src/branch/2025.2/.zuul.yaml:
- job:
name: sahara-tests-tempest
description: |
Run Tempest tests from the Sahara plugin.
parent: devstack-tempest
从哪个基础任务开始¶
如果您的任务需要通过 DevStack 部署的 OpenStack 云,但您不计划运行 Tempest 测试,可以从 DevStack 仓库中定义的其中一个基础 任务 开始。
devstack 任务可用于单节点任务和多节点任务,并且它包含集成网关中使用的服务列表(keystone、glance、nova、cinder、neutron 和 swift)。可以通过切换子任务中使用的 nodeset 来实现不同的拓扑。
devstack-base 任务类似于 devstack,但它没有指定要在 DevStack 中运行的任何必需的仓库或服务。它可以用于设置使用非常狭窄的 DevStack 设置的子任务。
如果您的任务需要通过 DevStack 部署的 OpenStack 云,并且您计划运行 Tempest 测试,可以从 Tempest 仓库中定义的其中一个基础任务开始。
devstack-tempest 任务可用于单节点任务和多节点任务。可以通过切换子任务中使用的 nodeset 来实现不同的拓扑。
可以按以下方式自定义任务,而无需编写任何 Ansible 代码
添加和/或删除 DevStack 服务
添加或修改 DevStack 和服务的配置
安装 DevStack 插件
扩展子节点的数量(仅限多节点)
定义要上传到 logs.o.o 的额外的日志文件和/或目录
定义要重写为 .txt 以方便访问的额外的日志文件扩展名
Tempest 任务可以进一步自定义如下
定义要使用的 Tempest tox 环境
定义测试并发性
定义测试正则表达式
通过添加预置和/或后置 playbook,或导入现有的自定义 roles 和 jobs,可以进一步扩展任务
添加预置和/或后置 playbook
覆盖运行 playbook,添加自定义 roles
以下(部分)示例在 Kuryr 仓库中扩展了 Tempest 单节点基础任务“devstack-tempest”。父任务名称在 job.parent 中定义。
# https://opendev.org/openstack/kuryr-kubernetes/src/branch/2025.2/.zuul.d/base.yaml:
- job:
name: kuryr-kubernetes-tempest-base
parent: devstack-tempest
description: Base kuryr-kubernetes-job
required-projects:
- openstack/devstack-plugin-container
- openstack/kuryr
- openstack/kuryr-kubernetes
- openstack/kuryr-tempest-plugin
- openstack/neutron-lbaas
vars:
tempest_test_regex: '^(kuryr_tempest_plugin.tests.)'
tox_envlist: 'all'
devstack_localrc:
KURYR_K8S_API_PORT: 8080
devstack_services:
kubernetes-api: true
kubernetes-controller-manager: true
kubernetes-scheduler: true
kubelet: true
kuryr-kubernetes: true
(...)
devstack_plugins:
kuryr-kubernetes: https://opendev.org/openstack/kuryr
devstack-plugin-container: https://opendev.org/openstack/devstack-plugin-container
neutron-lbaas: https://opendev.org/openstack/neutron-lbaas
tempest_plugins:
- kuryr-tempest-plugin
(...)
任务变量¶
可以在三个不同的位置向任务添加变量
job.vars:这些是 nodeset 中所有节点都可用的全局变量
job.host-vars.[HOST]:这些变量仅对指定的 HOST 可用
job.group-vars.[GROUP]:这些变量仅对指定的 GROUP 可用
Zuul 通过任务继承合并字典变量。主机和组变量会覆盖定义为全局变量的同名变量。
在下面的示例中,对于 sundaes 任务,不属于 subnode 组的主机会运行 vanilla 和 chocolate。subnode 组中的主机将运行 stracciatella 和 strawberry。
- job:
name: ice-creams
vars:
devstack_service:
vanilla: true
chocolate: false
group-vars:
subnode:
devstack_service:
pistacchio: true
stracciatella: true
- job:
name: sundaes
parent: ice-creams
vars:
devstack_service:
chocolate: true
group-vars:
subnode:
devstack_service:
strawberry: true
pistacchio: false
DevStack 网关标志¶
旧的 CI 系统使用 DevStack、Tempest 和 devstack-gate 的组合来设置测试环境并对其运行测试。使用 Zuul V3,以前位于 devstack-gate 中的逻辑已移动到不同的仓库,包括 DevStack、Tempest 和 grenade。
Devstack-gate 暴露了一个基于许多 DEVSTACK_GATE_* 环境变量或标志的任务定义接口。本指南说明如何将 DEVSTACK_GATE 标志映射到新系统。
repo 列指示托管替换 devstack-gate 标志的代码的仓库。新实现列解释了如何在 Zuul v3 任务中重现相同或类似的行为。对于 localrc 设置,devstack-gate 定义了一个默认值。在 ansible jobs 中,默认值是父任务中定义的值,或者 DevStack 中的默认值(如果有)。
DevStack 网关标志 |
仓库 |
新实现 |
|---|---|---|
OVERRIDE_ZUUL_BRANCH |
zuul |
在任务定义中 override-checkout: [branch]。 |
DEVSTACK_GATE_NET_OVERLAY |
zuul-jobs |
为从 multinode 继承的所有任务设置了一个名为 br-infra 的桥接,并具有一个专门的 桥接 role。 |
DEVSTACK_CINDER_VOLUME_CLEAR |
devstack |
任务变量中的 devstack_localrc 中的 CINDER_VOLUME_CLEAR: true/false。 |
DEVSTACK_GATE_NEUTRON |
devstack |
默认情况下为 True。要禁用,请在任务定义中的 devstack_services 中禁用所有 neutron 服务。 |
DEVSTACK_GATE_CONFIGDRIVE |
devstack |
任务变量中的 devstack_localrc 中的 FORCE_CONFIG_DRIVE: true/false。 |
DEVSTACK_GATE_INSTALL_TESTONLY |
devstack |
任务变量中的 devstack_localrc 中的 INSTALL_TESTONLY_PACKAGES: true/false。 |
DEVSTACK_GATE_VIRT_DRIVER |
devstack |
任务变量中的 devstack_localrc 中的 VIRT_DRIVER: [virt driver]。 |
DEVSTACK_GATE_LIBVIRT_TYPE |
devstack |
任务变量中的 devstack_localrc 中的 LIBVIRT_TYPE: [libvirt type]。 |
DEVSTACK_GATE_TEMPEST |
devstack 和 tempest |
由使用的任务定义。 |
DEVSTACK_GATE_TEMPEST_FULL |
tempest |
任务变量中的 tox_envlist: full。 |
DEVSTACK_GATE_TEMPEST_ALL |
tempest |
tox_envlist: all 在任务变量中。 |
DEVSTACK_GATE_TEMPEST_ALL_PLUGINS |
tempest |
tox_envlist: all-plugin 在任务变量中。 |
DEVSTACK_GATE_TEMPEST_SCENARIOS |
tempest |
tox_envlist: scenario 在任务变量中。 |
TEMPEST_CONCURRENCY |
tempest |
任务变量中的 tempest_concurrency: [value]。这仅在从 |
DEVSTACK_GATE_TEMPEST_NOTESTS |
tempest |
任务变量中的 tox_envlist: venv-tempest。这将创建 Tempest 虚拟环境,但不会运行任何测试。 |
DEVSTACK_GATE_SMOKE_SERIAL |
tempest |
任务变量中的 tox_envlist: smoke-serial。 |
DEVSTACK_GATE_TEMPEST_DISABLE_TENANT_ISOLATION |
tempest |
任务变量中的 tox_envlist: full-serial。任务变量中的 TEMPEST_ALLOW_TENANT_ISOLATION: false。 |
以下标志尚未迁移或已过时,将不会迁移。
DevStack 网关标志 |
状态 |
细节 |
|---|---|---|
DEVSTACK_GATE_TOPOLOGY |
WIP |
拓扑取决于使用的基础任务,更具体地说取决于附加到它的 nodeset。新的任务格式允许项目定义传递到拓扑中存在的每个节点/节点组的变量。可以以基础任务的形式定义包含 nodeset 和匹配变量的命名拓扑。 |
DEVSTACK_GATE_GRENADE |
TBD |
Grenade Zuul V3 任务将托管在 grenade 仓库中。 |
GRENADE_BASE_BRANCH |
TBD |
Grenade Zuul V3 任务将托管在 grenade 仓库中。 |
DEVSTACK_GATE_NEUTRON_DVR |
TBD |
取决于多节点支持。 |
DEVSTACK_GATE_EXERCISES |
TBD |
可以按需完成。 |
DEVSTACK_GATE_IRONIC |
TBD |
这可能将在 ironic 侧实现。 |
DEVSTACK_GATE_IRONIC_DRIVER |
TBD |
这可能将在 ironic 侧实现。 |
DEVSTACK_GATE_IRONIC_BUILD_RAMDISK |
TBD |
这可能将在 ironic 侧实现。 |
DEVSTACK_GATE_POSTGRES |
已过时 |
此标志存在于 d-g 中,但它所做的只是捕获 postgres 日志。这已经由 post 中的 roles 支持,因此该标志在新的 jobs 中无用。postgres 本身可以通过 devstack_service 任务变量启用。 |
DEVSTACK_GATE_ZEROMQ |
已过时 |
这在 d-g 中没有效果。 |
DEVSTACK_GATE_MQ_DRIVER |
已过时 |
这在 d-g 中没有效果。 |
DEVSTACK_GATE_TEMPEST_STRESS_ARGS |
已过时 |
Stress 不在 Tempest 中了。 |
DEVSTACK_GATE_TEMPEST_HEAT_SLOW |
已过时 |
这在任何地方都没有使用。 |
DEVSTACK_GATE_CELLS |
已过时 |
这在 d-g 中没有效果。 |
DEVSTACK_GATE_NOVA_API_METADATA_SPLIT |
已过时 |
这在 d-g 中没有效果。 |