James E. Blair | eff5a9d | 2017-06-20 00:00:37 -0700 | [diff] [blame] | 1 | :title: Job Content |
| 2 | |
| 3 | Job Content |
| 4 | =========== |
| 5 | |
| 6 | Zuul jobs are implemneted as Ansible playbooks. Zuul prepares the |
| 7 | repositories used for a job, installs any required Ansible roles, and |
| 8 | then executes the job's playbooks. Any setup or artifact collection |
| 9 | required is the responsibility of the job itself. While this flexible |
| 10 | arrangement allows for almost any kind of job to be run by Zuul, |
| 11 | batteries are included. Zuul has a standard library of jobs upon |
| 12 | which to build. |
| 13 | |
| 14 | Working Directory |
| 15 | ----------------- |
| 16 | |
| 17 | Before starting each job, the Zuul executor creates a directory to |
| 18 | hold all of the content related to the job. This includes some |
| 19 | directories which are used by Zuul to configure and run Ansible and |
| 20 | may not be accessible, as well as a directory tree, under ``work/``, |
| 21 | that is readable and writable by the job. The hierarchy is: |
| 22 | |
| 23 | **work/** |
| 24 | The working directory of the job. |
| 25 | |
| 26 | **work/src/** |
| 27 | Contains the prepared git repositories for the job. |
| 28 | |
| 29 | **work/logs/** |
| 30 | Where the Ansible log for the job is written; your job |
| 31 | may place other logs here as well. |
| 32 | |
| 33 | Git Repositories |
| 34 | ---------------- |
| 35 | |
| 36 | The git repositories in ``work/src`` contain the repositories for all |
| 37 | of the projects specified in the ``required-projects`` section of the |
| 38 | job, plus the project associated with the queue item if it isn't |
| 39 | already in that list. In the case of a proposed change, that change |
| 40 | and all of the changes ahead of it in the pipeline queue will already |
| 41 | be merged into their respective repositories and target branches. The |
| 42 | change's project will have the change's branch checked out, as will |
| 43 | all of the other projects, if that branch exists (otherwise, a |
| 44 | fallback or default branch will be used). If your job needs to |
| 45 | operate on multiple branches, simply checkout the appropriate branches |
| 46 | of these git repos to ensure that the job results reflect the proposed |
| 47 | future state that Zuul is testing, and all dependencies are present. |
| 48 | Do not use any git remotes; the local repositories are guaranteed to |
| 49 | be up to date. |
| 50 | |
James E. Blair | 4d5dd25 | 2017-06-23 21:40:56 +0100 | [diff] [blame] | 51 | The repositories will be placed on the filesystem in directories |
| 52 | corresponding with the canonical hostname of their source connection. |
| 53 | For example:: |
| 54 | |
| 55 | work/src/git.example.com/project1 |
| 56 | work/src/github.com/project2 |
| 57 | |
| 58 | Is the layout that would be present for a job which included project1 |
| 59 | from the connection associated to git.example.com and project2 from |
| 60 | GitHub. This helps avoid collisions between projects with the same |
| 61 | name, and some language environments, such as Go, expect repositories |
| 62 | in this format. |
| 63 | |
James E. Blair | eff5a9d | 2017-06-20 00:00:37 -0700 | [diff] [blame] | 64 | Note that these git repositories are located on the executor; in order |
| 65 | to be useful to most kinds of jobs, they will need to be present on |
| 66 | the test nodes. The ``base`` job in the standard library contains a |
| 67 | pre-playbook which copies the repositories to all of the job's nodes. |
| 68 | It is recommended to always inherit from this base job to ensure that |
| 69 | behavior. |
| 70 | |
| 71 | .. TODO: link to base job documentation and/or document src (and logs?) directory |
| 72 | |
James E. Blair | 28c8e3b | 2017-07-17 16:27:50 -0700 | [diff] [blame] | 73 | Variables |
| 74 | --------- |
| 75 | |
Jamie Lennox | 7655b55 | 2017-03-17 12:33:38 +1100 | [diff] [blame] | 76 | There are several sources of variables which are available to Ansible: |
| 77 | variables defined in jobs, secrets, and site-wide variables. The |
| 78 | order of precedence is: |
| 79 | |
| 80 | * Site-wide variables |
| 81 | |
| 82 | * Secrets |
| 83 | |
| 84 | * Job variables |
| 85 | |
| 86 | Meaning that a site-wide variable with the same name as any other will |
| 87 | override its value, and similarly, secrets override job variables of |
| 88 | the same name. Each of the three sources is described below. |
| 89 | |
| 90 | |
| 91 | Job Variables |
| 92 | ~~~~~~~~~~~~~ |
| 93 | |
James E. Blair | 28c8e3b | 2017-07-17 16:27:50 -0700 | [diff] [blame] | 94 | Any variables specified in the job definition are available as Ansible |
| 95 | host variables. They are added to the `vars` section of the inventory |
| 96 | file under the `all` hosts group, so they are available to all hosts. |
| 97 | Simply refer to them by the name specified in the job's `vars` |
| 98 | section. |
| 99 | |
| 100 | Secrets |
| 101 | ~~~~~~~ |
| 102 | |
| 103 | Secrets also appear as variables available to Ansible. Unlike job |
| 104 | variables, these are not added to the inventory file (so that the |
| 105 | inventory file may be kept for debugging purposes without revealing |
| 106 | secrets). But they are still available to Ansible as normal |
| 107 | variables. Because secrets are groups of variables, they will appear |
| 108 | as a dictionary structure in templates, with the dictionary itself |
| 109 | being the name of the secret, and its members the individual items in |
| 110 | the secret. For example, a secret defined as:: |
| 111 | |
| 112 | - secret: |
| 113 | name: credentials |
| 114 | data: |
| 115 | username: foo |
| 116 | password: bar |
| 117 | |
| 118 | Might be used in a template as:: |
| 119 | |
| 120 | {{ credentials.username }} {{ credentials.password }} |
| 121 | |
| 122 | .. TODO: xref job vars |
| 123 | |
James E. Blair | eff5a9d | 2017-06-20 00:00:37 -0700 | [diff] [blame] | 124 | Zuul Variables |
James E. Blair | 28c8e3b | 2017-07-17 16:27:50 -0700 | [diff] [blame] | 125 | ~~~~~~~~~~~~~~ |
James E. Blair | eff5a9d | 2017-06-20 00:00:37 -0700 | [diff] [blame] | 126 | |
| 127 | Zuul supplies not only the variables specified by the job definition |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 128 | to Ansible, but also some variables from the Zuul itself. |
| 129 | |
James E. Blair | babefce | 2017-07-20 17:14:54 -0700 | [diff] [blame] | 130 | When a pipeline is triggered by an action, it enqueues items which may |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 131 | vary based on the pipeline's configuration. For example, when a new |
| 132 | change is created, that change may be enqueued into the pipeline, |
| 133 | while a tag may be enqueued into the pipeline when it is pushed. |
| 134 | |
| 135 | Information about these items is available to jobs. All of the items |
| 136 | enqueued in a pipeline are git references, and therefore share some |
| 137 | attributes in common. But other attributes may vary based on the type |
| 138 | of item. |
| 139 | |
| 140 | All items provide the following information as Ansible variables: |
| 141 | |
James E. Blair | a9fbb6c | 2017-07-20 16:07:30 -0700 | [diff] [blame] | 142 | **zuul.build** |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 143 | The UUID of the build. A build is a single execution of a job. |
| 144 | When an item is enqueued into a pipeline, this usually results in |
| 145 | one build of each job configured for that item's project. However, |
| 146 | items may be re-enqueued in which case another build may run. In |
| 147 | dependent pipelines, the same job may run multiple times for the |
| 148 | same item as circumstances change ahead in the queue. Each time a |
| 149 | job is run, for whatever reason, it is acompanied with a new |
| 150 | unique id. |
| 151 | |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 152 | **zuul.buildset** |
| 153 | The build set UUID. When Zuul runs jobs for an item, the collection |
| 154 | of those jobs is known as a buildset. If the configuration of items |
| 155 | ahead in a dependent pipeline changes, Zuul creates a new buildset |
| 156 | and restarts all of the jobs. |
| 157 | |
| 158 | **zuul.ref** |
| 159 | The git ref of the item. This will be the full path (e.g., |
| 160 | 'refs/heads/master' or 'refs/changes/...'). |
| 161 | |
| 162 | **zuul.pipeline** |
| 163 | The name of the pipeline in which the job is being run. |
| 164 | |
| 165 | **zuul.job** |
| 166 | The name of the job being run. |
| 167 | |
James E. Blair | 2ef29e9 | 2017-07-21 15:25:05 -0700 | [diff] [blame] | 168 | **zuul.voting** |
| 169 | A boolean indicating whether the job is voting. |
| 170 | |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 171 | **zuul.project** |
| 172 | The item's project. This is a data structure with the following |
| 173 | fields: |
| 174 | |
| 175 | **zuul.project.name** |
| 176 | The name of the project, excluding hostname. E.g., `org/project`. |
| 177 | |
| 178 | **zuul.project.canonical_hostname** |
| 179 | The canonical hostname where the project lives. E.g., |
| 180 | `git.example.com`. |
| 181 | |
| 182 | **zuul.project.canonical_name** |
| 183 | The full canonical name of the project including hostname. E.g., |
| 184 | `git.example.com/org/project`. |
| 185 | |
| 186 | **zuul.tenant** |
| 187 | The name of the current Zuul tenant. |
| 188 | |
James E. Blair | 9d46f09 | 2017-07-20 16:06:20 -0700 | [diff] [blame] | 189 | **zuul.jobtags** |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 190 | A list of tags associated with the job. Not to be confused with git |
| 191 | tags, these are simply free-form text fields that can be used by the |
| 192 | job for reporting or classification purposes. |
| 193 | |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 194 | **zuul.items** |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 195 | |
James E. Blair | a08f459 | 2017-07-20 16:35:55 -0700 | [diff] [blame] | 196 | A list of dictionaries, each representing an item being tested with |
| 197 | this change with the format: |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 198 | |
James E. Blair | a08f459 | 2017-07-20 16:35:55 -0700 | [diff] [blame] | 199 | **project.name** |
| 200 | The name of the project, excluding hostname. E.g., `org/project`. |
| 201 | |
| 202 | **project.canonical_hostname** |
| 203 | The canonical hostname where the project lives. E.g., |
| 204 | `git.example.com`. |
| 205 | |
| 206 | **project.canonical_name** |
| 207 | The full canonical name of the project including hostname. E.g., |
| 208 | `git.example.com/org/project`. |
| 209 | |
| 210 | **branch** |
| 211 | The target branch of the change (without the `refs/heads/` prefix). |
| 212 | |
| 213 | **change** |
| 214 | The identifier for the change. |
| 215 | |
| 216 | **patchset** |
| 217 | The patchset identifier for the change. If a change is revised, |
| 218 | this will have a different value. |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 219 | |
| 220 | Change Items |
| 221 | ++++++++++++ |
| 222 | |
| 223 | A change to the repository. Most often, this will be a git reference |
| 224 | which has not yet been merged into the repository (e.g., a gerrit |
| 225 | change or a GitHub pull request). The following additional variables |
| 226 | are available: |
| 227 | |
| 228 | **zuul.branch** |
| 229 | The target branch of the change (without the `refs/heads/` prefix). |
| 230 | |
| 231 | **zuul.change** |
| 232 | The identifier for the change. |
| 233 | |
| 234 | **zuul.patchset** |
| 235 | The patchset identifier for the change. If a change is revised, |
| 236 | this will have a different value. |
| 237 | |
| 238 | Branch Items |
| 239 | ++++++++++++ |
| 240 | |
| 241 | This represents a branch tip. This item may have been enqueued |
| 242 | because the branch was updated (via a change having merged, or a |
| 243 | direct push). Or it may have been enqueued by a timer for the purpose |
| 244 | of verifying the current condition of the branch. The following |
| 245 | additional variables are available: |
| 246 | |
| 247 | **zuul.branch** |
| 248 | The name of the item's branch (without the `refs/heads/` prefix). |
| 249 | |
| 250 | **zuul.oldrev** |
| 251 | If the item was enqueued as the result of a change merging or being |
| 252 | pushed to the branch, the git sha of the old revision will be |
James E. Blair | 673dbd1 | 2017-07-21 10:02:49 -0700 | [diff] [blame] | 253 | included here. Otherwise, this variable will be undefined. |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 254 | |
| 255 | **zuul.newrev** |
| 256 | If the item was enqueued as the result of a change merging or being |
| 257 | pushed to the branch, the git sha of the new revision will be |
James E. Blair | 673dbd1 | 2017-07-21 10:02:49 -0700 | [diff] [blame] | 258 | included here. Otherwise, this variable will be undefined. |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 259 | |
| 260 | Tag Items |
| 261 | +++++++++ |
| 262 | |
| 263 | This represents a git tag. The item may have been enqueued because a |
| 264 | tag was created or deleted. The following additional variables are |
| 265 | available: |
| 266 | |
| 267 | **zuul.tag** |
| 268 | The name of the item's tag (without the `refs/tags/` prefix). |
| 269 | |
| 270 | **zuul.oldrev** |
James E. Blair | 673dbd1 | 2017-07-21 10:02:49 -0700 | [diff] [blame] | 271 | If the item was enqueued as the result of a tag being deleted, the |
| 272 | previous git sha of the tag will be included here. If the tag was |
| 273 | created, this will be set to the value |
| 274 | 0000000000000000000000000000000000000000. |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 275 | |
| 276 | **zuul.newrev** |
James E. Blair | 673dbd1 | 2017-07-21 10:02:49 -0700 | [diff] [blame] | 277 | If the item was enqueued as the result of a tag being created, the |
| 278 | new git sha of the tag will be included here. If the tag was |
| 279 | deleted, this will be set to the value |
| 280 | 0000000000000000000000000000000000000000. |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 281 | |
| 282 | Ref Items |
| 283 | +++++++++ |
| 284 | |
| 285 | This represents a git reference that is neither a change, branch, or |
| 286 | tag. Note that all items include a `ref` attribute which may be used |
| 287 | to identify the ref. The following additional variables are |
| 288 | available: |
| 289 | |
| 290 | **zuul.oldrev** |
James E. Blair | 673dbd1 | 2017-07-21 10:02:49 -0700 | [diff] [blame] | 291 | If the item was enqueued as the result of a ref being deleted, the |
| 292 | previous git sha of the ref will be included here. If the ref was |
| 293 | created, this will be set to the value |
| 294 | 0000000000000000000000000000000000000000. |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 295 | |
| 296 | **zuul.newrev** |
James E. Blair | 673dbd1 | 2017-07-21 10:02:49 -0700 | [diff] [blame] | 297 | If the item was enqueued as the result of a ref being created, the |
| 298 | new git sha of the ref will be included here. If the ref was |
| 299 | deleted, this will be set to the value |
| 300 | 0000000000000000000000000000000000000000. |
James E. Blair | 2103778 | 2017-07-19 11:56:55 -0700 | [diff] [blame] | 301 | |
| 302 | Working Directory |
| 303 | +++++++++++++++++ |
| 304 | |
| 305 | Additionally, some information about the working directory and the |
| 306 | executor running the job is available: |
James E. Blair | eff5a9d | 2017-06-20 00:00:37 -0700 | [diff] [blame] | 307 | |
| 308 | **zuul.executor.hostname** |
| 309 | The hostname of the executor. |
| 310 | |
| 311 | **zuul.executor.src_root** |
| 312 | The path to the source directory. |
| 313 | |
| 314 | **zuul.executor.log_root** |
| 315 | The path to the logs directory. |
| 316 | |
Jamie Lennox | 7655b55 | 2017-03-17 12:33:38 +1100 | [diff] [blame] | 317 | |
| 318 | .. _user_sitewide_variables: |
| 319 | |
| 320 | Site-wide Variables |
| 321 | ~~~~~~~~~~~~~~~~~~~ |
| 322 | |
| 323 | The Zuul administrator may define variables which will be available to |
| 324 | all jobs running in the system. These are statically defined and may |
| 325 | not be altered by jobs. See the :ref:`Administrator's Guide |
| 326 | <admin_sitewide_variables>` for information on how a site |
| 327 | administrator may define these variables. |
| 328 | |
| 329 | |
James E. Blair | eff5a9d | 2017-06-20 00:00:37 -0700 | [diff] [blame] | 330 | SSH Keys |
| 331 | -------- |
| 332 | |
| 333 | Zuul starts each job with an SSH agent running and the key used to |
| 334 | access the job's nodes added to that agent. Generally you won't need |
| 335 | to be aware of this since Ansible will use this when performing any |
| 336 | tasks on remote nodes. However, under some circumstances you may want |
| 337 | to interact with the agent. For example, you may wish to add a key |
| 338 | provided as a secret to the job in order to access a specific host, or |
| 339 | you may want to, in a pre-playbook, replace the key used to log into |
| 340 | the assigned nodes in order to further protect it from being abused by |
| 341 | untrusted job content. |
| 342 | |
| 343 | .. TODO: describe standard lib and link to published docs for it. |
| 344 | |
James E. Blair | 88e79c0 | 2017-07-07 13:36:54 -0700 | [diff] [blame] | 345 | .. _return_values: |
| 346 | |
James E. Blair | 196f61a | 2017-06-30 15:42:29 -0700 | [diff] [blame] | 347 | Return Values |
| 348 | ------------- |
| 349 | |
| 350 | The job may return some values to Zuul to affect its behavior. To |
| 351 | return a value, use the *zuul_return* Ansible module in a job |
| 352 | playbook. For example:: |
| 353 | |
| 354 | tasks: |
| 355 | - zuul_return: |
| 356 | data: |
| 357 | foo: bar |
| 358 | |
| 359 | Will return the dictionary "{'foo': 'bar'}" to Zuul. |
| 360 | |
| 361 | .. TODO: xref to section describing formatting |
| 362 | |
| 363 | Several uses of these values are planned, but the only currently |
| 364 | implemented use is to set the log URL for a build. To do so, set the |
| 365 | **zuul.log_url** value. For example:: |
| 366 | |
| 367 | tasks: |
| 368 | - zuul_return: |
| 369 | data: |
| 370 | zuul: |
| 371 | log_url: http://logs.example.com/path/to/build/logs |