This page can help when migrating Taskgraph across major versions.
- Tasks using
if-dependencieswill no longer pull these dependencies into the graph during the target phase. If a desired dependency is no longer showing up in the target graph, adjust your target_tasks logic to ensure the dependency is explicitly selected.
The
Schemaclass intaskgraph.util.schemais now based on msgspec instead of voluptuous. The old voluptuous-based class has been renamed toLegacySchema. Both will continue to be supported.If you have custom schemas using
Schema, you have two options:Option 1: Switch to
LegacySchemato keep using voluptuous:from taskgraph.util.schema import LegacySchema
Option 2: Migrate to the new msgspec-based
Schema:from taskgraph.util.schema import Schema class MySchema(Schema): foo: str bar: int = 10
The new
Schemaclass uses kebab-case renaming and forbids unknown fields by default. See the msgspec documentation for more details.validate_schemanow supports both voluptuous and msgspec schemas, andoptionally_keyed_byaccepts ause_msgspec=Trueflag for msgspec output.
- Stop setting the
run.sparse-profilekey in all tasks which perform a Mercurial clone. If sparse profiles are still required, the task must perform its own clone and not rely on therun-taskscript to do it. - run-task no longer cleans up the fetches directory. If using generic-worker's multiuser engine, this should have no impact. If you are using a worker that does not create separate task workspaces and you require the fetches dir to be cleaned up, adjust your tasks' commands to remove $MOZ_FETCHES_DIR explicitly.
Upgrade to Python 3.9 or above.
The
base_refparameter could now beNoneif it wasn't explicitly passed into the Decision task. If this was relied upon, do the following instead:from taskgraph.util.vcs import get_repository repo = get_repository() base_ref = repo.default_branch
The
base_revparameter is no longer being reset to the merge-base. This means in some cases,base_revmight not actually be an ancestor ofhead_rev. If you need the merge-base, you can use:from taskgraph.util.vcs import get_repository repo = get_repository() base_rev = repo.find_latest_common_revision(parameters["base_rev"], parameters["head_rev"])
The
base_refis no longer being fetched byrun-task. If you were relying on it, you can rungit fetch origin <base_ref>in a subprocess.The
run-taskscripts no longer fetches all heads whenhead_refisn't specified. If this behaviour was relied upon, you can rungit fetch +refs/heads/*:refs/remotes/work/*in a subprocess.
- Stop using the
--tagflag withtaskgraph build-image. Images must now be tagged manually via Docker post build. - Running
taskgraph load-taskwill no longer pause task execution and instead immediately execute the task's command after loading. Now you must use the-i/--interactiveflag to pause execution. - Utility functions in
taskgraph.util.taskclusterno longer accept theuse_proxyargument. Instead the presence ofTASKCLUSTER_PROXY_URLin the environment will be used to determine whether or not to use the Taskcluster proxy. Removeuse_proxyfrom all function calls, and then either setTASKCLUSTER_PROXY_URLor unset it depending on whether using the proxy is desired or not. - Utility functions in
taskgraph.util.taskclusternow raisetaskcluster.TaskclusterRestFailureinstead ofrequests.HTTPError.
get_primary_dependencynow requires aprimary-dependency-labelto be set on the task it is passed instead ofprimary-kind-dependency. Update any tasks you were calling this for to set this attribute. (If your only usage of this is indirectly throughfrom_deps, no change is needed:from-depsgenerated tasks will set this for you).
- The
{task_workdir}string in environment variables no longer gets interpolated byrun-task. This is backing out a feature introduced in version 13.x, so this release introduces no new backwards incompatibilities with version 12.x or earlier.
Remove all
run.cache-dotcachekeys. If it was set totrue, replace it with:run: use-caches: [checkout, <caches>]
Where caches can be any of
cargo,pip,uvornpm. If the task was setting up.cachefor another tool, a mount will need to be created for it manually. Ifuse-cacheswas previously set tofalse, omitcheckoutin the example above. Ifuse-cacheswas previously set totrue, replacetruewith the value above (includingcheckout).In Dockerfiles, replace VOLUME /builds/worker/.cache by VOLUME /builds/worker/.task-cache/{uv, cargo, pip, npm} as necessary.
Invert any usage of the dict keys and values returned by get_ancestors:
For example, if you were using:
for label, taskid in get_ancestors(...): ...
Change it to:
for taskid, label in get_ancestors(...): ...
Note that due to this change get_ancestors may return multiple tasks with the same label now, which your code may need to deal with.
Add
target_tasks_methodto the front of thefiltersparameter wherever you are also using a custom filter.For example, if you are passing in:
filters: ["my_custom_filter"]
Change it to:
filters: ["target_tasks_method", "my_custom_filter"]
No action is necessary if the
filtersparameter was empty.Change all references from
build-docker-imagetodocker-image.
A hardcoded path to a Python installation was removed for MacOS generic-workers. If Mac tasks start failing after upgrade and you are able to change the worker environment, ensure the
python3binary is available on the$PATH. If you cannot change the worker environment, add the following to the definitions of the failing tasks:run: run-task-command: ["/tools/python36/bin/python3", "run-task"]
When defining custom actions with
taskgraph.actions.registry.register_callback_action, make the following changes:- If you are passing
generic=Trueto the function, remove this argument. - If the argument isn't present, or you are passing
generic=False, then add a new argument calledpermission=<cb_name>, where<cb_name>is the value of whatever you are passing to thecb_nameargument.
- If you are passing
- Directories listed as VOLUME in Dockerfiles are created before any other instructions, so those instructions may need to be updated (e.g. RUN mkdir)
- fetch-content no longer relies on file extension to detect archives, so you. may need to explicitly disable extract for some fetches.
- Replace references to
taskgraph.util.memoize.memoizewithfunctools.cache. E.g, change@memoizeto@cache. If using Python 3.8, use@functools.lru_cache(maxsize=None)instead. - Pay close attention to tasks that use
task-defaultsto merge configuration containingby-<attribute>keys. The :func:`taskgraph.util.templates.merge` function will no longer attempt to merge keys containing these attributes, which may result in changes to your graph. You can use the :ref:`diff feature <diffing graphs>` to help detect possible changes.
- Replace all references to
taskgraph.files_changed. Instead, use one of:- The
files_changedparameter - The
get_files_changedmethod on an instance oftaskgraph.util.vcs.Repository - Mercurial repositories relying on hgmo's
json-automationrelevanceendpoint will need to in-line this logic into their own custom Taskgraph logic
- The
- In tasks using the
from_depstransforms, removefrom-deps.set-nameif it is set totrue - Update any references to pull request cached task indexes from
{cache_prefix}.cache.head.{head_ref}...to{cache_prefix}.cache.pr...(i.e, addprand remove thehead.{head_ref})
- Upgrade to Python 3.8 or higher
- Ensure
root_dirnow points totaskclusterinstead oftaskcluster/ci. Typically this value is not passed in explicitly by consumers, but updates are likely required if you have custom code that uses any of the following objects:taskgraph.config.GraphConfigtaskgraph.config.load_graph_configtaskgraph.generator.TaskGraphGeneratortaskgraph.generator.load_tasks_for_kinds- The
-r/--rootflag on thetaskgraphbinary
- Rename the
run_job_usingdecorator torun_task_using - Move
config.ymlfromtaskcluster/citotaskcluster - Rename the
taskcluster/cidirectory totaskcluster/kinds - Replace references to
taskgraph.transforms.jobwithtaskgraph.transforms.run - Replace references to
taskgraph.transforms.release_notificationswithtaskgraph.transforms.notify - Replace references to
taskgraph.target_tasks._target_taskwithtaskgraph.target_tasks.register_target_task - Stop using or inline
taskgraph.util.decision.make_decision_task - Stop using the
decision-mobiledocker image - Ensure MacOS workers that need Mercurial have
hgon theirPATH
- Replace all uses of
command-contextwith the more generalizedtask-context
- Upgrade to Python 3.7 or higher
- Remove all uses of the
disable-seccompkey in theworkersection of task definitions.
- Use a decision image at least as recent as this one.
- Rename
config.kind_dependencies_taskstoconfig.kind_dependencies_tasks.values(). - Rename
vcs.head_reftovcs.head_rev.vcs.head_refstill exists but points to the actual reference instead of the revision. - Rename
vcs.base_reftovcs.base_rev. Same rationale as above.
For all kinds using the :mod:`transform loader <taskgraph.loader.transform>`, rename the following keys in both the
kind.ymlfile and any files referenced injobs-from:jobs -> tasks jobs-from -> tasks-from job-defaults -> task-defaults
Rename
taskgraph.util.schema.WHITELISTED_SCHEMA_IDENTIFIERStotaskgraph.util.schema.EXCEPTED_SCHEMA_IDENTIFIERS.Rename any instances of
taskgraph.optimize.Eithertotaskgraph.optimize.Any.Add a
deadlineparameter as the third argument to any custom optimization strategies' :func:`~taskgraph.optimize.OptimizationStrategy.should_replace_task` function. For migration purposes it doesn't need to be used.Replace
taskgraph.util.taskcluster.status_taskwithtaskgraph.util.taskcluster.state_task.