1.. SPDX-License-Identifier: CC-BY-SA-2.0-UK 2 3******************************************* 4Understanding the Yocto Project Autobuilder 5******************************************* 6 7Execution Flow within the Autobuilder 8===================================== 9 10The "a-full" and "a-quick" targets are the usual entry points into the 11Autobuilder and it makes sense to follow the process through the system 12starting there. This is best visualized from the :yocto_ab:`Autobuilder 13Console view </typhoon/#/console>`. 14 15Each item along the top of that view represents some "target build" and 16these targets are all run in parallel. The 'full' build will trigger the 17majority of them, the "quick" build will trigger some subset of them. 18The Autobuilder effectively runs whichever configuration is defined for 19each of those targets on a separate buildbot worker. To understand the 20configuration, you need to look at the entry on ``config.json`` file 21within the :yocto_git:`yocto-autobuilder-helper </yocto-autobuilder-helper>` 22repository. The targets are defined in the ``overrides`` section, a quick 23example could be ``qemux86-64`` which looks like:: 24 25 "qemux86-64" : { 26 "MACHINE" : "qemux86-64", 27 "TEMPLATE" : "arch-qemu", 28 "step1" : { 29 "extravars" : [ 30 "IMAGE_FSTYPES:append = ' wic wic.bmap'" 31 ] 32 } 33 }, 34 35And to expand that, you need the ``arch-qemu`` entry from 36the ``templates`` section, which looks like:: 37 38 "arch-qemu" : { 39 "BUILDINFO" : true, 40 "BUILDHISTORY" : true, 41 "step1" : { 42 "BBTARGETS" : "core-image-sato core-image-sato-dev core-image-sato-sdk core-image-minimal core-image-minimal-dev core-image-sato:do_populate_sdk", 43 "SANITYTARGETS" : "core-image-minimal:do_testimage core-image-sato:do_testimage core-image-sato-sdk:do_testimage core-image-sato:do_testsdk" 44 }, 45 "step2" : { 46 "SDKMACHINE" : "x86_64", 47 "BBTARGETS" : "core-image-sato:do_populate_sdk core-image-minimal:do_populate_sdk_ext core-image-sato:do_populate_sdk_ext", 48 "SANITYTARGETS" : "core-image-sato:do_testsdk core-image-minimal:do_testsdkext core-image-sato:do_testsdkext" 49 }, 50 "step3" : { 51 "BUILDHISTORY" : false, 52 "EXTRACMDS" : ["${SCRIPTSDIR}/checkvnc; DISPLAY=:1 oe-selftest ${HELPERSTMACHTARGS} -j 15"], 53 "ADDLAYER" : ["${BUILDDIR}/../meta-selftest"] 54 } 55 }, 56 57Combining these two entries you can see that ``qemux86-64`` is a three step 58build where ``bitbake BBTARGETS`` would be run, then ``bitbake SANITYTARGETS`` 59for each step; all for ``MACHINE="qemux86-64"`` but with differing 60:term:`SDKMACHINE` settings. In step 1, an extra variable is added to the 61``auto.conf`` file to enable wic image generation. 62 63While not every detail of this is covered here, you can see how the 64template mechanism allows quite complex configurations to be built up 65yet allows duplication and repetition to be kept to a minimum. 66 67The different build targets are designed to allow for parallelization, 68so different machines are usually built in parallel, operations using 69the same machine and metadata are built sequentially, with the aim of 70trying to optimize build efficiency as much as possible. 71 72The ``config.json`` file is processed by the scripts in the Helper 73repository in the ``scripts`` directory. The following section details 74how this works. 75 76Autobuilder Target Execution Overview 77===================================== 78 79For each given target in a build, the Autobuilder executes several 80steps. These are configured in ``yocto-autobuilder2/builders.py`` and 81roughly consist of: 82 83#. *Run clobberdir*. 84 85 This cleans out any previous build. Old builds are left around to 86 allow easier debugging of failed builds. For additional information, 87 see :ref:`test-manual/understand-autobuilder:clobberdir`. 88 89#. *Obtain yocto-autobuilder-helper* 90 91 This step clones the :yocto_git:`yocto-autobuilder-helper </yocto-autobuilder-helper>` 92 git repository. This is necessary to avoid the requirement to maintain all 93 the release or project-specific code within Buildbot. The branch chosen 94 matches the release being built so we can support older releases and 95 still make changes in newer ones. 96 97#. *Write layerinfo.json* 98 99 This transfers data in the Buildbot UI when the build was configured 100 to the Helper. 101 102#. *Call scripts/shared-repo-unpack* 103 104 This is a call into the Helper scripts to set up a checkout of all 105 the pieces this build might need. It might clone the BitBake 106 repository and the OpenEmbedded-Core repository. It may clone the 107 Poky repository, as well as additional layers. It will use the data 108 from the ``layerinfo.json`` file to help understand the 109 configuration. It will also use a local cache of repositories to 110 speed up the clone checkouts. For additional information, see 111 :ref:`test-manual/understand-autobuilder:Autobuilder Clone Cache`. 112 113 This step has two possible modes of operation. If the build is part 114 of a parent build, it's possible that all the repositories needed may 115 already be available, ready in a pre-prepared directory. An "a-quick" 116 or "a-full" build would prepare this before starting the other 117 sub-target builds. This is done for two reasons: 118 119 - the upstream may change during a build, for example, from a forced 120 push and this ensures we have matching content for the whole build 121 122 - if 15 Workers all tried to pull the same data from the same repos, 123 we can hit resource limits on upstream servers as they can think 124 they are under some kind of network attack 125 126 This pre-prepared directory is shared among the Workers over NFS. If 127 the build is an individual build and there is no "shared" directory 128 available, it would clone from the cache and the upstreams as 129 necessary. This is considered the fallback mode. 130 131#. *Call scripts/run-config* 132 133 This is another call into the Helper scripts where it's expected that 134 the main functionality of this target will be executed. 135 136Autobuilder Technology 137====================== 138 139The Autobuilder has Yocto Project-specific functionality to allow builds 140to operate with increased efficiency and speed. 141 142clobberdir 143---------- 144 145When deleting files, the Autobuilder uses ``clobberdir``, which is a 146special script that moves files to a special location, rather than 147deleting them. Files in this location are deleted by an ``rm`` command, 148which is run under ``ionice -c 3``. For example, the deletion only 149happens when there is idle IO capacity on the Worker. The Autobuilder 150Worker Janitor runs this deletion. See :ref:`test-manual/understand-autobuilder:Autobuilder Worker Janitor`. 151 152Autobuilder Clone Cache 153----------------------- 154 155Cloning repositories from scratch each time they are required was slow 156on the Autobuilder. We therefore have a stash of commonly used 157repositories pre-cloned on the Workers. Data is fetched from these 158during clones first, then "topped up" with later revisions from any 159upstream when necessary. The cache is maintained by the Autobuilder 160Worker Janitor. See :ref:`test-manual/understand-autobuilder:Autobuilder Worker Janitor`. 161 162Autobuilder Worker Janitor 163-------------------------- 164 165This is a process running on each Worker that performs two basic 166operations, including background file deletion at IO idle (see 167"Run clobberdir" in :ref:`test-manual/understand-autobuilder:Autobuilder Target Execution Overview`) 168and maintenance of a cache of cloned repositories to improve the speed 169the system can checkout repositories. 170 171Shared DL_DIR 172------------- 173 174The Workers are all connected over NFS which allows :term:`DL_DIR` to be shared 175between them. This reduces network accesses from the system and allows 176the build to be sped up. The usage of the directory within the build system 177is designed to be able to be shared over NFS. 178 179Shared SSTATE_DIR 180----------------- 181 182The Workers are all connected over NFS which allows the ``sstate`` 183directory to be shared between them. This means once a Worker has built 184an artifact, all the others can benefit from it. The usage of the directory 185within the build system is designed for sharing over NFS. 186 187Resulttool 188---------- 189 190All of the different tests run as part of the build generate output into 191``testresults.json`` files. This allows us to determine which tests ran 192in a given build and their status. Additional information, such as 193failure logs or the time taken to run the tests, may also be included. 194 195Resulttool is part of OpenEmbedded-Core and is used to manipulate these 196JSON results files. It has the ability to merge files together, display 197reports of the test results and compare different result files. 198 199For details, see :yocto_wiki:`/Resulttool`. 200 201run-config Target Execution 202=========================== 203 204The ``scripts/run-config`` execution is where most of the work within 205the Autobuilder happens. It runs through a number of steps; the first 206are general setup steps that are run once and include: 207 208#. Set up any :term:`buildtools` tarball if configured. 209 210#. Call ``buildhistory-init`` if :ref:`ref-classes-buildhistory` is configured. 211 212For each step that is configured in ``config.json``, it will perform the 213following: 214 215#. Add any layers that are specified using the 216 ``bitbake-layers add-layer`` command (logging as stepXa) 217 218#. Call the ``scripts/setup-config`` script to generate the necessary 219 ``auto.conf`` configuration file for the build 220 221#. Run the ``bitbake BBTARGETS`` command (logging as stepXb) 222 223#. Run the ``bitbake SANITYTARGETS`` command (logging as stepXc) 224 225#. Run the ``EXTRACMDS`` command, which are run within the BitBake build 226 environment (logging as stepXd) 227 228#. Run the ``EXTRAPLAINCMDS`` command(s), which are run outside the 229 BitBake build environment (logging as stepXd) 230 231#. Remove any layers added in step 232 1 using the ``bitbake-layers remove-layer`` command (logging as stepXa) 233 234Once the execution steps above complete, ``run-config`` executes a set 235of post-build steps, including: 236 237#. Call ``scripts/publish-artifacts`` to collect any output which is to 238 be saved from the build. 239 240#. Call ``scripts/collect-results`` to collect any test results to be 241 saved from the build. 242 243#. Call ``scripts/upload-error-reports`` to send any error reports 244 generated to the remote server. 245 246#. Cleanup the :term:`Build Directory` using 247 :ref:`test-manual/understand-autobuilder:clobberdir` if the build was successful, 248 else rename it to "build-renamed" for potential future debugging. 249 250Deploying Yocto Autobuilder 251=========================== 252 253The most up to date information about how to setup and deploy your own 254Autobuilder can be found in :yocto_git:`README.md </yocto-autobuilder2/tree/README.md>` 255in the :yocto_git:`yocto-autobuilder2 </yocto-autobuilder2>` repository. 256 257We hope that people can use the :yocto_git:`yocto-autobuilder2 </yocto-autobuilder2>` 258code directly but it is inevitable that users will end up needing to heavily 259customize the :yocto_git:`yocto-autobuilder-helper </yocto-autobuilder-helper>` 260repository, particularly the ``config.json`` file as they will want to define 261their own test matrix. 262 263The Autobuilder supports two customization options: 264 265- variable substitution 266 267- overlaying configuration files 268 269The standard ``config.json`` minimally attempts to allow substitution of 270the paths. The Helper script repository includes a 271``local-example.json`` file to show how you could override these from a 272separate configuration file. Pass the following into the environment of 273the Autobuilder:: 274 275 $ ABHELPER_JSON="config.json local-example.json" 276 277As another example, you could also pass the following into the 278environment:: 279 280 $ ABHELPER_JSON="config.json /some/location/local.json" 281 282One issue users often run into is validation of the ``config.json`` files. A 283tip for minimizing issues from invalid JSON files is to use a Git 284``pre-commit-hook.sh`` script to verify the JSON file before committing 285it. Create a symbolic link as follows:: 286 287 $ ln -s ../../scripts/pre-commit-hook.sh .git/hooks/pre-commit 288