#39Upgrading the Framework
Release tags, the stable contract, the frozen package, pull, pin, roll back.
4 min read · 38 of 38 in reading order
An installation that runs abap2UI5 runs a version of it, and sooner or later pulls the next one. This is what a version is, what it promises, and how the move is made.
What a release is. A release is a git tag on the framework repository,
X.Y.Z on main and X.Y.Z-702 on the generated downport branch
(#27). main moves
with every merge; a tag does not. The release notes
list every tag with its date — eight of them in 2026 so far, from 1.142.0 in
July to 1.148.0 in October — and the version an installation runs is the
constant z2ui5_if_app=>version.
What is stable. The public API is the package src/02:
z2ui5_if_app, z2ui5_if_client, z2ui5_if_ui5_exit,
z2ui5_if_ui5_monitor, z2ui5_cl_ui5_http_handler,
z2ui5_cl_ui5_view_builder and the language-model seam. An app that uses
only those compiles on the next release or finds its change on the
deprecations page; the framework records the package symbol for symbol and
checks every change against it. Everything else — src/00 and src/01, the
handler’s internals, the draft service, the generated frontend classes — is
the framework’s own and may change between two tags without notice. The
linter reports an app that reaches outside the public
package as non-released-api, which is the cheapest way to find out before
an upgrade does.
What frozen means. The package src/99 holds what the framework
replaced and still ships: the predecessor view builder, the old handler
shim, the superseded exit and types interfaces, the retired utility classes,
the built-in popups. Nothing in the framework calls them, a gate refuses a
change to them, and an app that still uses one keeps compiling release after
release. Frozen is not stable: it means the code will not be fixed either.
Every object in it is named, with its successor, on
Deprecations — the one page that names them.
The deprecations page is the upgrade plan. Its version-status table
names what has a successor, what the successor is, and the release that made
the change — and entries marked next release are already on main and not
in a tag yet, which tells an installation on the newest tag what the next pull
brings. npx @abap2ui5/linter src --fix rewrites the mechanical part of the
table over an app package and reports the rest.
How the pull is done. The framework is an abapGit repository, so an
upgrade is a pull of the next tag: switch the repository’s branch to the tag
in abapGit and pull, which activates the changed objects. The standalone ICF
installation needs nothing else — the frontend is embedded in the backend
classes (#11), so the
page and the modules the browser loads are the new ones with the same pull.
A launchpad installation has one more repository, the shell BSP from
abap2UI5/frontend
(#26): the branch standard
carries the frontend itself and is pulled along, standard_v2 is the same
for the legacy-free frontend, and standard_new carries only a container
that loads the frontend from the backend, so an installation on that branch
upgrades the launchpad shell with the backend pull alone
(Fiori Launchpad). Add-ons are repositories of
their own with tags of their own, pulled the same way.
Pinning. A productive system installs a tag, not main
(Productive Usage): main may carry an API
no release has, and a pull of main on two days is two different frameworks.
The release number in the manual’s version dropdown and on the deprecations
page is the one the manual is written against.
Rolling back. The previous tag is still there, and a pull of it is the
same operation as the upgrade. The framework writes one table, z2ui5_t_01,
and its rows are serialized instances that expire within hours
(#38), so there is no data to migrate
in either direction; a user whose draft was written by the other version
restarts the app. Apps that already use an API the previous tag lacks do not
compile on it — the deprecations table says which release brought what.
What to re-test. The things a tag can change for an installed app, in the order they fail:
- the user exit:
z2ui5_if_ui5_exitis public API, but a field of its configuration structures may gain a default or a sibling — read the exit’s own methods against the changelog, the CSP in particular (Security); - the app classes against the deprecations table, with the linter over the package;
- custom controls in
z2ui5_cccand the popups and other add-ons, each against its own release; - the launchpad tile: after the frontend BSP changes, the UI5 app index
(
/UI5/APP_INDEX_CALCULATE) and the HTTP cache inSMICM; - one roundtrip per app in a browser, the one check that needs a system.