blob: 17e7e16fb7a305e658663770a1a59ec516be402a [file] [log] [blame]
Andrea Frittolif32f3f52018-02-19 21:45:22 +00001===============================
2Migrating Zuul V2 CI jobs to V3
3===============================
4
5The OpenStack CI system moved from Zuul v2 to Zuul v3, and all CI jobs moved to
6the new CI system. All jobs have been migrated automatically to a format
7compatible with Zuul v3; the jobs produced in this way however are suboptimal
8and do not use the capabilities introduced by Zuul v3, which allow for re-use of
9job parts, in the form of Ansible roles, as well as inheritance between jobs.
10
11DevStack hosts a set of roles, plays and jobs that can be used by other
12repositories to define their DevStack based jobs. To benefit from them, jobs
13must be migrated from the legacy v2 ones into v3 native format.
14
15This document provides guidance and examples to make the migration process as
16painless and smooth as possible.
17
18Where to host the job definitions.
19==================================
20
21In Zuul V3 jobs can be defined in the repository that contains the code they
22excercise. If you are writing CI jobs for an OpenStack service you can define
23your DevStack based CI jobs in one of the repositories that host the code for
24your service. If you have a branchless repo, like a Tempest plugin, that is
25a convenient choice to host the job definitions since job changes do not have
26to be backported. For example, see the beginning of the ``.zuul.yaml`` from the
27sahara Tempest plugin repo:
28
29.. code:: yaml
30
Matt Riedemann9b6d2f22019-06-18 10:43:16 -040031 # In https://opendev.org/openstack/sahara-tests/src/branch/master/.zuul.yaml:
Andrea Frittolif32f3f52018-02-19 21:45:22 +000032 - job:
33 name: sahara-tests-tempest
34 description: |
35 Run Tempest tests from the Sahara plugin.
36 parent: devstack-tempest
37
38Which base job to start from
39============================
40
41If your job needs an OpenStack cloud deployed via DevStack, but you don't plan
42on running Tempest tests, you can start from one of the base
43:doc:`jobs <zuul_jobs>` defined in the DevStack repo.
44
45The ``devstack`` job can be used for both single-node jobs and multi-node jobs,
46and it includes the list of services used in the integrated gate (keystone,
47glance, nova, cinder, neutron and swift). Different topologies can be achieved
48by switching the nodeset used in the child job.
49
50The ``devstack-base`` job is similar to ``devstack`` but it does not specify any
51required repo or service to be run in DevStack. It can be useful to setup
52children jobs that use a very narrow DevStack setup.
53
54If your job needs an OpenStack cloud deployed via DevStack, and you do plan
55on running Tempest tests, you can start from one of the base jobs defined in the
56Tempest repo.
57
58The ``devstack-tempest`` job can be used for both single-node jobs and
59multi-node jobs. Different topologies can be achieved by switching the nodeset
60used in the child job.
61
62Jobs can be customized as follows without writing any Ansible code:
63
64- add and/or remove DevStack services
65- add or modify DevStack and services configuration
66- install DevStack plugins
67- extend the number of sub-nodes (multinode only)
68- define extra log files and/or directories to be uploaded on logs.o.o
69- define extra log file extensions to be rewritten to .txt for ease of access
70
71Tempest jobs can be further customized as follows:
72
73- define the Tempest tox environment to be used
74- define the test concurrency
75- define the test regular expression
76
77Writing Ansible code, or importing existing custom roles, jobs can be further
78extended by:
79
80- adding pre and/or post playbooks
81- overriding the run playbook, add custom roles
82
83The (partial) example below extends a Tempest single node base job
84"devstack-tempest" in the Kuryr repository. The parent job name is defined in
85job.parent.
86
87.. code:: yaml
88
Matt Riedemann9b6d2f22019-06-18 10:43:16 -040089 # https://opendev.org/openstack/kuryr-kubernetes/src/branch/master/.zuul.d/base.yaml:
Andrea Frittolif32f3f52018-02-19 21:45:22 +000090 - job:
91 name: kuryr-kubernetes-tempest-base
92 parent: devstack-tempest
93 description: Base kuryr-kubernetes-job
94 required-projects:
95 - openstack/devstack-plugin-container
96 - openstack/kuryr
97 - openstack/kuryr-kubernetes
98 - openstack/kuryr-tempest-plugin
99 - openstack/neutron-lbaas
100 vars:
101 tempest_test_regex: '^(kuryr_tempest_plugin.tests.)'
102 tox_envlist: 'all'
103 devstack_localrc:
104 KURYR_K8S_API_PORT: 8080
Andrea Frittolif32f3f52018-02-19 21:45:22 +0000105 devstack_services:
106 kubernetes-api: true
107 kubernetes-controller-manager: true
108 kubernetes-scheduler: true
109 kubelet: true
110 kuryr-kubernetes: true
111 (...)
112 devstack_plugins:
Matt Riedemann9b6d2f22019-06-18 10:43:16 -0400113 kuryr-kubernetes: https://opendev.org/openstack/kuryr
114 devstack-plugin-container: https://opendev.org/openstack/devstack-plugin-container
115 neutron-lbaas: https://opendev.org/openstack/neutron-lbaas
Luigi Toscano70d043d2019-03-12 22:25:44 +0100116 tempest_plugins:
117 - kuryr-tempest-plugin
Andrea Frittolif32f3f52018-02-19 21:45:22 +0000118 (...)
119
120Job variables
121=============
122
123Variables can be added to the job in three different places:
124
125- job.vars: these are global variables available to all node in the nodeset
126- job.host-vars.[HOST]: these are variables available only to the specified HOST
127- job.group-vars.[GROUP]: these are variables available only to the specified
128 GROUP
129
130Zuul merges dict variables through job inheritance. Host and group variables
131override variables with the same name defined as global variables.
132
133In the example below, for the sundaes job, hosts that are not part of the
134subnode group will run vanilla and chocolate. Hosts in the subnode group will
135run stracciatella and strawberry.
136
137.. code:: yaml
138
139 - job:
140 name: ice-creams
141 vars:
142 devstack_service:
143 vanilla: true
144 chocolate: false
145 group-vars:
146 subnode:
147 devstack_service:
148 pistacchio: true
149 stracciatella: true
150
151 - job:
152 name: sundaes
153 parent: ice-creams
154 vars:
155 devstack_service:
156 chocolate: true
157 group-vars:
158 subnode:
159 devstack_service:
160 strawberry: true
161 pistacchio: false
162
163
164DevStack Gate Flags
165===================
166
167The old CI system worked using a combination of DevStack, Tempest and
168devstack-gate to setup a test environment and run tests against it. With Zuul
169V3, the logic that used to live in devstack-gate is moved into different repos,
170including DevStack, Tempest and grenade.
171
172DevStack-gate exposes an interface for job definition based on a number of
173DEVSTACK_GATE_* environment variables, or flags. This guide shows how to map
174DEVSTACK_GATE flags into the new
175system.
176
177The repo column indicates in which repository is hosted the code that replaces
178the devstack-gate flag. The new implementation column explains how to reproduce
179the same or a similar behaviour in Zuul v3 jobs. For localrc settings,
180devstack-gate defined a default value. In ansible jobs the default is either the
181value defined in the parent job, or the default from DevStack, if any.
182
Andreas Jaegerd3a2fcf2019-08-13 19:27:06 +0200183.. list-table:: **DevStack Gate Flags**
184 :widths: 20 10 60
185 :header-rows: 1
186
187 * - DevStack gate flag
188 - Repo
189 - New implementation
190 * - OVERRIDE_ZUUL_BRANCH
191 - zuul
192 - override-checkout: [branch] in the job definition.
193 * - DEVSTACK_GATE_NET_OVERLAY
194 - zuul-jobs
195 - A bridge called br-infra is set up for all jobs that inherit
196 from multinode with a dedicated `bridge role
197 <https://zuul-ci.org/docs/zuul-jobs/general-roles.html#role-multi-node-bridge>`_.
198 * - DEVSTACK_GATE_FEATURE_MATRIX
199 - devstack-gate
200 - ``test_matrix_features`` variable of the test-matrix role in
201 devstack-gate. This is a temporary solution, feature matrix
202 will go away. In the future services will be defined in jobs
203 only.
204 * - DEVSTACK_CINDER_VOLUME_CLEAR
205 - devstack
206 - *CINDER_VOLUME_CLEAR: true/false* in devstack_localrc in the
207 job vars.
208 * - DEVSTACK_GATE_NEUTRON
209 - devstack
210 - True by default. To disable, disable all neutron services in
211 devstack_services in the job definition.
212 * - DEVSTACK_GATE_CONFIGDRIVE
213 - devstack
214 - *FORCE_CONFIG_DRIVE: true/false* in devstack_localrc in the job
215 vars.
216 * - DEVSTACK_GATE_INSTALL_TESTONLY
217 - devstack
218 - *INSTALL_TESTONLY_PACKAGES: true/false* in devstack_localrc in
219 the job vars.
220 * - DEVSTACK_GATE_VIRT_DRIVER
221 - devstack
222 - *VIRT_DRIVER: [virt driver]* in devstack_localrc in the job
223 vars.
224 * - DEVSTACK_GATE_LIBVIRT_TYPE
225 - devstack
226 - *LIBVIRT_TYPE: [libvirt type]* in devstack_localrc in the job
227 vars.
228 * - DEVSTACK_GATE_TEMPEST
229 - devstack and tempest
230 - Defined by the job that is used. The ``devstack`` job only runs
231 devstack. The ``devstack-tempest`` one triggers a Tempest run
232 as well.
233 * - DEVSTACK_GATE_TEMPEST_FULL
234 - tempest
235 - *tox_envlist: full* in the job vars.
236 * - DEVSTACK_GATE_TEMPEST_ALL
237 - tempest
238 - *tox_envlist: all* in the job vars.
239 * - DEVSTACK_GATE_TEMPEST_ALL_PLUGINS
240 - tempest
241 - *tox_envlist: all-plugin* in the job vars.
242 * - DEVSTACK_GATE_TEMPEST_SCENARIOS
243 - tempest
244 - *tox_envlist: scenario* in the job vars.
245 * - TEMPEST_CONCURRENCY
246 - tempest
247 - *tempest_concurrency: [value]* in the job vars. This is
248 available only on jobs that inherit from ``devstack-tempest``
249 down.
250 * - DEVSTACK_GATE_TEMPEST_NOTESTS
251 - tempest
252 - *tox_envlist: venv-tempest* in the job vars. This will create
253 Tempest virtual environment but run no tests.
254 * - DEVSTACK_GATE_SMOKE_SERIAL
255 - tempest
256 - *tox_envlist: smoke-serial* in the job vars.
257 * - DEVSTACK_GATE_TEMPEST_DISABLE_TENANT_ISOLATION
258 - tempest
259 - *tox_envlist: full-serial* in the job vars.
260 *TEMPEST_ALLOW_TENANT_ISOLATION: false* in devstack_localrc in
261 the job vars.
262
Andrea Frittolif32f3f52018-02-19 21:45:22 +0000263
264The following flags have not been migrated yet or are legacy and won't be
265migrated at all.
266
Andreas Jaegerd3a2fcf2019-08-13 19:27:06 +0200267.. list-table:: **Not Migrated DevStack Gate Flags**
268 :widths: 20 10 60
269 :header-rows: 1
270
271 * - DevStack gate flag
272 - Status
273 - Details
274 * - DEVSTACK_GATE_TOPOLOGY
275 - WIP
276 - The topology depends on the base job that is used and more
277 specifically on the nodeset attached to it. The new job format
278 allows project to define the variables to be passed to every
279 node/node-group that exists in the topology. Named topologies
280 that include the nodeset and the matching variables can be
281 defined in the form of base jobs.
282 * - DEVSTACK_GATE_GRENADE
283 - TBD
284 - Grenade Zuul V3 jobs will be hosted in the grenade repo.
285 * - GRENADE_BASE_BRANCH
286 - TBD
287 - Grenade Zuul V3 jobs will be hosted in the grenade repo.
288 * - DEVSTACK_GATE_NEUTRON_DVR
289 - TBD
290 - Depends on multinode support.
291 * - DEVSTACK_GATE_EXERCISES
292 - TBD
293 - Can be done on request.
294 * - DEVSTACK_GATE_IRONIC
295 - TBD
296 - This will probably be implemented on ironic side.
297 * - DEVSTACK_GATE_IRONIC_DRIVER
298 - TBD
299 - This will probably be implemented on ironic side.
300 * - DEVSTACK_GATE_IRONIC_BUILD_RAMDISK
301 - TBD
302 - This will probably be implemented on ironic side.
303 * - DEVSTACK_GATE_POSTGRES
304 - Legacy
Matt Riedemannb14665f2019-10-17 19:34:05 +0000305 - This flag exists in d-g but the only thing that it does is
306 capture postgres logs. This is already supported by the roles
307 in post, so the flag is useless in the new jobs. postgres
308 itself can be enabled via the devstack_service job variable.
Andreas Jaegerd3a2fcf2019-08-13 19:27:06 +0200309 * - DEVSTACK_GATE_ZEROMQ
310 - Legacy
311 - This has no effect in d-g.
312 * - DEVSTACK_GATE_MQ_DRIVER
313 - Legacy
314 - This has no effect in d-g.
315 * - DEVSTACK_GATE_TEMPEST_STRESS_ARGS
316 - Legacy
317 - Stress is not in Tempest anymore.
318 * - DEVSTACK_GATE_TEMPEST_HEAT_SLOW
319 - Legacy
320 - This is not used anywhere.
321 * - DEVSTACK_GATE_CELLS
322 - Legacy
323 - This has no effect in d-g.
324 * - DEVSTACK_GATE_NOVA_API_METADATA_SPLIT
325 - Legacy
326 - This has no effect in d-g.