Jenkins für verteilte Builds in Compute Engine verwenden


In dieser Anleitung wird Folgendes beschrieben:

  • Das Erstellen eines kontinuierlichen Jenkins-Integrationssystems, um Builds mit On-Demand-Agents von Jenkins in Compute Engine auszuführen
  • Das Speichern Ihrer Build-Artefakte in Cloud Storage
  • Das Anwenden einer Lebenszyklusrichtlinie, um ältere Build-Artefakte in Cloud Storage in kostengünstigere Speicheroptionen zu verschieben

Architektur

Das folgende Diagramm veranschaulicht den Aufbau der Anleitung.

Architektur, die zeigt, wie ein Dienstkonto Artefakte über Compute Engine in Cloud Speicher überträgt

Im Diagramm wird Jenkins ein Dienstkonto hinzugefügt, um Agent-Instanzen zu erstellen und Artefakte zur langfristigen Speicherung in Cloud Storage zu verschieben. Jenkins stellt die Instanzen während der Ausführung von Builds bereit. Wenn die Build-Artefakte älter werden, durchlaufen sie verschiedene Storage-Klassen, um die Aufbewahrungskosten zu reduzieren.

Ziele

  • Mit Packer ein Basis-Image erstellen, um Ihre Jenkins-Builds auszuführen.
  • Jenkins mithilfe von Cloud Marketplace bereitstellen.
  • Jenkins für die Bereitstellung flüchtiger Build-Agents konfigurieren.
  • Build-Artefakte in Cloud Storage hochladen.
  • Lebenszyklusrichtlinien zur Reduzierung der Cloud Storage-Kosten konfigurieren.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

  • Compute Engine
  • Cloud Storage

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Sie können mithilfe des Preisrechners eine Kostenschätzung für Ihre voraussichtliche Nutzung erstellen.

Vorbereitung

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  4. Compute Engine API aktivieren.

    Aktivieren Sie die API

  5. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  6. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  7. Compute Engine API aktivieren.

    Aktivieren Sie die API

Umgebung einrichten

In diesem Abschnitt konfigurieren Sie die für diese Anleitung erforderliche Infrastruktur und die benötigten Identitäten. Den Rest der Anleitung führen Sie in der Cloud Shell aus.

Zu Cloud Shell

IAM konfigurieren

Erstellen Sie ein IAM-Dienstkonto (Identitäts- und Zugriffsverwaltung), um Berechtigungen an Jenkins zu delegieren. Mit diesem Konto kann Jenkins Daten in Cloud Storage speichern und Instanzen in Compute Engine starten. Jenkins führt Ihre Builds in sitzungsspezifischen Instanzen aus und speichert Build-Artefakte in Cloud Storage.

Dienstkonto erstellen

  1. Erstellen Sie das Dienstkonto:

    gcloud iam service-accounts create jenkins --display-name jenkins
  2. Speichern Sie die E-Mail-Adresse des Dienstkontos und die aktuelle Google Cloud-Projekt-ID in Umgebungsvariablen, um sie in späteren Befehlen verwenden zu können:

    export SA_EMAIL=$(gcloud iam service-accounts list \
        --filter="displayName:jenkins" --format='value(email)')
    export PROJECT=$(gcloud info --format='value(config.project)')
  3. Binden Sie die folgenden Rollen an das Dienstkonto:

    gcloud projects add-iam-policy-binding $PROJECT \
        --role roles/storage.admin --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.instanceAdmin.v1 \
        --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.networkAdmin \
        --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.securityAdmin \
        --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/iam.serviceAccountActor \
        --member serviceAccount:$SA_EMAIL

Dienstkontoschlüssel herunterladen

Nachdem Sie dem Dienstkonto die entsprechenden Berechtigungen erteilt haben, müssen Sie dessen Schlüssel erstellen und herunterladen. Bewahren Sie den Schlüssel an einem sicheren Ort auf. Sie benötigen ihn später zum Konfigurieren des JClouds-Plug-ins, das Sie für die Authentifizierung bei der Compute Engine API verwenden.

  1. Erstellen Sie die Schlüsseldatei:

    gcloud iam service-accounts keys create jenkins-sa.json --iam-account $SA_EMAIL
  2. Klicken Sie in Cloud Shell auf Mehr und wählen Sie dann Datei herunterladen aus.

  3. Geben Sie jenkins-sa.json ein.

  4. Klicken Sie auf Herunterladen und speichern Sie die Datei lokal.

Jenkins-Agent-Image erstellen

Als Nächstes erstellen Sie ein wiederverwendbares Compute Engine-Image, das die Software und Tools für den Start als Jenkins-Ausführungsprogramm enthält.

SSH-Schlüssel für Cloud Shell erstellen

Später in dieser Anleitung erstellen Sie mit Packer Images. Zu diesem Zweck muss der Befehl ssh mit Ihren Build-Instanzen kommunizieren. Den SSH-Zugriff ermöglichen Sie, indem Sie einen SSH-Schlüssel erstellen und in Cloud Shell hochladen:

  1. Erstellen Sie ein SSH-Schlüsselpaar. Wenn bereits ein Schlüsselpaar vorhanden ist, wird dieses verwendet. Andernfalls wird mit dem Befehl ein neues Paar erstellt:

    ls ~/.ssh/id_rsa.pub || ssh-keygen -N ""
  2. Fügen Sie den Metadaten Ihres Projekts den öffentlichen SSH-Schlüssel für Cloud Shell hinzu:

    gcloud compute project-info describe \
        --format=json | jq -r '.commonInstanceMetadata.items[] | select(.key == "ssh-keys") | .value' > sshKeys.pub
    echo "$USER:$(cat ~/.ssh/id_rsa.pub)" >> sshKeys.pub
    gcloud compute project-info add-metadata --metadata-from-file ssh-keys=sshKeys.pub

Basis-Image erstellen

Als Nächstes erstellen Sie mit Packer ein VM-Basis-Image für Ihre Build-Agents, die in Jenkins als sitzungsspezifische Build-Ausführungsprogramme dienen. Für die einfachsten Jenkins-Agents muss nur Java installiert sein. Sie können das Image anpassen. Fügen Sie hierzu in der Packer-Konfiguration im Bereich provisioners Shell-Befehle hinzu oder verwenden Sie andere Packer-Bereitsteller.

  1. Laden Sie in Cloud Shell den neuesten Release von Packer herunter und entpacken Sie ihn. Im folgenden Beispiel wird Packer 1.7.10 verwendet. Auf der Hashicorp-Website können Sie nachsehen, ob es eine neuere Version gibt:

    wget https://releases.hashicorp.com/packer/1.7.10/packer_1.7.10_linux_amd64.zip
    unzip packer_1.7.10_linux_amd64.zip
  2. Erstellen Sie die Konfigurationsdatei für Ihre Packer-Image-Builds:

    export PROJECT=$(gcloud info --format='value(config.project)')
    cat > jenkins-agent.json <<EOF
    {
      "builders": [
        {
          "type": "googlecompute",
          "project_id": "$PROJECT",
          "source_image_family": "ubuntu-2004-lts",
          "source_image_project_id": "ubuntu-os-cloud",
          "zone": "us-central1-a",
          "disk_size": "50",
          "image_name": "jenkins-agent-{{timestamp}}",
          "image_family": "jenkins-agent",
          "ssh_username": "ubuntu"
        }
      ],
      "provisioners": [
        {
          "type": "shell",
          "inline": ["sudo apt-get update && sudo apt-get install -y default-jdk"]
        }
      ]
    }
    EOF
    
  3. Führen Sie Packer raus, um das Image zu erstellen:

    ./packer build jenkins-agent.json

    Wenn der Build abgeschlossen ist, wird der Name des Speicherabbilds im Format jenkins-agent-[TIMESTAMP] angezeigt. Dabei ist [TIMESTAMP] die Epochenzeit, zu der der Build gestartet wurde.

    ==> Builds finished. The artifacts of successful builds are:
    --> googlecompute: A disk image was created: jenkins-agent-1612997575
    

Jenkins installieren

In diesem Abschnitt stellen Sie mithilfe von Cloud Marketplace eine Jenkins-Instanz bereit. Sie passen die Instanz entsprechend an, um das im vorherigen Abschnitt erstellte Agent-Image zu verwenden.

  1. Rufen Sie die Cloud Marketplace-Lösung für Jenkins auf.

  2. Klicken Sie auf Starten.

  3. Ändern Sie das Feld Maschinentyp in 4 vCPUs, 15 GB Speicher, n1-standard-4.

    Auswahl des Maschinentyps für die Jenkins-Bereitstellung

  4. Klicken Sie auf Deploy und warten Sie, bis die Jenkins-Instanz fertig bereitgestellt wurde. Anschließend sehen Sie Folgendes:

    Jenkins wurde bereitgestellt.

  5. Öffnen Sie die Jenkins-Instanz im Browser. Klicken Sie hierfür auf den Link Site Address.

  6. Melden Sie sich mit den im Detailbereich angezeigten Anmeldedaten für Admin user und Admin password bei Jenkins an.

    Detailbereich mit Anmeldedaten und anderen Details zur Bereitstellung

Ihre Jenkins-Instanz kann jetzt verwendet werden.

Jenkins-Plug-ins konfigurieren

Jenkins benötigt Plug-ins, um in Compute Engine On-Demand-Agents zu erstellen und Artefakte in Cloud Storage zu speichern. Sie müssen diese Plug-ins installieren und konfigurieren.

Plug-ins installieren

  1. Wählen Sie in der Jenkins-UI Manage Jenkins aus.
  2. Klicken Sie auf Manage Plugins.
  3. Klicken Sie auf den Tab Available (Verfügbar).
  4. Suchen Sie über die Filterleiste die folgenden Plug-ins und klicken Sie auf die zugehörigen Kästchen:

    • Compute Engine-Plug-in
    • Cloud Storage-Plug-in

    Die folgende Abbildung zeigt das ausgewählte Cloud Storage-Plug-in:

    Cloud Storage-Plug-in

  5. Klicken Sie auf Download now and install after restart.

  6. Klicken Sie das Kästchen Restart Jenkins when installation is complete and no jobs are running (Jenkins neu starten, wenn die Installation abgeschlossen ist und keine Jobs ausgeführt werden) an. Jenkins wird neu gestartet und installiert das Plug-in.

Anmeldedaten für Plug-ins erstellen

Sie müssen für Ihre neuen Plug-ins Google Credentials erstellen:

  1. Melden Sie sich noch einmal bei Jenkins an und klicken Sie auf Manage Jenkins.
  2. Klicken Sie auf Credentials.
  3. Klicken Sie unter Store auf Jenkins.
  4. Klicken Sie im Hauptbereich der UI auf Global credentials (unrestricted).
  5. Erstellen Sie die Google-Anmeldedaten:

    1. Klicken Sie auf Add Credentials.
    2. Legen Sie für Kind die Option Google Service Account from private key fest.
    3. Geben Sie im Feld Project Name Ihre Google Cloud-Projekt-ID ein.
    4. Klicken Sie auf Choose file.
    5. Wählen Sie die Datei jenkins-sa.json aus, die Sie zuvor von Cloud Shell heruntergeladen haben.
    6. Klicken Sie auf OK.

      JSON-Schlüsselanmeldedaten

  6. Klicken Sie auf Jenkins.

Compute Engine-Plug-in konfigurieren

Konfigurieren Sie das Compute Engine-Plug-in mit den Anmeldedaten, die für die Bereitstellung der Agent-Instanzen verwendet werden.

  1. Klicken Sie auf Manage Jenkins.
  2. Klicken Sie auf Manage Nodes and Clouds.
  3. Klicken Sie auf Configure Clouds.
  4. Klicken Sie auf Add a new Cloud.
  5. Klicken Sie auf Compute Engine.
  6. Legen Sie die folgenden Einstellungen fest und ersetzen Sie [YOUR_PROJECT_ID] durch Ihre Google Cloud-Projekt-ID:

    • Name: gce
    • Project ID: [YOUR_PROJECT_ID]
    • Instance Cap: 8
  7. Wählen Sie das Dienstkonto in der Drop-down-Liste Service Account Credentials aus. Es wird als Ihre Google Cloud-Projekt-ID aufgeführt.

Jenkins-Instanzkonfigurationen einrichten

Nachdem Sie das Compute Engine-Plug-in konfiguriert haben, können Sie für Ihre gewünschten Build-Konfigurationen Jenkins-Instanzkonfigurationen einrichten.

  1. Klicken Sie auf der Seite Configure Clouds unter Instance Configurations auf Add .
  2. Geben Sie unter General (Allgemein) Folgendes ein:

    • Name: ubuntu-2004
    • Description: Ubuntu agent
    • Labels: ubuntu-2004
  3. Geben Sie unter Location Folgendes ein:

    • Region<: us-central1
    • Zone: us-central1-f
  4. Klicken Sie auf Advanced.

  5. Wählen Sie unter Machine Configuration (Maschinenkonfiguration) den Machine Type (Maschinentyp) n1-standard-1 aus.

  6. Wählen Sie unter Networking (Netzwerk) die folgenden Einstellungen aus:

    • Network: Übernehmen Sie die Standardeinstellung.
    • Subnetwork: Übernehmen Sie die Standardeinstellung.
    • Wählen Sie Attach External IP? aus.
  7. Wählen Sie für Boot Disk Folgendes aus:

    • Wählen Sie unter Image project Ihr Google Cloud-Projekt aus.
    • Wählen Sie unter Image name das Image aus, das Sie zuvor mit Packer erstellt haben.
  8. Klicken Sie auf Save, um Ihre Konfigurationsänderungen zu übernehmen.

    Compute Engine-Konfigurationen für Jenkins

Jenkins-Job zum Testen der Konfiguration erstellen

Jenkins ist so konfiguriert, dass bei Auslösung eines Jobs, der einen Agent mit dem Label ubuntu-2004 erfordert, automatisch eine Instanz gestartet wird. Erstellen Sie einen Job, mit dem Sie testen können, ob die Konfiguration erwartungsgemäß funktioniert.

  1. Klicken Sie auf der Jenkins-Benutzeroberfläche auf Create new job.
  2. Geben Sie test als Elementnamen ein.
  3. Klicken Sie auf Freestyle project und dann auf OK.
  4. Klicken Sie die Kästchen Execute concurrent builds if necessary und Restrict where this project can run an.
  5. Geben Sie im Feld Label Expression den Wert ubuntu-2004 ein.
  6. Klicken Sie im Bereich Build auf Add Build step.
  7. Klicken Sie auf Execute Shell.
  8. Geben Sie in der Befehlszeile einen Teststring ein:

    echo "Hello world!"

    "Hello World!" in der Befehlszeile für Jenkins

  9. Klicken Sie auf Save.

  10. Klicken Sie auf Build Now, um einen Build zu starten.

    Jetzt erstellen

Build-Artefakte in Cloud Storage hochladen

Sie können Build-Artefakte für zukünftige Analysen oder Tests speichern. Konfigurieren Sie Ihren Jenkins-Job so, dass ein Artefakt generiert und in Cloud Storage hochgeladen wird. Das Build-Log wird in denselben Bucket hochgeladen.

  1. Erstellen Sie in Cloud Shell einen Speicher-Bucket für Ihre Artefakte:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil mb gs://$PROJECT-jenkins-artifacts
  2. Klicken Sie auf der Jenkins-UI in der Jobliste auf Test.

  3. Klicken Sie auf Configure.

  4. Geben Sie unter Build im Textfeld Command Folgendes an:

    env > build_environment.txt
  5. Klicken Sie unter Post-build Actions auf Add post-build action.

  6. Klicken Sie auf Cloud Storage Plugin.

  7. Geben Sie im Feld Storage Location den Artefaktpfad ein und ersetzen Sie [YOUR_PROJECT_ID] durch Ihre Google Cloud-Projekt-ID:

    gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER
  8. Klicken Sie auf Add Operation.

  9. Klicken Sie auf Classic Upload.

  10. Geben Sie im Feld File Pattern den Wert build_environment.txt ein.

  11. Geben Sie im Feld Storage Location den Speicherpfad ein und ersetzen Sie [YOUR_PROJECT_ID] durch Ihre Google Cloud-Projekt-ID:

    gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER

    Post-Build-Aktionen für das Cloud Storage-Plug-in

  12. Klicken Sie auf Save.

  13. Klicken Sie auf Build Now (Jetzt erstellen), um einen neuen Build zu starten. Der Build wird auf der zuvor bereitgestellten Compute Engine-Instanz ausgeführt. Wenn der Build abgeschlossen ist, wird die Artefaktdatei build_environment.txt in den konfigurierten Cloud Storage-Bucket hochgeladen.

  14. Rufen Sie in Cloud Shell mit gsutil das Build-Artefakt auf:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil cat gs://$PROJECT-jenkins-artifacts/test/2/build_environment.txt

Verwaltung des Objektlebenszyklus konfigurieren

Sie greifen in der Regel eher auf neuere Build-Artefakte zu. Damit Sie bei selten aufgerufenen Objekten Kosten sparen, verwalten Sie den Objektlebenszyklus, um Artefakte von leistungsstärkeren Speicherklassen in kostengünstigere Speicherklassen mit höherer Latenz zu verschieben.

  1. Erstellen Sie in Cloud Shell die Datei für die Lebenszykluskonfiguration, um alle Objekte nach 30 Tagen zu Nearline und dann nach 365 Tagen zu Coldline zu übertragen.

    cat > artifact-lifecycle.json <<EOF
    {
    "lifecycle": {
      "rule": [
      {
        "action": {
          "type": "SetStorageClass",
          "storageClass": "NEARLINE"
        },
        "condition": {
          "age": 30,
          "matchesStorageClass": ["MULTI_REGIONAL", "STANDARD", "DURABLE_REDUCED_AVAILABILITY"]
        }
      },
      {
        "action": {
          "type": "SetStorageClass",
          "storageClass": "COLDLINE"
        },
        "condition": {
          "age": 365,
          "matchesStorageClass": ["NEARLINE"]
        }
      }
    ]
    }
    }
    EOF
  2. Laden Sie die Konfigurationsdatei in Ihren Artefaktspeicher-Bucket hoch:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil lifecycle set artifact-lifecycle.json gs://$PROJECT-jenkins-artifacts

Bereinigen

  1. Löschen Sie alle Jenkins-Agents, die noch ausgeführt werden:

    gcloud compute instances list --filter=metadata.jclouds-group=ubuntu-2004 --uri | xargs gcloud compute instances delete
  2. Löschen Sie mithilfe von Cloud Deployment Manager die Jenkins-Instanz:

    gcloud deployment-manager deployments delete jenkins-1
  3. Löschen Sie den Cloud Storage-Bucket:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil -m rm -r gs://$PROJECT-jenkins-artifacts
  4. Löschen Sie das Dienstkonto:

    export SA_EMAIL=$(gcloud iam service-accounts list --filter="displayName:jenkins" --format='value(email)')
    gcloud iam service-accounts delete $SA_EMAIL

Weitere Informationen