gecko-dev/taskcluster/docs/how-tos.rst
Dustin J. Mitchell ffca84ff7d Bug 1281004: Specify test tasks more flexibly; r=gps; r=gbrown
This introduces a completely new way of specifying test task in-tree,
completely replacing the old spider-web of YAML files.

The high-level view is this:

 - some configuration files are used to determine which test suites to run
   for each test platform, and against which build platforms

 - each test suite is then represented by a dictionary, and modified by a
   sequence of transforms, duplicating as necessary (e.g., chunks), until
   it becomes a task definition

The transforms allow sufficient generality to support just about any desired
configuration, with the advantage that common configurations are "easy" while
unusual configurations are supported but notable for their oddness (they
require a custom transform).

As of this commit, this system produces the same set of test graphs as the
existing YAML, modulo:

  - extra.treeherder.groupName -- this was not consistent in the YAML
  - extra.treeherder.build -- this is ignored by taskcluster-treeherder anyway
  - mozharness command argument order
  - boolean True values for environment variables are now the string "true"
  - metadata -- this is now much more consistent, with task name being the label

Testing of this commit demonstrates that it produces the same set of test tasks for
the following projects (those which had special cases defined in the YAML):

  - autoland
  - ash (*)
  - willow
  - mozilla-inbound
  - mozilla-central
  - try:
    -b do -p all -t all -u all
    -b d -p linux64,linux64-asan -u reftest -t none
    -b d -p linux64,linux64-asan -u reftest[x64] -t none[x64]

(*) this patch omits the linux64/debug tc-M-e10s(dt) test, which is enabled on
ash; ash will require a small changeset to re-enable this test.

IGNORE BAD COMMIT MESSAGES (because the hook flags try syntax!)

MozReview-Commit-ID: G34dg9f17Hq

--HG--
rename : taskcluster/taskgraph/kind/base.py => taskcluster/taskgraph/task/base.py
rename : taskcluster/taskgraph/kind/docker_image.py => taskcluster/taskgraph/task/docker_image.py
rename : taskcluster/taskgraph/kind/legacy.py => taskcluster/taskgraph/task/legacy.py
extra : rebase_source : 03e70902c2d3a297eb9e3ce852f8737c2550d5a6
extra : histedit_source : d4d9f4b192605af21f41d83495fc3c923759c3cb
2016-07-11 23:27:14 +00:00

125 lines
5.1 KiB
ReStructuredText

How Tos
=======
All of this equipment is here to help you get your work done more efficiently.
However, learning how task-graphs are generated is probably not the work you
are interested in doing. This section should help you accomplish some of the
more common changes to the task graph with minimal fuss.
.. important::
If you cannot accomplish what you need with the information provided here,
please consider whether you can achieve your goal in a different way.
Perhaps something simpler would cost a bit more in compute time, but save
the much more expensive resource of developers' mental bandwidth.
Task-graph generation is already complex enough!
If you want to proceed, you may need to delve into the implementation of
task-graph generation. The documentation and code are designed to help, as
are the authors - ``hg blame`` may help track down helpful people.
As you write your new transform or add a new kind, please consider the next
developer. Where possible, make your change data-driven and general, so
that others can make a much smaller change. Document the semantics of what
you are changing clearly, especially if it involves modifying a transform
schema. And if you are adding complexity temporarily while making a
gradual transition, please open a new bug to remind yourself to remove the
complexity when the transition is complete.
Hacking Task Graphs
-------------------
The recommended process for changing task graphs is this:
1. Find a recent decision task on the project or branch you are working on,
and download its ``parameters.yml`` from the Task Inspector. This file
contains all of the inputs to the task-graph generation process. Its
contents are simple enough if you would like to modify it, and it is
documented in :doc:`parameters`.
2. Run one of the ``mach taskgraph`` subcommands (see :doc:`taskgraph`) to
generate a baseline against which to measure your changes. For example:
.. code-block:: none
./mach taskgraph --json -p parameters.yml tasks > old-tasks.json
3. Make your modifications under ``tsakcluster/``.
4. Run the same ``mach taskgraph`` command, sending the output to a new file,
and use ``diff`` to compare the old and new files. Make sure your changes
have the desired effect and no undesirable side-effects.
5. When you are satisfied with the changes, push them to try to ensure that the
modified tasks work as expected.
Common Changes
--------------
Changing Test Characteristics
.............................
First, find the test description. This will be in
``taskcluster/ci/*/tests.yml``, for the appropriate kind (consult
:doc:`kinds`). You will find a YAML stanza for each test suite, and each
stanza defines the test's characteristics. For example, the ``chunks``
property gives the number of chunks to run. This can be specified as a simple
integer if all platforms have the same chunk count, or it can be keyed by test
platform. For example:
.. code-block:: yaml
chunks:
by-test-platform:
linux64/debug: 10
default: 8
The full set of available properties is in
``taskcluster/taskgraph/transform/tests/test_description.py``. Some other
commonly-modified properties are ``max-run-time`` (useful if tests are being
killed for exceeding maxRunTime) and ``treeherder-symbol``.
.. note::
Android tests are also chunked at the mozharness level, so you will need to
modify the relevant mozharness config, as well.
Adding a Test Suite
...................
To add a new test suite, you will need to know the proper mozharness invocation
for that suite, and which kind it fits into (consult :doc:`kinds`).
Add a new stanza to ``taskcluster/ci/<kind>/tests.yml``, copying from the other
stanzas in that file. The meanings should be clear, but authoritative
documentation is in
``taskcluster/taskgraph/transform/tests/test_description.py`` should you need
it. The stanza name is the name by which the test will be referenced in try
syntax.
Add your new test to a test set in ``test-sets.yml`` in the same directory. If
the test should only run on a limited set of platforms, you may need to define
a new test set and reference that from the appropriate platforms in
``test-platforms.yml``. If you do so, include some helpful comments in
``test-sets.yml`` for the next person.
Greening Up a New Test
......................
When a test is not yet reliably green, configuration for that test should not
be landed on integration branches. Of course, you can control where the
configuration is landed! For many cases, it is easiest to green up a test in
try: push the configuration to run the test to try along with your work to fix
the remaining test failures.
When working with a group, check out a "twig" repository to share among your
group, and land the test configuration in that repository. Once the test is
green, merge to an integration branch and the test will begin running there as
well.
Something Else?
...............
If you make another change not described here that turns out to be simple or
common, please include an update to this file in your patch.