In dieser Anleitung erfahren Sie, wie Sie mit Secret Manager und Cloud Build auf private GitHub in einem Build zugreifen. Secret Manager ist ein Google Cloud -Dienst, der API-Schlüssel, Passwörter und andere sensible Daten sicher speichert.
SSH-Schlüssel erstellen
Öffnen Sie ein Terminalfenster.
Erstellen Sie ein neues Verzeichnis mit dem Namen
workingdir
und rufen Sie dieses Verzeichnis auf:mkdir workingdir cd workingdir
Erstellen Sie einen neuen GitHub-SSH-Schlüssel, wobei github-email Ihre GitHub-E-Mail-Adresse ist:
ssh-keygen -t rsa -b 4096 -N '' -f id_github -C github-email
Dieser Befehl erstellt einen neuen SSH-Schlüssel
workingdir/id_github
ohne Passphrase für Ihren SSH-Schlüssel. Cloud Build unterstützt keine mit Passphrases geschützte SSH-Schlüssel.
Privaten SSH-Schlüssel in Secret Manager speichern
Wenn Sie einen SSH-Schlüssel erstellen, wird in Ihrer Umgebung die id_github
-Datei erzeugt. Da sich jeder mit dieser Datei bei Ihrem Konto authentifizieren kann, müssen Sie die Datei in Secret Manager speichern, bevor Sie sie in einem Build verwenden können.
So speichern Sie den SSH-Schlüssel in Secret Manager:
Rufen Sie in der Google Cloud Console die Seite „Secret Manager“ auf:
Klicken Sie auf der Seite Secret Manager auf Secret erstellen.
Geben Sie auf der Seite Secret erstellen unter Name einen Namen für das Secret ein.
Klicken Sie im Feld Secret-Wert auf Hochladen und laden Sie die Datei
workingdir/id_github
hoch.Lassen Sie den Abschnitt Regionen unverändert.
Klicken Sie auf Secret erstellen.
Dadurch wird Ihre id_github
-Datei in Secret Manager hochgeladen.
Öffentlichen SSH-Schlüssel zu Bereitstellungsschlüsseln eines privaten Repository hinzufügen
Melden Sie sich bei GitHub an.
Klicken Sie rechts oben auf Ihr Profilbild und dann auf Mein Profil.
Klicken Sie auf Ihrer Profilseite auf Repositories und dann auf den Namen Ihres Repository.
Klicken Sie im Repository auf Einstellungen.
Klicken Sie in der Seitenleiste auf Schlüssel bereitstellen und dann auf Bereitstellungsschlüssel hinzufügen.
Geben Sie einen Titel an und fügen Sie Ihren öffentlichen SSH-Schlüssel aus
workingdir/id_github.pub
ein.Wählen Sie Schreibzugriff zulassen aus, wenn dieser Schlüssel Schreibzugriff auf das Repository haben soll. Mit einem Bereitstellungsschlüssel mit Schreibzugriff kann eine Bereitstellung an das Repository übertragen werden.
Klicken Sie auf Schlüssel hinzufügen.
Löschen Sie den SSH-Schlüssel von Ihrem Laufwerk:
rm id_github*
Berechtigungen erteilen
Sie müssen dem Dienstkonto, das Sie für den Build verwenden, die Berechtigung für den Zugriff auf Secret Manager erteilen.
-
Rufen Sie in der Google Cloud -Console die Seite settings Cloud Build Berechtigungen auf:
Wählen Sie in der Drop-down-Liste das Dienstkonto aus, dessen Rollen Sie ändern möchten.
Setzen Sie den Status der Rolle
Secret Manager Secret Accessor
auf Aktivieren.
Öffentlichen SSH-Schlüssel zu bekannten Hosts hinzufügen
Die meisten Rechner haben eine Datei namens known_hosts
, die bekannte Schlüssel für Remote-Hosts enthält. Die Schlüssel werden häufig von den Remote-Hosts erfasst, wenn zum ersten Mal eine Verbindung zu ihnen hergestellt wird, sie können aber auch manuell hinzugefügt werden. Die Schlüssel in dieser Datei werden verwendet, um die Identität des Remote-Hosts zu verifizieren und vor Identitätsdiebstahl zu schützen.
Damit Cloud Build eine Verbindung zu GitHub herstellen kann, müssen Sie der Datei known_hosts
in der Build-Umgebung von Cloud Build den öffentlichen SSH-Schlüssel hinzufügen. Dazu fügen Sie den Schlüssel einer temporären known_hosts.github
-Datei hinzu und kopieren dann den Inhalt von known_hosts.github
in die known_hosts
-Datei in der Build-Umgebung von Cloud Build.
Erstellen Sie im Verzeichnis workingdir
eine Datei mit dem Namen known_hosts.github
und fügen Sie der Datei den öffentlichen SSH-Schlüssel hinzu:
ssh-keyscan -t rsa github.com > known_hosts.github
Im nächsten Abschnitt fügen Sie der Cloud Build-Konfigurationsdatei Anweisungen hinzu, um den Inhalt von known_hosts.github
in die Datei known_hosts
in der Build-Umgebung von Cloud Build zu kopieren.
Build konfigurieren
So konfigurieren Sie den Build:
Erstellen Sie eine Build-Konfigurationsdatei mit dem Namen
cloudbuild.yaml
in zwei Schritten: Der erstegcloud
-Schritt greift in Secret Manager auf den SSH-Schlüssel zu und speichert ihn alsid_rsa
in einem Volume namensssh
zusammen mit einer Kopie vonknown_hosts.github
. Das Volume dient als nichtflüchtiger Speicher für in den Build-Schritten verwendete Dateien. Im drittengit
-Schritt wird der Schlüssel inid_rsa
verwendet, um eine Verbindung zum Repository untergit@github.com:git-username/git-repository
herzustellen.# Access the id_github file from Secret Manager, and setup SSH steps: - name: 'gcr.io/cloud-builders/git' secretEnv: ['SSH_KEY'] entrypoint: 'bash' args: - -c - | echo "$$SSH_KEY" >> /root/.ssh/id_rsa chmod 400 /root/.ssh/id_rsa cp known_hosts.github /root/.ssh/known_hosts volumes: - name: 'ssh' path: /root/.ssh # Clone the repository - name: 'gcr.io/cloud-builders/git' args: - clone - --recurse-submodules - git@github.com:GIT_USERNAME/GIT_REPOSITORY volumes: - name: 'ssh' path: /root/.ssh availableSecrets: secretManager: - versionName: projects/PROJECT_ID/secrets/SECRET_NAME/versions/latest env: 'SSH_KEY'
Ersetzen Sie die Platzhalterwerte in den obigen Befehlen durch Folgendes:
GIT_USERNAME
: Der GitHub-Nutzername des Repository-Inhabers.GIT_REPOSITORY
: Der Name des GitHub-Repositorys, auf das Sie zugreifen möchten.PROJECT_ID
: Die ID des Google Cloud -Projekts, in dem Sie Ihre Secrets gespeichert haben.SECRET_NAME
: Der Name des Secrets, das Sie im Secret Manager erstellt haben.
Informationen zu mehrzeiligen YAML-Strings, die im obigen Snippet verwendet werden, finden Sie unter YAML-Multilinie.
Build einreichen
Führen Sie den folgenden Befehl aus, um den Build zu senden:
gcloud builds submit --config=cloudbuild.yaml .
Die Ausgabe sieht etwa so aus:
Creating temporary tarball archive of 3 file(s) totalling 4.1 KiB before compression.
Uploading tarball of [.] to [gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/[PROJECT-ID]/builds/871b68bc---].
Logs are available at [https://console.cloud.google.com/cloud-build/builds/871b68bc---?project=[PROJECT-ID]].
----------------------------- REMOTE BUILD OUTPUT ------------------------------
starting build "871b68bc-cefc-4411-856c-2a2b7c7d2487"
FETCHSOURCE
Fetching storage object: gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178
Copying gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178...
/ [1 files][ 3.9 KiB/ 3.9 KiB]
Operation completed over 1 objects/3.9 KiB.
BUILD
Step #0: Already have image (with digest): gcr.io/cloud-builders/gcloud
Starting Step #0
Finished Step #0
Step #1: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #1
Step #1: # github.com SSH-2.0-libssh_0.7.0
Finished Step #1
Step #2: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #2
Step #2: Cloning into '[REPOSITORY-NAME]'...
Step #2: Warning: Permanently added the RSA host key for IP address 'XXX.XXX.XXX.XXX' to the list of known hosts.
Finished Step #2
PUSH
DONE
-----------------------------------------------------------------------------------------------------------------
ID CREATE_TIME DURATION SOURCE IMAGES STATUS
871b68bc-cefc-4411-856c-2a2b7c7d2487 XXXX-XX-XXT17:57:21+00:00 13S gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz - SUCCESS