Mijn Compose bestanden hebben allemaal hard-coded versies, want dat is hoe Renovate werktMars Warrior schreef op maandag 1 december 2025 @ 09:38:
[...]
Ik vroeg me nog wel even af @alex3305 hoe jij omgaat met bijv. Immich: die heeft een eigen stack waar versies hard gecodeerd zijn. Hoe ga je daarmee om qua updates van versies?
dockerComposeJinja.json (renovate repo)
JSON:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "customManagers": [ { "customType": "regex", "description": "Docker Compose Jinja", "fileMatch": "(^|/)(?:docker-)?compose[^/]*\\.ya?ml?\\.j2$", "matchStrings": [ "(?:image: \\\"?)(?<depName>.*?)(?::(?<currentValue>.*?))?(?:@(?<currentDigest>sha256:[a-f0-9]+))?\\\"?\\n" ], "datasourceTemplate": "docker", "versioningTemplate": "docker" } ] } |
Dit aanvullend configuratiebestand staat in mijn Renovate repository, waar ook de standaard configuratie staat. Deze configuratiebestanden gebruik ik dan als configuration presets:
renovate.json (infra repo)
JSON:
1
2
3
4
5
6
7
| { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "local>renovate-bot/renovate", "local>renovate-bot/renovate:dockerComposeJinja" ] } |
Met deze configuratie matcht Renovate zoals verwacht mijn Jinja Compose bestanden. Voorbeeld van Immich:
roles/immich/templates/compose.yaml.j2 (infra repo, minimaal voorbeeld)
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| #jinja2: lstrip_blocks: True, trim_blocks: True --- {{ ansible_managed | comment }} services: server: container_name: {{ _compose_stack_name }}-server image: ghcr.io/immich-app/immich-server:v2.3.1 depends_on: - machine-learning - redis - database networks: internal: ingress: machine-learning: container_name: {{ _compose_stack_name }}-machine-learning image: ghcr.io/immich-app/immich-machine-learning:v2.3.1-openvino networks: internal: redis: container_name: {{ _compose_stack_name }}-redis image: docker.io/valkey/valkey:8-bookworm@sha256:fea8b3e67b15729d4bb70589eb03367bab9ad1ee89c876f54327fc7c6e618571 networks: internal: database: container_name: {{ _compose_stack_name }}-database image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23 restart: on-failure:5 networks: internal: networks: internal: ingress: name: {{ swarm_overlay_network }} external: true |
Tot slot heb ik wederom in de Renovate configuratie van deze repo extra package rules aangemaakt zodat alle Immich updates gecombineerd worden, dat minors van Immich niet zonder goedkeuring gemerged worden en op beperkte tijden plaatsvinden. Dit vind ik zelf prettig en doe ik voor meerdere applicaties.
Het samen pakken zorgt er voor dat er niet meerdere PR's voor 1 Compose file aangemaakt worden. In principe is met meerdere PR's natuurlijk niets mis, maar ik vind het onzin omdat het toch 1 stack is. Eigenlijk wat je zelf ook al zegt
renovate.json (infra repo)
JSON:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "packageRules": [ { "description": "Update Docker dependencies", "matchFileNames": [ "**/compose.yml", "**/compose.yaml", "**/compose.yml.j2", "**/compose.yaml.j2" ], "automergeSchedule": ["* 9-17 * * 1-5"] }, { "description": "Never automerge minor versions for specific packages", "matchPackageNames": [ "*/immich-app/immich-*", "immich-app/immich-*" ], "matchUpdateTypes": ["major", "minor"], "minimumReleaseAge": "1 day", "automerge": false }, { "description": "Add Docker label", "matchFileNames": [ "**/compose.yml", "**/compose.yaml", "**/compose.yml.j2", "**/compose.yaml.j2" ], "addLabels": ["docker"] }, { "description": "Immich", "groupName": "Immich", "matchFileNames": [".forgejo/workflows/*_immich.*", "roles/immich/**"], "addLabels": ["stack/Immich"] } ] } |
Helaas komt het soms wel voor dat ik handmatig het e.e.a. moet corrigeren of mergen. De Immich-PR's van Renovate willen regelmatig ook een update van PostgreSQL meenemen. Daar ben ik niet zo happig op. Een handmatige merge met daarna een correctie commit vind ik niet bijzonder erg of vervelend. Zoiets komt max eens in de maand voor. Renovate onthoudt namelijk ook welke versies ik actief geweigerd heb en biedt daar dan geen updates meer voor aan:
Renovate Dependency Dashboard
/f/image/uXkmMkSc0tQVyRCiUS841sSl.png?f=fotoalbum_large)
Tot slot zou je nog iets met digests en digest pinning kunnen doen. Ik gebruik dat op een paar plekken. O.a. in Immich en Plex. Die laatste omdat de LinuxServer.io container het versienummer niet (correct) verhoogd. Aan de ene kant vind ik de digests wel fijn vanwege idempotentie, terwijl ik het aan de andere kant er niet duidelijker op vind worden. Alhoewel Docker het toestaat, vind ik eigenlijk dat ontwikkelaars maar 1 keer 1 (Sem)Versie moeten uitbrengen. Rolling major of major.minor kan ik nog wel inkomen en doe ik zelf ook.
/f/image/3aWHLQDv9VuJXnUeIONLG8Gc.png?f=fotoalbum_large)
/f/image/CU7Tbets7Nro2nhbRhpwK1il.png?f=fotoalbum_large)
/f/image/Q5RckVMiXhFMnrhGOCwXxT56.png?f=fotoalbum_large)
/f/image/vimsjVMzicvJRIZdv8HZXTlJ.png?f=fotoalbum_large)
:strip_exif()/f/image/GzSa52jv7cyUl9Iq5aNoUxxg.png?f=user_large)
:strip_exif()/f/image/iyKMNVqjIl33TI5C235zefqd.png?f=user_large)
/f/image/L5zwvZyMnPV35Z9tNsUCS1bQ.png?f=fotoalbum_large)
/f/image/5kYxcRaFX4TgWiqkTtz9hCsC.png?f=fotoalbum_large)
/f/image/oqTznUI78A5U094Fy9gwpuXe.png?f=fotoalbum_large)
/f/image/S9NQNl3BtYmh7XkLY1jNRoVz.png?f=fotoalbum_large)
/f/image/c4cVDvFIx2SSdPFBPdMe7NQB.png?f=fotoalbum_large)
/f/image/QOVoBbb0yEICTca84LgTo7sA.png?f=fotoalbum_large)
/f/image/3jYFXgUus0ECnTp8Eok4AA7L.png?f=fotoalbum_large)
:strip_exif()/f/image/KSwoaHEAXKLWMfb7x6vT8Z1Z.png?f=user_large)
/f/image/eZz1YEkUjiTq82jUfyF1sdMv.png?f=fotoalbum_large)
:strip_exif()/f/image/GqFahEqoIJNJPjF9wRoGsmTN.png?f=user_large)
:strip_exif()/f/image/FejRWwBMYGw15L5s1JbChAa8.jpg?f=fotoalbum_large)
/f/image/qrk9v5CclTjzIbqCf0gnC14Q.png?f=fotoalbum_large)
/f/image/q1osnuGwzR9vThnYhq13fe5v.png?f=fotoalbum_large)
/f/image/50MxTwEJVOvVBpH3KkwA9iGe.png?f=fotoalbum_large)