Diese Seite enthält Best Practices zur Beschleunigung von Cloud Build-Builds.
Kleinere Container erstellen
Beim Containerisieren einer Anwendung werden manchmal Dateien, die zur Laufzeit nicht benötigt werden, z. B. Abhängigkeiten bei der Build-Erstellung oder Zwischendateien, unbeabsichtigt in das Container-Image aufgenommen. Diese nicht benötigten Dateien erhöhen potenziell die Größe des Container-Images und verursachen dann zusätzlichen Zeitaufwand sowie zusätzliche Kosten, wenn das Image zwischen der Container-Image-Registry und der Containerlaufzeit verschoben wird.
Zur Reduzierung der Größe des Container-Images trennen Sie die Erstellung der Anwendung mit den dafür verwendeten Tools von der Zusammenstellung des Laufzeitcontainers.
Weitere Informationen finden Sie unter Kleinere Container erstellen .
Kaniko-Cache verwenden
Der Kaniko-Cache ist eine Cloud Build-Funktion, mit der Container-Build-Artefakte zwischengespeichert werden. Dazu werden Zwischen-Layer in einer Container-Image-Registry, z. B. der Container Registry von Google, gespeichert und indexiert, in der sie für nachfolgende Builds verfügbar sind. Weitere Informationen finden Sie unter Kaniko-Cache verwenden.
Im Cache gespeichertes Docker-Image
Der einfachste Weg, um Ihren Docker-Image-Build schneller zu erstellen, ist die Angabe eines im Cache gespeicherten Image, das für danach erstellte Builds verwendet werden kann. Sie können das im Cache gespeicherte Image durch Hinzufügen des Arguments --cache-from
in Ihrer Build-Konfigurationsdatei angeben. Damit wird Docker angewiesen, dieses Image als Cache-Quelle zum Erstellen des Builds zu verwenden.
Jedes Docker-Image besteht aus gestapelten Layern. Bei Verwendung von --cache-from
werden alle Layer vom geänderten Layer bis zum Ende des Builds neu erstellt. Die Verwendung von --cache-from
ist deshalb nicht sinnvoll, wenn Sie einen Layer in frühen Phasen Ihrer Docker-Build-Erstellung ändern.
Es wird empfohlen, für Ihre Builds immer --cache-from
zu verwenden. Dabei ist Folgendes zu beachten:
- Sie benötigen ein zuvor erstelltes Docker-Image für den Cache.
- Sie können
--cache-from
nur für Docker-Builds verwenden. Damit lassen sich keine Builds nutzen, die andere Artefakte erstellen. - Das im Cache gespeicherte Image muss aus einer Registry abgerufen werden. Das kann zusätzlich Zeit für die Erstellung des Builds in Anspruch nehmen.
In den folgenden Schritten wird erläutert, wie Sie mit einem zuvor im Cache gespeicherten Image ein Build erstellen:
YAML
Fügen Sie Ihrer Build-Konfiguration Anweisungen für folgende Vorgänge hinzu:
- Rufen Sie das im Cache gespeicherte Image aus Container Registry ab. Beachten Sie dabei, dass der unten aufgeführte Build-Schritt
docker pull
denentrypoint
aufbash
festlegt. Dadurch kann der Befehl ausgeführt und der zurückgegebene Fehler ignoriert werden. Das ist erforderlich, wenn zum ersten Mal ein Image erstellt wird unddocker pull
kein vorhandenes Image abrufen kann. Fügen Sie das Argument
--cache-from
hinzu, um dieses Image für die Neuerstellung von Builds zu verwenden.steps: - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['-c', 'docker pull gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest || exit 0'] - name: 'gcr.io/cloud-builders/docker' args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest', '--cache-from', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest', '.' ] images: ['gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest']
Dabei ist [IMAGE_NAME] der Name Ihres Images.
- Rufen Sie das im Cache gespeicherte Image aus Container Registry ab. Beachten Sie dabei, dass der unten aufgeführte Build-Schritt
Erstellen Sie Ihr Image mit der oben dargestellten Build-Konfiguration:
gcloud builds submit --config cloudbuild.yaml .
JSON
Fügen Sie Ihrer Build-Konfiguration Anweisungen für folgende Vorgänge hinzu:
- Rufen Sie das im Cache gespeicherte Image aus Container Registry ab. Der unten aufgeführte Build-Schritt
docker pull
legt denentrypoint
aufbash
fest. Dadurch kann der Befehl ausgeführt und sämtliche zurückgegebenen Fehler können ignoriert werden. Das ist erforderlich, wenn zum ersten Mal ein Image erstellt wird unddocker pull
kein vorhandenes Image abrufen kann. Fügen Sie das Argument
--cache-from
hinzu, um dieses Image für die Neuerstellung von Builds zu verwenden.{ "steps": [ { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": ["-c", "docker pull gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest || exit 0"] }, { "name": "gcr.io/cloud-builders/docker", "args": [ "build", "-t", "gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest", "--cache-from", "gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest", "." ] } ], "images": ["gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest"] }
Dabei ist [IMAGE_NAME] der Name Ihres Images.
- Rufen Sie das im Cache gespeicherte Image aus Container Registry ab. Der unten aufgeführte Build-Schritt
Erstellen Sie Ihr Image mit der oben dargestellten Build-Konfiguration:
gcloud builds submit --config cloudbuild.json .
Verzeichnisse mit Google Cloud Storage im Cache zwischenspeichern
Verwenden Sie die Ergebnisse eines vorherigen Builds noch einmal, um die Erstellung eines Builds zu beschleunigen. Sie können die Ergebnisse eines früheren Builds in einen Google Cloud Storage-Bucket kopieren, diese Ergebnisse für eine schnellere Berechnung verwenden und dann die neuen Ergebnisse in den Bucket kopieren. Verwenden Sie diese Methode, wenn die Erstellung Ihres Builds sehr lange dauert und nur eine kleine Anzahl von Dateien generiert wird, deren Kopieren in und aus Google Cloud Storage nicht lange dauert.
Im Gegensatz zum Argument --cache-from
, das nur für Docker-Builds dient, eignet sich das Google Cloud Storage-Caching für jeden von Cloud Build unterstützten Build.
Mit den im Folgenden dargestellten Schritten können Sie Verzeichnisse mit Google Cloud Storage im Cache zwischenspeichern:
YAML
Fügen Sie Ihrer Build-Konfigurationsdatei Anweisungen für folgende Vorgänge hinzu:
- Kopieren Sie die Ergebnisse eines vorherigen Builds aus dem Google Cloud Storage-Bucket.
- Verwenden Sie die Ergebnisse für die Erstellung des aktuellen Builds.
Kopieren Sie die neuen Ergebnisse zurück in den Bucket.
steps: - name: gcr.io/cloud-builders/gsutil args: ['cp', 'gs://mybucket/results.zip', 'previous_results.zip'] # operations that use previous_results.zip and produce new_results.zip - name: gcr.io/cloud-builders/gsutil args: ['cp', 'new_results.zip', 'gs://mybucket/results.zip']
Erstellen Sie Ihren Code mit der oben dargestellten Build-Konfiguration:
gcloud builds submit --config cloudbuild.yaml .
JSON
Fügen Sie Ihrer Build-Konfigurationsdatei Anweisungen für folgende Vorgänge hinzu:
- Kopieren Sie die Ergebnisse eines vorherigen Builds aus dem Google Cloud Storage-Bucket.
- Verwenden Sie die Ergebnisse für die Erstellung des aktuellen Builds.
Kopieren Sie die neuen Ergebnisse zurück in den Bucket.
{ "steps": [ { "name": "gcr.io/cloud-builders/gsutil", "args": ["cp", "gs://mybucket/results.zip", "previous_results.zip"] }, { // operations that use previous_results.zip and produce new_results.zip }, { "name": "gcr.io/cloud-builders/gsutil", "args": ["cp", "new_results.zip", "gs://mybucket/results.zip"] } ] }
Erstellen Sie Ihren Code mit der oben dargestellten Build-Konfiguration:
gcloud builds submit --config cloudbuild.json .
Hochladen nicht benötigter Dateien vermeiden
Beim Auslösen eines Builds wird Ihr Codeverzeichnis von Cloud Build zur Verwendung hochgeladen.
Sie können Dateien, die von Ihrem Build nicht benötigt werden, mit einem
.gcloudignore
um die Upload-Zeit zu optimieren.
Folgende Dateien werden häufig ausgeschlossen:
- Dokumentation und Beispielcode für Projektentwickler
- Bei der Entwicklung verwendetes Material: generierter Scaffolding-Code, Binärdateien,
*.jar
-Dateien oder kompilierte Webinhalte - Übernommene Abhängigkeiten von Drittanbietern für die lokale Entwicklung
Wenn Sie diese Fälle mit der Datei .gcloudignore
ausschließen möchten, erstellen Sie im Stammverzeichnis des Projekts eine Datei mit folgenden Inhalten:
.git
dist
node_modules
vendor
*.jar
Der Ausschluss von kompiliertem Code und Abhängigkeiten von Drittanbietern führt auch zu einem beständigeren Build-Prozess. Außerdem besteht ein geringeres Risiko dafür, versehentlich Code bereitzustellen, der sich noch in der Entwicklung befindet.