Description
The Ubuntu 2024.04 noble base would allow access to newer apt packages. Heroku themselves uses a system of opt-in upgrades to transition from one stack to another. We do not currently have a mechanism for doing something similar. Making a direct move from Ubuntu 2022.04 to Ubuntu 2024.04 should probably require some mechanism for folks to test rebuilding their images while preserving the ability to run the prior image.
https://github.com/heroku/cnb-builder-images/tree/main/builder-24
Things that changed/testing (WIP):
- Apt buildpack was replaced by deb-packages T394466: [build-service] remove legacy fagiani/apt 0.2.5 builder from `--use-latest-versions` stack
- Procfile changed behavior, no extra arguments are passed anymore at all (can't pass custom args at runtime to procfile defined entries) - still testing to make sure
- Golang and procfile now behave correctly (procfile can override golang defined processes)
- Test php (+nodejs)
- Test ruby (+nodejs)
- Test python (+nodejs)
- Test nodejs
- Test static
- Replace injected dotnet with built-in dotnet (test compatibility with existing dotnet project)
- Test java/scala - jvm
- Test clojure injected buildpack for compatibility
- Poetry + requirements.txt compatibility (I think it will not allow poetry.lock + requirements.txt at the same time)
Related Objects
| Status | Subtype | Assigned | Task | ||
|---|---|---|---|---|---|
| Resolved | dcaro | T381923 Toolforge Build Service does not support .python-version | |||
| Resolved | BUG REPORT | dcaro | T390845 [builds-builder] Golang buildpack does not allow using Procfiles so can't use custom scripts/entrypoints | ||
| Stalled | BUG REPORT | dcaro | T363417 [builds-builder] golang based images get infinite nested loops for procfile entries | ||
| In Progress | Feature | dcaro | T380127 [builds-builder] Add support for Heroku's "24" builder stack based on Ubuntu 2024.04 noble | ||
| Duplicate | BUG REPORT | None | T394466 [build-service] remove legacy fagiani/apt 0.2.5 builder from `--use-latest-versions` stack | ||
| Duplicate | Feature | None | T401875 [Build service] latest builder has old PHP |
- Mentioned In
- T422046: [builds-api] expose supported versions
T363417: [builds-builder] golang based images get infinite nested loops for procfile entries
T405415: [Build service] latest builder has old Java
T401875: [Build service] latest builder has old PHP
T418414: Node.js buildpack selects EOL Node.js version
T408321: [builds] What are the current best practices for CI?
T408108: [build service] Python pack is outdated, does not support latest Python 3.14 stable release
T394466: [build-service] remove legacy fagiani/apt 0.2.5 builder from `--use-latest-versions` stack
T363027: [builds-builder] Support adding repositories for Apt buildpack
T381899: Add support for Python 3.13
T381923: Toolforge Build Service does not support .python-version
T374056: [builds-builder] Upgrade python buildpack to v0.17.0 or newer for Poetry support
T363854: Upgrade golang buildpack to 1.22
T353762: Python buildpack does not detect requirements from pyproject.toml
T380108: ircservserv not detecting message sender when running behind ZNC v1.8.2 - Mentioned Here
- T420547: [builds-api,builds-builder] php buildpack is broken on current default buidlpacks and `--use-latest-versions` ones
T405415: [Build service] latest builder has old Java
T394466: [build-service] remove legacy fagiani/apt 0.2.5 builder from `--use-latest-versions` stack
- Duplicates Merged Here
- T405415: [Build service] latest builder has old Java
T363854: Upgrade golang buildpack to 1.22
T401875: [Build service] latest builder has old PHP
T408108: [build service] Python pack is outdated, does not support latest Python 3.14 stable release
T418414: Node.js buildpack selects EOL Node.js version
Event Timeline
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/752
builds-api: bump to 0.0.187-20250423130326-2e1c3b05
Much looking forward to this change, thanks so much for doing it! Can't wait :-)
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/builds-api/-/merge_requests/124
start: Add useLatestBuilder parameter and configs
group_203_bot_f4d95069bb2675e4ce1fff090c1c1620 opened https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/775
builds-api: bump to 0.0.190-20250512093109-f2cdc829
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/775
builds-api: bump to 0.0.190-20250512093109-f2cdc829
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/builds-cli/-/merge_requests/103
build.start: add use-latest-versions option
dcaro opened https://gitlab.wikimedia.org/repos/cloud/toolforge/builds-cli/-/merge_requests/105
d/changelog: bump to 0.0.20
dcaro opened https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/776
builds-api: configure the builder/runner images
dcaro opened https://gitlab.wikimedia.org/repos/cloud/toolforge/components-api/-/merge_requests/72
config: add use_latest_versions to the source build
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/776
builds-api: configure the builder/runner images
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/builds-cli/-/merge_requests/105
d/changelog: bump to 0.0.20
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/components-api/-/merge_requests/72
config: add use_latest_versions to the source build
group_203_bot_f4d95069bb2675e4ce1fff090c1c1620 updated https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/914
components-api: bump to 0.0.141-20250811094820-170ea067
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/914
components-api: bump to 0.0.141-20250811094820-170ea067
@dcaro Is it possible to test this new heroku stack? I'm trying to migrate to openjdk 25, it's supposed to work with heroku-22 but it doesn't, so I'm hoping it would work with the new one.
EDIT: I tried to add but it seems to still pick heroku-22 build runner.
EDIT2: no, it uses heroku-24 but I still cannot use jdk 25, is it possible to refresh the heroku images? Here's my error:
[step-set-stack-toml] 2025-09-23T18:19:40.402757880Z Using run image: tools-harbor.wmcloud.org/toolforge/heroku-runner:24 [step-detect] 2025-09-23T18:19:43.665626150Z 3 of 6 buildpacks participating [step-detect] 2025-09-23T18:19:43.666898836Z heroku/jvm 6.2.0 [step-detect] 2025-09-23T18:19:43.666946250Z heroku/maven 6.2.0 [step-detect] 2025-09-23T18:19:43.666960346Z heroku/procfile 4.2.1 [step-build] 2025-09-23T18:19:44.380870594Z [step-build] 2025-09-23T18:19:44.380966600Z ## Heroku OpenJDK Buildpack [step-build] 2025-09-23T18:19:44.380985154Z [step-build] 2025-09-23T18:19:44.385525182Z - OpenJDK version resolution [step-build] 2025-09-23T18:19:44.385565043Z - Using version string provided in system.properties [step-build] 2025-09-23T18:19:44.390233334Z - Done (finished in < 0.1s) [step-build] 2025-09-23T18:19:44.397278222Z ! ERROR: Unsupported OpenJDK version [step-build] 2025-09-23T18:19:44.397344059Z ! [step-build] 2025-09-23T18:19:44.397363553Z ! The OpenJDK major version 25 you specified in your system.properties file is not supported. [step-build] 2025-09-23T18:19:44.397378698Z ! Please specify a supported major version in your system.properties file. [step-build] 2025-09-23T18:19:44.397388712Z ! [step-build] 2025-09-23T18:19:44.399329026Z ERROR: failed to build: exit status 1
EDIT3: Sorry for the noise, I created T405415 for the problem above.
I am not sure whether my comment is related to this, but my campwiz-nxt build (which used to be build using go 1.24 properly) suddenly is broken (See the logs using ). it is showing that heroku/go:0.1.13 is being used which only supports upto go1.21. Before the Push-and-Deploy, I used to build the backend using go1.24. I am getting the following:
[step-detect] 2026-02-06T17:56:14.471730657Z 2 of 4 buildpacks participating [step-detect] 2026-02-06T17:56:14.471846552Z heroku/go 0.1.13 [step-detect] 2026-02-06T17:56:14.471863050Z heroku/procfile 2.0.2 [step-restore] 2026-02-06T17:56:03.647139396Z 2026/02/06 17:56:03 warning: unsuccessful cred copy: ".docker" from "/tekton/creds" to "/tekton/home": unable to open destination: open /tekton/home/.docker/config.json: permission denied [step-build] 2026-02-06T17:56:15.253735558Z [step-build] 2026-02-06T17:56:15.253795469Z [Reading build configuration] [step-build] 2026-02-06T17:56:15.261732071Z Detected Go version requirement: =1.24.1 [step-build] 2026-02-06T17:56:15.262765305Z [step-build] 2026-02-06T17:56:15.262802661Z [Error: Heroku Go Buildpack version resolution error] [step-build] 2026-02-06T17:56:15.262807802Z Couldn't resolve go version for: =1.24.1 [step-build] 2026-02-06T17:56:15.264415401Z ERROR: failed to build: exit status 1
Merged the wrong way :facepalm:
dcaro opened https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/1175
builds-api: update buildpacks to 24_0.20.7/24_0.21.5
dcaro opened https://gitlab.wikimedia.org/repos/cloud/toolforge/builds-api/-/merge_requests/155
build: add use_deprecated_versions
I propose having a process like:
- Regular operation:
- default gives version X
- gives X+1
- there's no
- We announce that the buildpacks are going to be upgraded and give a date so people can start testing with (say 2 weeks?)
- 2 weeks later we roll out a new version:
- is enabled and gives version X
- default gives X+1
- uses X+2
- we send an announcement that the deprecated version is available but will go away in a month, we show the warning message (see below).
- A month after:
- goes away
- default gives X+1
- gives X+2
The key point of adding and removing the (or failing when passed) is there to avoid people on relying on that one so in regular operation they use the default, so on the next upgrade, they still have a buffer to migrate instead of start failing right away.
If they were using all the time, on the next upgrade they will probably ignore the warnings and start trying to migrate only when the image for that flag went away (and the build started breaking without possibility of buffer).
The warning would be something like:
Warning: using the deprecated versions will stop being supported on XX-XX-XX, please adapt to use the default versions before that time or you will not be able to rebuild your tool.
I propose having a process like:
Looks good to me!
Created the entry in wikitech: https://wikitech.wikimedia.org/w/index.php?title=Help:Toolforge/Building_container_images&oldid=2392097
Will send the announce email today.
Sent the email to announce: https://lists.wikimedia.org/hyperkitty/list/cloud-announce@lists.wikimedia.org/thread/EMYTA32EV2V5SQ2JIEOD2CL66YFIZEKV/
Will start working on testing the newer versions (that will be the in two weeks).
@dcaro, I see the version of heroku/deb-packages is still v0.1.3 from April 2025. Is there any chance we could get that bumped up to the latest v0.3.0? The big win there would be support for alternate apt repos.
In T380127#11721215, @bd808 wrote:@dcaro, I see the version of heroku/deb-packages is still v0.1.3 from April 2025. Is there any chance we could get that bumped up to the latest v0.3.0? The big win there would be support for alternate apt repos.
That will happen in two weeks yep, the default version (when no flags passed) will be the current and the will be the one at the version 0.21.5 of the builder (pulled a week or so back, has the deb packages 0.3.0, the one you ask for yep ;) ).
In T380127#11728943, @dcaro wrote:
👍
tools.bd808-test@tools-bastion-14:~$ toolforge build start --use-latest-versions --image-name perl --envvar BP_LOG_LEVEL=DEBUG https://gitlab.wikimedia.org/toolforge-repos/bd808-buildpack-perl-bastion ... [step-detect] 2026-03-19T20:56:17.047208365Z 3 of 6 buildpacks participating [step-detect] 2026-03-19T20:56:17.047319124Z heroku/deb-packages 0.3.0 [step-detect] 2026-03-19T20:56:17.047406505Z heroku/python 6.0.1 [step-detect] 2026-03-19T20:56:17.047506495Z heroku/procfile 4.2.1 ...
All of the cluebot tools are running with the latest builder image (also in CI), the only small issue that came up was opcache wanting an existing path with the newer version of php, otherwise everything is working as expected.
group_203_bot_f4d95069bb2675e4ce1fff090c1c1620 opened https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/1182
builds-builder: bump to 0.0.143-20260324172359-c67d1d81
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/1182
builds-builder: bump to 0.0.143-20260324172359-c67d1d81
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/builds-api/-/merge_requests/155
build: add use_deprecated_versions
group_203_bot_f4d95069bb2675e4ce1fff090c1c1620 opened https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/1183
builds-api: bump to 0.0.210-20260326093139-b2f70662
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/1183
builds-api: bump to 0.0.210-20260326093139-b2f70662
dcaro opened https://gitlab.wikimedia.org/repos/cloud/toolforge/builds-cli/-/merge_requests/130
d/changelog: bump to 0.0.25
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/builds-cli/-/merge_requests/130
d/changelog: bump to 0.0.25
group_203_bot_f4d95069bb2675e4ce1fff090c1c1620 opened https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/1188
components-api: bump to 0.0.187-20260401094330-1b5c8837
dcaro merged https://gitlab.wikimedia.org/repos/cloud/toolforge/toolforge-deploy/-/merge_requests/1188
components-api: bump to 0.0.188-20260401101948-485f4e66
Default buildpack version now is the newer one, latest has a slightly newer one (0.21.7)
The flag is available, and will start failing on the 27-04-2026, so all tools should have migrated by then.
