Cloud Build schlägt mit dem Fehler SUBSTITUTIONVARIABLENOT_DEFINED für CI-Vorlagen und das Ersetzungsvalidierungsskript fehl, das die behobene Pipeline ausführt

Veröffentlicht: 2025-11-29

Cloud Build ist zu einem zentralen Werkzeug in den kontinuierlichen Integrations- und Bereitstellungsworkflows vieler Entwickler und Organisationen geworden. Seine enge Integration mit anderen Google Cloud Platform (GCP)-Produkten und skriptfähigen Workflows machen es zu einem Favoriten für Teams, die anpassbare und skalierbare CI/CD-Pipelines wünschen. Doch wie viele leistungsstarke Tools ist auch Cloud Build nicht ohne Macken – insbesondere wenn es um Variablen und Parametrisierung geht. Ein frustrierendes Problem, mit dem viele Entwickler in letzter Zeit konfrontiert waren, ist der FehlerSUBSTITUTION_VARIABLE_NOT_DEFINED. Dieses schwer fassbare Problem kann eine gesamte Pipeline zum Stillstand bringen, was sich auf die Entwicklungsgeschwindigkeit auswirkt und die Fehlerbehebungszeit verlängert.

TL;DR

Wenn Ihre Cloud Build-Pipeline mit dem FehlerSUBSTITUTION_VARIABLE_NOT_DEFINEDfehlschlägt, bedeutet dies wahrscheinlich, dass eine erforderliche Ersatzvariable in Ihrem Build-Trigger oder Ihrer Konfigurationsdatei fehlt. Dies ist häufig der Fall, wenn CI-Vorlagen verwendet werden, die über mehrere Repositorys hinweg gemeinsam genutzt werden. Ein benutzerdefiniertes Variablenvalidierungsskript hat dieses Problem behoben, indem alle erforderlichen Variablen zur Laufzeit überprüft wurden, was ein klareres Feedback lieferte und fehlerhafte Builds verhinderte. Die Problemumgehung verbesserte außerdem die allgemeine Robustheit der Pipeline und minimierte den manuellen Debugging-Aufwand.

Den Fehler SUBSTITUTION_VARIABLE_NOT_DEFINED verstehen

Der FehlerSUBSTITUTION_VARIABLE_NOT_DEFINEDwird von Cloud Build ausgegeben, wenn ein Build-Prozess auf eine Substitutionsvariable verweist, die im Kontext dieses Builds nicht definiert wurde. Mit diesen Substitutionsvariablen können Sie Build-Schritte und Vorlagen anpassen, ohne Werte direkt in der Pipeline-YAML fest zu codieren, was die Wiederverwendbarkeit und Klarheit verbessert.

Beispielsweise könnte eine allgemeine Cloud Build-Vorlage Build-Schritte wie die folgenden enthalten:

Schritte:
- Name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', '${_IMAGE_NAME}', '.']

Hier ist ${_IMAGE_NAME} eine benutzerdefinierte Substitutionsvariable. Wenn diese Variable zum Zeitpunkt des Auslösens des Builds nicht bereitgestellt wird, möglicherweise über eine Triggerkonfiguration oder Befehlszeile, schlägt Cloud Build sofort mit dem FehlerSUBSTITUTION_VARIABLE_NOT_DEFINEDfehl.

Hauptursachen in CI-Vorlagenimplementierungen

Dieses Problem wird besonders problematisch, wenn Teams gemeinsame Vorlagen verwenden oder wenn verschiedene Repositorys über zentralisierte YAML-Konfigurationen dieselbe CI-Logik nutzen. Oftmals müssen für jedes Repository oder jeden Build-Trigger unterschiedliche Variablen definiert werden, die Durchsetzung der Konsistenz wird jedoch zu einer Herausforderung. Viele Teams gehen davon aus, dass eine Substitutionsvariable optional ist oder über einen Standard-Fallback verfügt. Dieser Fehler tritt dann jedoch auf, wenn die Variable in einem Build-Kontext fehlt, der sie erwartet.

Situationen, in denen dieser Fehler wahrscheinlich auftritt:

  • Wenn ein Standardwert in den Triggereinstellungen vergessen wird
  • Wenn eine neue Vorlage hinzugefügt wird, aber nicht alle erforderlichen Variablen dokumentiert oder erzwungen werden
  • Wenn Entwickler Vorlagen umgebungsübergreifend klonen (z. B. Staging, Produktion), aber bestimmte Variablendefinitionen weglassen

Eine pragmatische Lösung: Das Substitutionsvalidierungsskript

Um dieses Problem zu lösen und zukünftige Störungen zu verhindern, haben mehrere Teams einen Vorvalidierungsmechanismus eingeführt – ein eingebettetesValidierungsskript, das am Anfang der Pipeline ausgeführt wird, um nach erforderlichen Substitutionsvariablen zu suchen, bevor kritische Schritte ausgeführt werden.

Das Skript scannt die aktuelle Umgebung und versucht, das Vorhandensein (und manchmal auch den Typ oder das Muster) aller kritischen Variablen festzustellen. Wenn welche fehlen, stoppt es die Ausführung vorzeitig und stellt eine für Menschen lesbare Liste der fehlenden Variablen bereit.

Hier ist ein vereinfachtes Beispiel eines solchen in Bash geschriebenen Skripts:

#!/bin/bash
set -e

REQUIRED_VARS=(
  „_IMAGE_NAME“
  „_SERVICE_NAME“
)

für VAR in „${REQUIRED_VARS[@]}“
Tun
  if [[ -z "${!VAR}" ]]; Dann
    echo „FEHLER: Erforderliche Substitutionsvariable ${VAR} ist nicht definiert.“
    Ausgang 1
  fi
Erledigt

echo „Alle erforderlichen Substitutionsvariablen sind vorhanden.“

Durch die Platzierung dieses Schritts an der Spitze der Build-Pipeline können Teams Fehler frühzeitig erkennen, verschwendete Rechenzyklen reduzieren und anderen Entwicklern hilfreicheres Feedback geben.

Integration in Cloud Build-Workflows

In praktischen Arbeitsabläufen kann das Validierungs-Shell-Skript entweder als Inline-Befehl eingebunden oder aus einer gemeinsam genutzten Skriptdatei an einem sicheren Ort, beispielsweise einem versionierten GCS-Bucket, importiert werden. Dies ist normalerweise der erste Schritt in der Datei cloudbuild.yaml:

Schritte:
- Name: 'gcr.io/cloud-builders/bash'
  Einstiegspunkt: 'bash'
  args: ['-c', './validate_vars.sh']

Dies gibt Teams die Möglichkeit:

  • Versionieren Sie ihre CI-Validierungslogik
  • Behalten Sie eine einzige Quelle der Wahrheit für erwartete Variablen bei
  • Reduzieren Sie laute Debugging-Zyklen mit Trial-and-Error-Triggerbearbeitung

Verbesserte Entwicklererfahrung

Die Einführung dieses Validierungsskripts hatte unmittelbare Auswirkungen:

  • Weniger Pipeline-Ausfälleaufgrund unbemerkter fehlender Variablen.
  • Klarere Fehlermeldungen, die direkt auf das Problem hinweisen, statt obskurer Protokolle.
  • Schnelleres Onboardingneuer Entwickler, die bestehende CI-Workflows wiederverwenden, ohne dass umfassende Stammkenntnisse der erwarteten Variablen erforderlich sind.

Im Laufe der Zeit haben einige Teams den Validator erweitert, umoptionaleVariablen und Set-Fallbacks zu ermöglichen, was den gemeinsam genutzten Vorlagen noch mehr Flexibilität verleiht. Andere kombinierten es mit der YAML-Schemavalidierung, um ihre gesamte cloudbuild.yaml-Pipeline zur Laufzeit zu lintieren.

Den Fehler in neuen Projekten verhindern

Um dieses Problem bei zukünftigen Projekten zu vermeiden, wird empfohlen, die folgenden Best Practices zu befolgen:

  • Dokumentieren Sie alle erforderlichen Substitutionsvariablenin der README-Datei oder im CI-Handbuch für das Repo.
  • Verwenden Sie ein Validierungsskriptin jeder neuen Vorlage, die Ihren CI/CD-Workflows hinzugefügt wird.
  • Definieren Sie klare Namenskonventionen(z. B. Variablen, die mit _ beginnen, implizieren erforderliche benutzerdefinierte Ersetzungen).
  • Legen Sie gegebenenfalls Standardwertein Builds fest oder stellen Sie optionale Variablenlogik durch Skripterstellung bereit.

Letzte Gedanken

Obwohl der FehlerSUBSTITUTION_VARIABLE_NOT_DEFINEDauf den ersten Blick harmlos erscheinen kann, stellt er ein umfassenderes Problem im CI/CD-Hygiene- und Konfigurationsmanagement dar. Wenn Sie die Variablenvalidierung als erstklassige Komponente Ihrer Pipeline betrachten, sorgen Sie für stärkere Automatisierungspraktiken, weniger fehlerhafte Builds und zufriedenere Entwickler. Durch die Einführung eines einfachen Validierungsskripts konnten viele Teams ihre Pipeline-Workflows optimieren und Ausfallzeiten und Debugging-Aufwand deutlich reduzieren.

FAQ: Cloud Build-Ersetzungsvariablen und -Validierung

  • F: Was ist eine Substitutionsvariable in Cloud Build?
    Eine Ersatzvariable ist ein Platzhalter in Ihrer cloudbuild.yaml-Datei, der durch tatsächliche Werte ersetzt wird, wenn der Build ausgelöst wird. Diese Variablen werden verwendet, um Builds für verschiedene Umgebungen oder Konfigurationen anzupassen.
  • F: Warum werden SUBSTITUTION_VARIABLE_NOT_DEFINED-Fehler angezeigt?
    Dieser Fehler tritt normalerweise auf, wenn eine Variable, auf die in der YAML-Datei verwiesen wird, nicht durch den Build-Trigger oder die Build-Umgebung geleitet wird, wodurch sie zur Laufzeit undefiniert wird.
  • F: Wie kann ich beim Auslösen eines Builds Ersatzvariablen bereitstellen?
    Sie können Substitutionsvariablen beim Einrichten des Triggers über die Google Cloud Console oder über die gcloud-CLI mit dem Flag --substitutions übergeben.
  • F: Kann ich Standardwerte für Substitutionsvariablen festlegen?
    Cloud Build unterstützt keine Standardwerte direkt in der YAML, aber Sie können Skriptlogik zur Verarbeitung undefinierter Variablen verwenden und Fallbacks programmgesteuert in Bash- oder Python-Skripten zuweisen.
  • F: Wie lässt sich die variable Präsenz über mehrere Projekte hinweg am besten erzwingen?
    Verwenden Sie ein gemeinsames Validierungsskript am Anfang aller cloudbuild.yaml-Vorlagen, um Konsistenz zu erzwingen und Eingaben zu validieren, bevor Sie mit dem Build-Job fortfahren.