Migration to V6
Yontrack 6 is a major release. This page lists everything a Yontrack 5 installation must know to upgrade, for the people who deploy Yontrack, the clients of its API (GraphQL and REST), and those who configure it as code (CasC):
- Upgrade path — which versions upgrade to 6.0, and how to prepare;
- Breaking changes — the platform changes and the features removed;
- Removed — the items Yontrack 5 deprecated, and their replacement;
- Newly deprecated — the items Yontrack 6 deprecates, and which Yontrack 7 removes.
Upgrade path
- From any 5.x release — Yontrack 6.0 upgrades an installation running any 5.x release. Its database migrations run at its first start, whichever 5.x version it starts from.
- Old schema history — a database whose history goes back to 2017 or earlier records some of its
migrations with the
SPRING_JDBCtype, which the Flyway of Yontrack 6 no longer knows. Yontrack 6 relabels them asJDBCat its first start: there is nothing to do by hand. - From 4.x — upgrade to a 5.x release first, and start it once, before upgrading to 6.0: see Migration from V4. Yontrack 6 no longer carries the data conversions which 5.0 ran once at its first start, so a 4.x database upgraded straight to 6.0 is not supported. A new installation, on an empty database, starts normally.
-
Check the deprecated items before upgrading — the latest 5.5.x release counts every use of an item Yontrack 6 removes, in the
ontrack_deprecated_usage_totalmetric, tagged bysurfaceanditem, and logs aWARNthe first time each one is used. Upgrade to it, let it run through the usual activity of the installation — the CI pipelines, the CasC, the API clients — then list what is still used:sum by (surface, item) (ontrack_deprecated_usage_total)Every item it lists must be migrated before the upgrade: Removed gives the replacement of each one, and Usage of deprecated features how the metric works.
-
Check the breaking changes — among them, JDK 25 to run the JAR, the
pg_trgmextension of Postgres, and the removed features. - The upgrade to 6.0 restarts Yontrack — the upgrades within 6.x can then run without downtime: see Zero-downtime upgrades.
Breaking changes
Java 25
Yontrack 6 is built for and runs on JDK 25, an LTS release. Yontrack 5 ran on JDK 21.
For deployers
- Docker image — the
nemerosa/ontrackimage now runs onazul/zulu-openjdk-alpine:25. Nothing changes for an installation that runs the image. - Running the JAR yourself — the minimum runtime is now JDK 25: the classes are compiled for it, and an older JVM refuses to load them.
- Runtime warnings — JDK 25 warns about libraries (Netty, Kotlin coroutines, …) which still
use
sun.misc.Unsafememory access or restricted native methods. These warnings are expected and harmless.
Spring Boot 4
Yontrack 6 runs on Spring Boot 4.1, Spring Framework 7, Spring Security 7 and Kotlin 2.3. JSON is handled by Jackson 3: see Jackson 3.
For deployers
- Configuration properties — no Yontrack or Spring property changes its name. The
management server behaves as in 5.x: port
8800, base path/manage, onlyhealth,infoandprometheusexposed, theaccountend point off (see Management port). - Elasticsearch 9 — the export of the metrics to Elasticsearch, the only use of
Elasticsearch left in Yontrack 6 (see Elasticsearch search),
uses the 9.x Elasticsearch client, which talks to Elasticsearch 9: an installation exporting its
metrics to an Elasticsearch 8 server must upgrade it. The
spring.elasticsearch.*properties are unchanged. - Vault key store — keys stored in Vault by Yontrack 5 are read as they are: their format does not change.
- Custom JWT
typ—ontrack.config.security.authorization.jwt.typstill makes the API accept thattypheader instead of the standardJWT. With it set, Yontrack no longer contacts the identity provider while starting up: the provider is reached on the first authenticated call, as it is without the setting.
Jackson 3
Yontrack 6 reads and writes JSON with Jackson 3 (tools.jackson) instead of Jackson 2
(com.fasterxml.jackson). The JSON it stores does not change.
For deployers
Nothing: the data stored by Yontrack 5 is read as it is.
For REST API clients
The dates in the answers of the REST API (/rest/...) are written as the rest of Yontrack writes
them — as a UTC timestamp string, "2025-11-04T09:12:30.123400Z" — where Yontrack 5 wrote them as
an array of numbers, [2025,11,4,9,12,30,123400000]. The GraphQL API does not change.
Indicators removed
The indicators — project indicators, their categories, types, views and portfolios, the GitHub compliance checks, and the indicators computed from Jenkins pipeline files and libraries and from SonarQube — are removed, with no replacement. For numbers about how projects deliver, see the delivery scorecard, which Yontrack computes from its own data.
For deployers
- Data — at its first start, Yontrack 6 deletes the stored indicator values, categories, types, views, portfolios and computed state, and the Jenkins pipeline-library indicator settings.
- Roles —
PROJECT_INDICATOR_MANAGERandGLOBAL_INDICATOR_MANAGERare gone, and their grants are deleted. - Metrics —
ontrack_indicator(exported) andontrack_indicators_computing_msare gone.
For CasC users
The ontrack.config.settings.jenkins-pipeline-library-indicator key is ignored with a warning: see
Unknown and removed keys.
For API clients
The indicator queries and mutations of the GraphQL API are gone, among them indicatorCategories,
indicatorTypes, indicatorPortfolios, indicatorViewList, indicatorsManagement,
configurableIndicators and Project.projectIndicators.
Elasticsearch search removed
Yontrack 6 searches in its Postgres database, and no longer needs Elasticsearch. See Search index for how it works and how to operate it.
For deployers
- Elasticsearch is optional — it is only used by the export of the metrics
(
ontrack.extension.elastic.metrics.enabled=true), which is disabled by default. Without it, Yontrack creates no Elasticsearch client and has no Elasticsearch health indicator, and the Elasticsearch cluster can be retired, along with thespring.elasticsearch.*properties. An export withtarget: MAINstill readsspring.elasticsearch.*. When it is enabled, the Elasticsearch health indicator is part of the health of Yontrack: themanagement.health.elasticsearch.enabled: falsedefault of 5.x is gone. pg_trgm— search needs thepg_trgmextension of Postgres. Yontrack creates it at its first start, withCREATE EXTENSION IF NOT EXISTS pg_trgm. When the database user of Yontrack cannot create extensions, create it beforehand, once, as a user who can. It ships with Postgres, and the owner of a database can create it on the managed services (RDS, Cloud SQL, Azure), since it is a trusted extension.- A one-off rebuild — at its first start, Yontrack 6 builds the search documents of every type in the background. Yontrack is usable in the meantime, and a search answers with what exists so far, saying "Search index is being built". On a large installation, the SCM commits take the longest.
- Retired settings —
ontrack.config.search.index.immediateandontrack.config.search.index.ignoreExistingare gone, and ignored if still set.ontrack.config.search.index.batch,logging,tracingandresetkeep their meaning. - Jobs and metrics — the jobs of the
elasticsearchcategory are replaced by thesearch / rebuild / {type}jobs of thesearchcategory, and theontrack_elasticsearch_*metrics byontrack_search_*:ontrack_elasticsearch_index_all{index}is nowontrack_search_index_all{type}, next toontrack_search_index_errors{type}.
For Helm chart users
Version 6.x of the Helm chart installs Yontrack 6. See also its Upgrading to 6.x section.
- No bundled Elasticsearch — chart 6.x no longer deploys Elasticsearch: the Bitnami
Elasticsearch sub-chart is gone. Remove
elasticsearch.enabledand the other settings of that sub-chart from your values: values from 5.x which keepelasticsearch.enabled: truemake the chart fail to render, with a pointer to its README. Remove theSPRING_ELASTICSEARCH_*environment variables as well: the metrics export is configured by theelasticsearch.*values below, which set them. -
Leftover volume — after a
helm upgradefrom 5.x, the volume of the former Elasticsearch instance is kept, but no longer used: the search is rebuilt from Postgres. Delete it with:kubectl delete pvc data-<release>-elasticsearch-master-0 -
Metrics export — to export the metrics to an existing Elasticsearch cluster, enable it in the values:
elasticsearch: metrics: enabled: true index: ontrack_metrics # default uris: https://es.example.com:9200 username: yontrack existingSecret: yontrack-es # secret holding the password existingSecretPasswordKey: passwordThe chart only wires the
target: MAINexport, through thespring.elasticsearch.*properties.urisis required when the export is enabled;usernameandexistingSecretare optional. -
pg_trgm— nothing to do with the Postgres bundled by the chart: theontrackuser owns the database, so Yontrack creates the extension itself. With an external database, thepg_trgmrule of For deployers above applies.
For API clients
- The
POST /rest/search/index/type/{type}andPOST /rest/search/index/resetendpoints are unchanged, and act on the Postgres search documents. An unknown type now answers with an error. - The GraphQL
search(query, types, offset, size, perType)query replaces thesearch(token, type, offset, size)form, which is deprecated: see Newly deprecated.
Pure-Git support removed
A project can no longer be associated with a plain Git repository through the Git configuration property. Yontrack 6 reads the code of a project from GitHub, GitLab or Bitbucket (Cloud or Server) only. The Git configurations, which only this property used, go with it.
For deployers
- Before upgrading, move every project still using the Git configuration property to its
GitHub, GitLab or
Bitbucket Cloud configuration. Yontrack 5.5 counts
each project read through it in
ontrack_deprecated_usage_total, withsurface=propertyanditem=net.nemerosa.ontrack.extension.git.property.GitProjectConfigurationPropertyType. - Data — at its first start, Yontrack 6 deletes the Git configuration property of every project, and every Git configuration. A project which still had the property is left with no SCM: its Git indexation stops, and its change logs, commit information and branch information are no longer available until it is given a GitHub, GitLab or Bitbucket configuration. Its branches keep their Git branch property, and its builds their Git commit property.
- Connectors — the connector status no longer lists the
gitconnectors.
For API clients
The Project.gitProjectConfigurationProperty field of the GraphQL API is gone, and the
net.nemerosa.ontrack.extension.git.property.GitProjectConfigurationPropertyType property type
can no longer be read or set, through the GraphQL API or the REST API.
Pull request cache now active
The information Yontrack reads about a pull request — its title, status, source and target — is
now cached, as the ontrack.config.extension.git.pull-requests.cache.* properties always said it
was. Yontrack 5 had the condition inverted: with the cache enabled, the default, every lookup went
to the SCM, and disabling the cache turned it on
(#1934).
This only concerns an instance with pull requests enabled
(ontrack.config.extension.git.pull-requests.enabled: true, off by default).
For deployers
- PR information can be up to 6 hours old. The cache keeps a pull request for
ontrack.config.extension.git.pull-requests.cache.duration— 6 hours by default — before asking the SCM again, so a pull request renamed, merged or closed in the SCM can show its former state in Yontrack until then. - Fewer calls to the SCM. Pull request lookups by the branch pages, the PR decorations and the stale-branch cleanup mostly stop reaching GitHub, GitLab or Bitbucket.
- The cache metrics move.
ontrack_extension_git_pr_cache_hitsandontrack_extension_git_pr_cache_missnow count, where they stayed at zero. - To keep the uncached behaviour of Yontrack 5, set
ontrack.config.extension.git.pull-requests.cache.enabled: false(ONTRACK_CONFIG_EXTENSION_GIT_PULLREQUESTS_CACHE_ENABLED=false). An instance which had set it tofalseto turn the cache off was in fact running with it on, and gets the uncached behaviour it asked for.
Delivery metrics and the delivery scorecard
Yontrack 6 introduces the delivery scorecard: lead time, frequency, success rate, time to restore, test pass rate and test flakiness, and the security readings — security maturity, remediation time and overdue findings, read from the security scans — read every day for every project and kept as daily snapshots, and read together, against targets, in licensed estates. The estate view shows the projects of an estate side by side, and fans one finding out over them. The delivery-metrics extension of Yontrack 5 is removed, and its promotion-level charts now run on the samples of the scorecard.
For deployers
The promotion-level charts are kept — their names, their getChart path, their
dashboard widgets and their options are unchanged, and
so is the end-to-end lead time chart. Three of
them change what they measure:
- Time to restore starts earlier. An outage now starts at the first unpromoted build after a promoted one, not at the last. For B1 promoted, B2, B3 and B4 not promoted, and B5 promoted, the time to restore goes from the creation of B2 to the promotion of B5, where it used to go from the creation of B4. The numbers grow for any outage longer than one broken build; an outage of a single build reads as before.
- Lead time is counted in the period of the build's first promotion at the level, and once per build, where it was counted in the period of the build's creation, once per promotion run.
- Success rate leaves out the builds in flight at the end of the charted interval — created within its median lead time before its end — which had not had the time to be promoted.
The ontrack_dm_* metrics are removed, all seven of them, with no transition release. The
readings take over, exported as the ontrack_reading
metric:
| Yontrack 5 metric | Yontrack 6 |
|---|---|
ontrack_dm_promotion_lead_time |
ontrack_reading, reading=delivery.leadTime |
ontrack_dm_promotion_success_rate |
ontrack_reading, reading=delivery.successRate |
ontrack_dm_promotion_ttr |
ontrack_reading, reading=delivery.mttr |
ontrack_dm_time_since_promotion |
No replacement |
ontrack_dm_relative_time_since_promotion |
No replacement |
ontrack_dm_time_since_passed_validation |
No replacement |
ontrack_dm_time_since_validation |
No replacement |
The mapping is not one to one, and dashboards built on the old metrics need rebuilding rather than renaming:
- The
ontrack_dm_promotion_*metrics gave one point per build, tagged by source and target project, branch and promotion level.ontrack_readinggives one point per project, reading and set, per day: the median for a duration, in seconds, the percentage for a success rate. - The promotion level is no longer a tag: a reading is read up to its set's marker — with no
estate, the last promotion level of each branch. Filter on
estate=-for the readings of each project on its own, or on an estate's name for the estate's marker. - The time-to-restore reading has the new start above.
- The time-since-event metrics have no replacement.
Removed configuration:
- the E2E Promotion Metrics Export settings — deleted at the first start of Yontrack 6;
- the
ontrack.extension.delivery-metrics.tse.enabledandontrack.extension.delivery-metrics.tse.intervalconfiguration properties, no longer read; - the jobs of the
delivery-metricscategory.
New: the Delivery scorecard settings, the daily jobs of
the Delivery scorecard category, and the ontrack_readings_computation and
ontrack_readings_errors metrics.
The remediation readings measure exposure episodes. security.remediationTime and
security.overdue no longer run from the first observation of a finding: the remediation time takes
one sample per exposure episode ending in
the window, and the age of an overdue finding runs from the start of its current episode. A
finding which was fixed and came back no longer counts the time it stayed fixed, so their values
can drop for reopened findings, compared with the snapshots taken before.
For API clients
The data of a security-findings validation run now records the kind of the scan — IMAGE,
CODE, SECRETS, DAST, DEPENDENCIES or OTHER — beside the counts by severity, as kind. It
is what the security maturity reads; a run sent
before Yontrack 6 has none, and is read by the kinds of the findings it reported.
For CasC users
The ontrack.config.settings.e2e-promotion-metrics key, which configured the E2E Promotion
Metrics Export settings, is ignored with a warning: see
Unknown and removed keys.
Failed and backdated deployments
A slot deployment can now fail, and be recorded after the fact.
For API clients
FAILEDstatus — a slot pipeline has a new, final status,FAILED, besideDONEandCANCELLED. A client reading the status of a deployment must expect it. It is reached through the newfailSlotPipelinemutation, and sends the newslot-pipeline-failedevent.dateTime—startSlotPipeline,startSlotPipelineDeployment,finishSlotPipelineDeployment,failSlotPipelineandcancelSlotPipelinetake an optionaldateTime. Without it, nothing changes.- License errors — calling a licensed query, field or mutation without the license — of the
environments, for example — now fails with a
FORBIDDENerror naming the feature, such as Feature not allowed by the license: extension.environments, where it failed with anINTERNAL_ERRORand no message. - Pending checks —
SlotPipeline.errorMessagenow reports failed checks only. A deployment merely waiting — a workflow still running or not started yet, a manual approval not answered — has a nullerrorMessageand says what it waits for in the newSlotPipeline.pendingMessage. A client pollingerrorMessageto know whether a deployment is blocked should readpendingMessagetoo, orSlot.blocked.SlotDeploymentCheck.state(OK,PENDING,FAILED) andSlot.blockingStateare new and tell the two apart.
Audit trail
Yontrack 6 records the story of every build in an audit trail, under license, with evidence attached to the validation runs. Without the license, nothing is recorded, but these changes, which came with it, apply to every installation.
For deployers
DEGRADEDhealth — the health has a new status,DEGRADED, answered with HTTP200: a feature does not work while the instance does. The overall status isDEGRADEDwhile the license of the audit trail is on and its evidence storage is not configured or cannot be reached. A monitoring which expected onlyUPorDOWNmust accept it. See Management port.- Multipart limits —
spring.servlet.multipart.max-file-sizeandmax-request-sizeare raised for every multipart request to the maximum size of an evidence,ontrack.extension.audit-trail.storage.max-size(50 MB by default) — plus 1 MB for the request. The multipart requests are parsed only once a controller reads them. - Ingress — the CI pipelines upload evidence to
/rest/extension/audit-trail: an ingress which routes only/graphqland/hookto the backend must route it too. See Uploading evidence.
For API clients
- Unknown paths with a token — a call authenticated by an API token to a path which does not
exist now answers
404, as for any other authenticated caller, where it answered401.
GitHub workflow ID no longer sent by default
GitHub returns the run of a workflow it dispatches, so the id input which Yontrack passed to find
it is needed only on a GitHub which does not return it. The workflowSendId field of a
GitHub configuration is now false by
default: the auto-versioning post-processing and the GitHub workflow notifications no longer send
id, unless their sendId says otherwise.
For deployers
The GitHub configurations stored before the upgrade keep workflowSendId: true: the upgrade
writes it into those which did not set it. Nothing changes for them.
For API clients
createGitHubConfiguration without a workflowSendId input now creates a configuration with
workflowSendId: false.
For CasC users
A GitHub configuration defined as code is applied again from its YAML at startup, so the upgrade
does not keep its former value: without workflowSendId, it becomes false, and a workflow
declaring the id input rejects the dispatch. Either add workflowSendId: true to the
configuration to keep sending id, or remove the id input and the inputs-<id>.properties
artifact step from the workflows — on a GitHub which returns the run of a dispatch.
Federated sign-out
Signing out of Yontrack now also ends the session at the identity provider, so that signing back in asks for the credentials again instead of being answered silently. See Sign-out.
For deployers
- The Keycloak provider of the UI — Yontrack's own Keycloak, the default, or a Keycloak of
yours, with
NEXTAUTH_PROVIDERnot set tooidc— nothing to do: the session is ended from the server. - The generic OIDC provider of the UI (
NEXTAUTH_PROVIDER=oidc— Auth0, Microsoft Entra ID, any OIDC provider, see OIDC authentication) — registerhttps://<your-yontrack>/api/auth/signout-completeat the provider, as a post-logout redirect URI: see Sign-out for where. Until it is registered, signing out leaves the user on the provider's page — an error page on Keycloak and Auth0 — instead of coming back to Yontrack. To keep signing out of Yontrack only, set theNEXTAUTH_FEDERATED_SIGNOUTenvironment variable of the UI tofalse.
GraphQL query limits
The GraphQL API now limits the cost of a query: its number of aliases, of directives on one
location, its depth and its complexity. A query going over one of them is rejected with one
ExecutionAborted error, and none of it runs. See
GraphQL query limits
(#2046).
For API clients
- The Yontrack UI, the
yontrackCLI and the MCP server are well within the defaults: their largest queries are measured on the GraphQL query limits page. - A script or integration of your own sending very large queries (more than 30 aliases, a depth above 25, more than 1000 fields) gets the error instead of an answer. Split the query, or have the limit raised.
For deployers
- To find the clients going over a limit before enforcing it, set
ontrack.config.graphql.limits.mode: WARN(ONTRACK_CONFIG_GRAPHQL_LIMITS_MODE=WARN): the queries run, and each one going over a limit logs a warning and counts in theontrack_graphql_limits_exceeded_totalmetric. - To raise a limit, set the
ontrack.config.graphql.limits.max-*property it names in its error.
Ordered queues: GitHub ingestion and TFC
The GitHub ingestion and the TFC hooks process the events of a repository, or of a workspace, in
order, one at a time. Their RabbitMQ queues are now declared with a single active consumer
(x-single-active-consumer): the broker delivers the messages of a queue to one consumer at a time,
whatever the number of backends, and hands over to another backend when it goes away. Before, each
backend added its own consumer, and the events of one repository could be processed concurrently,
and out of order, while two backends ran side by side
(#2082).
For deployers
- New queue and exchange names — the arguments of an existing queue cannot change, so these
queues, and their exchanges, have new names:
- GitHub ingestion: the
github.ingestion.v2exchange, and thegithub.ingestion.v2.default,github.ingestion.v2.default.Nandgithub.ingestion.v2.<name>queues, instead ofgithub.ingestion,github.ingestion.default,github.ingestion.default.Nandgithub.ingestion.<name>; - TFC: the
ontrack.queue.tfc.v2exchange, and theontrack.queue.tfc.v2.Nqueues, instead ofontrack.queue.tfcandontrack.queue.tfc.N.
- GitHub ingestion: the
- Messages left in the old queues are abandoned — the backends of the previous version consume their queues until they stop, and the messages still there are not moved to the new ones.
- The old queues and exchanges are deleted automatically — nothing to do: the Legacy queue cleanup job deletes, every 10 minutes, the old queues no backend consumes anymore, then the old exchanges. A queue still consumed by a backend of the previous version, during the upgrade, is kept until that backend is gone.
- Changed values — the
queuetag of theontrack_extension_github_ingestion_queue_consumed_countmetric, the queue stored with the new GitHub ingestion payloads, which thequeuefilter of their GraphQL query matches, and the queue of the new TFC queue records take the new names. The older ones keep the old names.
Removed
Yontrack 6 removes what Yontrack 5 deprecated. Each item is listed here with what to use instead, by the way it is used: the GraphQL API, the REST API, configuration as code, the configuration properties and environment variables, templating, the CI configuration, and the GitHub ingestion configuration.
The latest 5.5.x release counts every use of these items: see Upgrade path.
GraphQL API
| Removed | Use instead |
|---|---|
Account.name |
Account.email |
PromotionLevel.promotionRuns |
PromotionLevel.promotionRunsPaginated, its size argument for first |
PromotionLevel.autoVersioningTrail |
PromotionLevel.autoVersioningTrailPaginated |
PromotionRun.autoVersioningTrail |
PromotionRun.autoVersioningTrailPaginated |
AutoVersioningOrder.targetPaths |
AutoVersioningOrder.targetPath |
SearchResult.page |
No replacement: build the link from the type and data of the result |
SearchResult.uri |
No replacement: build the link from the type and data of the result |
VersionInfo.date |
No replacement: the field was always empty |
HookResponse.info |
HookResponse.infoLink |
EventSubscriptionPayload.id |
EventSubscriptionPayload.name |
promotionRuns—promotionRunsPaginatedreturns a page,{ pageInfo pageItems }, the most recent runs first.promotionRuns(first: N)becomespromotionRunsPaginated(size: N); thelastargument has no equivalent.autoVersioningTrail— the trail is now a page of branches,{ pageInfo pageItems }, whereautoVersioningTrailreturned anAutoVersioningTrailobject and itsbranches: theAutoVersioningTrailtype is gone with it. The paginated field returns only the eligible branches by default; passfilter: {onlyEligible: false}to get the rejected ones too, with theirrejectionReason, asautoVersioningTraildid.HookResponse.info— the unstructured information returned by a hook is gone, from the hook records and from the answer of thePOST /hook/secured/{hook}endpoint alike.infoLinkcarries the information structured; a disabled hook answers with theIGNOREDtype, and its record has theDISABLEDstate. The hook records stored by Yontrack 5 are still read, without it.- Subscriptions without a name — the
nameofSubscribeToEventsInput, and of thesubscribe<Entity>ToEventsmutations (subscribeProjectToEvents,subscribeBranchToEvents, …), is now required. A subscription created without one is rejected with a validation error, where Yontrack 5 named it with a hash of its content. Counted by 5.5.x assubscription without name, withsurface="graphql". The subscriptions Yontrack 5 already stored keep their names.
REST API
| Removed | Use instead |
|---|---|
POST /rest/structure/promotionLevels/{id}/image |
PUT /rest/structure/promotionLevels/{id}/image |
POST /rest/admin/predefinedPromotionLevels/{id}/image |
PUT /rest/admin/predefinedPromotionLevels/{id}/image |
The POST endpoints took the image as a multipart file. The PUT endpoints take the PNG image
encoded in Base64, on a single line, as the body of the request, for example:
base64 < gold.png | tr -d '\n' | curl -X PUT -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: text/plain" --data-binary @- \
"$YONTRACK_URL/rest/structure/promotionLevels/42/image"
Configuration as code
| Removed | Use instead |
|---|---|
A subscription without a name, global-subscriptions |
A name, unique in its scope |
A subscription without a name, entity-subscriptions |
A name, unique in its entity |
Under ontrack.extensions.notifications, every entry of global-subscriptions, and every entry of
the subscriptions of an entity-subscriptions item, must have a name. A configuration with an
unnamed subscription fails to apply, where Yontrack 5 named it with a hash of its content. Counted
by 5.5.x as subscription without name, with surface="casc". To keep a subscription Yontrack 5
created from an unnamed entry, give the entry the name Yontrack 5 generated for it, as the
Subscriptions page or the rendered CasC shows it. Under another name, a new subscription is
created: entity-subscriptions deletes the old one, global-subscriptions keeps it until it is
deleted by hand.
Configuration properties
| Removed | Use instead |
|---|---|
ontrack.extension.elastic.metrics.api-compatibility-mode |
No replacement: the Elasticsearch 9 client needs no compatibility mode |
The property is ignored if still set.
Templating
| Removed | Use instead |
|---|---|
The name field of the #.user function, #.user?field=name |
#.user?field=email, or #.user: the email is the default |
A template still using #.user?field=name fails to render, with an error listing the accepted
fields, display and email.
Auto-versioning configuration
Yontrack 5 accepted short aliases for eight parameters of an auto-versioning configuration, kept for the old Jenkins pipeline library (#1515). Yontrack 6 accepts only the full names:
| Removed | Use instead | Counted by 5.5.x as (surface="ci-config") |
|---|---|---|
project |
sourceProject |
autoVersioning.configurations.project |
branch |
sourceBranch |
autoVersioning.configurations.branch |
promotion |
sourcePromotion |
autoVersioning.configurations.promotion |
path |
targetPath |
autoVersioning.configurations.path |
regex |
targetRegex |
autoVersioning.configurations.regex |
property |
targetProperty |
autoVersioning.configurations.property |
propertyRegex |
targetPropertyRegex |
autoVersioning.configurations.propertyRegex |
propertyType |
targetPropertyType |
autoVersioning.configurations.propertyType |
A configuration still using one of them is rejected: in the autoVersioning section of the
CI configuration, the whole CI configuration fails to apply, with
an error naming the field — the missing sourceProject for a configuration using project, the
unrecognized regex for one using regex. The entries of additionalPaths are not concerned:
they keep their path, regex, property, propertyRegex and propertyType names.
The configurations Yontrack 5 already stored need no conversion: it always stored them with the full names, whatever name they were sent with.
GitHub ingestion configuration
The GitHub ingestion reads its configuration from the .github/ontrack/ingestion.yml file of the
repository, or from the setBranchGitHubIngestionConfig mutation. Yontrack 6 reads only the v2
format of this file:
| Removed | Use instead |
|---|---|
version: v1 |
version: v2, with vs-name-normalization: LEGACY |
| The unversioned format | version: v2 |
v1— its fields are the ones ofv2; only the default ofvs-name-normalizationdiffers,LEGACYinv1andDEFAULTinv2. Setversion: v2andvs-name-normalization: LEGACYto keep the names of the validation stamps the ingestion creates. Av1file is rejected: the ingestion of the payload which loads it fails with Unsupported version for the ingestion configuration: v1. Use version v2 instead.- The unversioned format — the original format, before
v1, hadjobsandstepsas lists, andgeneral,jobsFilter,stepsFilter,validations,promotions,runsandcascat the top level:v2hasjobs.mappings,steps.mappings,jobs.filter,steps.filter, andsetup.validations,setup.promotions,setup.projectandsetup.branch. A file without aversionis now read asv2: one in the unversioned format fails to parse, on the first fieldv2does not know or types differently, and one with onlyworkflows.filterortaggingreads as it did.
Unlike the other items of this page, 5.5.x does not count the use of these formats: check the
ingestion.yml files of the ingested repositories for a version other than v2.
Newly deprecated
Yontrack 6 deprecates the items below. They still work in every 6.x release, and are removed in
Yontrack 7. Each use of one of them is counted in ontrack_deprecated_usage_total, and logged as a
WARN the first time: see Usage of deprecated features.
GraphQL API
| Deprecated | Use instead |
|---|---|
The Query.search(token) argument |
query |
The Query.search(type) argument |
types, a list of types |
The SearchResults.pageInfo field |
total, with the offset and size arguments of search |
The SearchResults.pageItems field |
items |
REST API
| Deprecated | Use instead |
|---|---|
GET /rest/events/root |
The events GraphQL query |
GET /rest/events/{entityType}/{entityId} |
The events GraphQL query, filtered by its project |
The events query is restricted to the EventsAudit global function, which only administrators
have: once these endpoints are removed, the events of a project or of one of its entities are no
longer readable by non-administrators. Each call to one of the endpoints is counted under its item,
with surface="rest".
GitHub configurations
| Deprecated | Use instead |
|---|---|
Authenticating a GitHub configuration with a user and a password |
A token, oauth2Token, or a GitHub App, appId and appPrivateKey |
GitHub refuses passwords for its API. A GitHub configuration authenticating with a user and a
password still works in 6.x, whether it is created in the UI, through the
createGitHubConfiguration mutation — its password input field — or as code. Each time such a
configuration is saved or used, it is counted as GitHub configuration password authentication,
with surface="settings".
The GitHub configurations page marks it with a warning in its Authentication column.
Configuration as code
The kebab-case aliases of a few CasC keys are deprecated: use the camel-case names, the only ones
the CasC JSON schema lists. Each use of an alias is counted with
surface="casc", under the item given here.
| Deprecated alias | Use instead |
|---|---|
ontrack.config.github.app-id |
appId |
ontrack.config.github.app-private-key |
appPrivateKey |
ontrack.config.github.app-installation |
appInstallationAccountName |
ontrack.config.github.auto-merge-token |
autoMergeToken |
ontrack.config.github.workflow-send-id |
workflowSendId |
ontrack.config.webhooks.timeout-seconds |
timeoutSeconds |
ontrack.extensions.notifications.global-subscriptions.channel-config |
channelConfig |
ontrack.extensions.notifications.entity-subscriptions.subscriptions.channel-config |
channelConfig |
For example, a global subscription:
ontrack:
extensions:
notifications:
global-subscriptions:
- name: On Gold
events:
- new_promotion_run
channel: slack
channelConfig: # instead of channel-config
channel: "#my-channel"
Configuration properties
| Deprecated | Use instead |
|---|---|
ontrack.extension.queue.general.warn-if-async |
ontrack.extension.queue.general.warn-if-sync |
ontrack.config.jobs.paused-at-startup |
The Pause all action of the Jobs page |
The property emits a warning when the queues are processed synchronously: its former name said the
opposite of what it does. The old name, in any of its spellings — warnIfAsync, or
ONTRACK_EXTENSION_QUEUE_GENERAL_WARNIFASYNC as an environment variable — still sets the property,
and is counted once at startup with surface="config". When both are set, the new name wins.
The jobs run in a scheduler shared by all the replicas, and pausing all the jobs is stored: it
applies to every replica, survives restarts, and lasts until somebody resumes all the jobs.
ontrack.config.jobs.paused-at-startup (ONTRACK_CONFIG_JOBS_PAUSEDATSTARTUP) still pauses all the
jobs when a replica starts with it — and so pauses the whole cluster, until resumed. Pause all the
jobs from the Jobs page, or with the pauseAllJobs mutation, instead. The property is counted once
at startup with surface="config" when it is set.
CI environment
| Deprecated | Use instead |
|---|---|
The ONTRACK_SCM_ISSUES variable of the CI environment |
YONTRACK_CI_SCM_ISSUES |
The CI configuration reads the issue service of a project —
serviceId//serviceName — from its issueServiceIdentifier, else from the
YONTRACK_CI_SCM_ISSUES variable of the CI environment, else from ONTRACK_SCM_ISSUES. A project
whose issue service is taken from ONTRACK_SCM_ISSUES is counted as ONTRACK_SCM_ISSUES, with
surface="env".