Container:build fails with UNAUTHORIZED against registry.opencode.de CI_REGISTRY_PASSWORD / CI_JOB_TOKEN both rejected

Problem

Der container:build Job (Kaniko v1.23.2-debug) schlägt seit 2026-08-28 fehl mit:

error checking push permissions: GET https://gitlab.opencode.de/jwt/auth?scope=repository%3Aegovlab%2Frefa-test%3Apush%2Cpull&service=container_registry
→ UNAUTHORIZED: HTTP Basic: Access denied

Was wir probiert haben

  1. CI_REGISTRY_USER / CI_REGISTRY_PASSWORD (GitLab predefined) — funktionierte bis 2026-08-27 (Pipeline 743397, Job 3373816), seitdem UNAUTHORIZED
  2. CI_JOB_TOKEN mit gitlab-ci-token ebenfalls UNAUTHORIZED
  3. Docker CLI (docker:latest + docker:dind) docker login erfolgreich, aber docker:dind Service nicht verfügbar auf Kubernetes Runner (kein /var/run/docker.sock)

Frage

Hat sich an der Container Registry Auth auf OpenCode etwas geändert? Benötigt der Kubernetes Runner spezielle Einstellungen für Kaniko? Gibt es eine Alternative zu Kaniko auf Kubernetes Runnern?

Workaround

container:build ist aktuell deaktiviert (allow_failure: true). Der Rest der Pipeline läuft normal durch.

Links

Vielen Dank für die Hilfe!
Matthias

Wir haben Antwort vom Support erjhalten (Tobias Gurtzick)

Es handelt sich um eine Verhaltensänderung des GitLabs und ist uns bereits bekannt.

Mit GitLab 19 wurde das Format der CI/CD Job Tokens standardmäßig vom bisherigen Legacy-Format auf JWT umgestellt. Diese JWT-Tokens sind deutlich länger. Das betrifft auch CI_REGISTRY_PASSWORD, da dieser Wert innerhalb eines CI-Jobs dem jeweiligen CI_JOB_TOKEN entspricht.

Das erklärt auch sehr gut den zeitlichen Zusammenhang: Ihre Pipeline funktionierte zuvor mit CI_REGISTRY_USER / CI_REGISTRY_PASSWORD und schlägt nun bei der Authentifizierung über /jwt/auth fehl.

Kurzfristiger Workaround

GitLab erlaubt aktuell noch, für eine Top-Level-Gruppe wieder auf das bisherige Legacy-Format der CI/CD Job Tokens zurückzustellen.

Unter:

Settings → CI/CD → General pipelines

kann dafür

Enable JWT format for CI/CD job tokens

vorübergehend deaktiviert werden.

Damit sollte die bestehende Kaniko-Pipeline zunächst wieder funktionieren.

Das Legacy-Format ist allerdings nur eine Übergangslösung und wird mit GitLab 20 entfernt.

DauerhafteLösung

Die Pipeline sollte daher auf die neuen JWT-basierten Job Tokens angepasst werden.

Bei Kaniko muss insbesondere darauf geachtet werden, dass die Registry-Credentials korrekt in /kaniko/.docker/config.json geschrieben werden. Durch die deutlich längeren JWT-Tokens darf das Base64-Encoding keinen Zeilenumbruch erzeugen, beispielsweise:

- |
  cat > /kaniko/.docker/config.json <<EOF
  {
    "auths": {
      "${CI_REGISTRY}": {
        "username": "${CI_REGISTRY_USER}",
        "password": "${CI_REGISTRY_PASSWORD}"
      }
    }
  }
  EOF