Uso di Jenkins per build distribuite su Compute Engine


Questo tutorial ti mostra come:

  • Crea un sistema di integrazione continua Jenkins per eseguire le build utilizzando agenti Jenkins on demand in Compute Engine.
  • Archivia gli artefatti della build in Cloud Storage.
  • Applica un criterio del ciclo di vita per spostare gli artefatti delle build meno recenti in Cloud Storage in opzioni di archiviazione meno costose.

Architettura

Il seguente diagramma illustra l'architettura del tutorial.

Architettura che mostra in che modo un account di servizio esegue il push degli artefatti tramite Compute Engine a Cloud Storage.

Nel diagramma, viene aggiunto un account di servizio a Jenkins per essere in grado di creare istanze di agente ed eseguire il push degli artefatti in Cloud Storage per l'archiviazione a lungo termine. Jenkins esegue il provisioning delle istanze al volo durante l'esecuzione delle build. Man mano che gli artefatti della build diventano meno recenti, vengono spostati attraverso varie classi di archiviazione per limitare i costi di conservazione.

Obiettivi

  • Crea un'immagine di base con Packer per eseguire le build di Jenkins.
  • Esegui il provisioning di Jenkins utilizzando Cloud Marketplace.
  • Configura Jenkins per il deployment di agenti di build temporanei.
  • Caricare gli artefatti delle build in Cloud Storage.
  • Configura criteri del ciclo di vita per ottimizzare i costi di Cloud Storage.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

  • Compute Engine
  • Cloud Storage

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Utilizza il Calcolatore prezzi per generare una stima dei costi in base all'utilizzo previsto.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Attiva l'API Compute Engine.

    Abilita l'API

  5. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  6. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  7. Attiva l'API Compute Engine.

    Abilita l'API

Configurazione dell'ambiente

In questa sezione configurerai l'infrastruttura e le identità necessarie per completare il tutorial. Esegui il resto del tutorial in Cloud Shell.

Apri Cloud Shell

Configura IAM

Creare un account di servizio Identity and Access Management (IAM) per delegare le autorizzazioni a Jenkins. Questo account consente a Jenkins di archiviare dati in Cloud Storage e avviare istanze in Compute Engine. Jenkins esegue le build nelle istanze temporanee e archivia gli artefatti delle build in Cloud Storage.

Crea un account di servizio

  1. Crea l'account di servizio:

    gcloud iam service-accounts create jenkins --display-name jenkins
  2. Archivia l'indirizzo email dell'account di servizio e l'ID progetto Google Cloud attuale nelle variabili di ambiente da utilizzare nei comandi successivi:

    export SA_EMAIL=$(gcloud iam service-accounts list \
        --filter="displayName:jenkins" --format='value(email)')
    export PROJECT=$(gcloud info --format='value(config.project)')
  3. Associa i seguenti ruoli al tuo account di servizio:

    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

Scarica la chiave dell'account di servizio

Ora che hai concesso all'account di servizio le autorizzazioni appropriate, devi creare e scaricare la relativa chiave. Conserva la chiave in un luogo sicuro. Lo utilizzerai in seguito durante la configurazione del plug-in JClouds per l'autenticazione con l'API Compute Engine.

  1. Crea il file di chiave:

    gcloud iam service-accounts keys create jenkins-sa.json --iam-account $SA_EMAIL
  2. In Cloud Shell, fai clic su Altro , quindi su Scarica file.

  3. Digita jenkins-sa.json.

  4. Fai clic su Scarica per salvare il file in locale.

Crea un'immagine agente Jenkins

Il passaggio successivo consiste nel creare un'immagine di Compute Engine riutilizzabile che contiene il software e gli strumenti necessari per l'esecuzione come esecutore di Jenkins.

Crea una chiave SSH per Cloud Shell

Più avanti in questo tutorial userai Packer per creare le tue immagini, che richiede il comando ssh per comunicare con le istanze della build. Per abilitare l'accesso SSH, crea e carica una chiave SSH in Cloud Shell:

  1. Creare una coppia di chiavi SSH. Se ne esiste già una, il comando utilizza questa coppia di chiavi, altrimenti ne crea una nuova:

    ls ~/.ssh/id_rsa.pub || ssh-keygen -N ""
  2. Aggiungi la chiave SSH pubblica di Cloud Shell ai metadati del tuo progetto:

    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

Crea l'immagine di riferimento

Il passaggio successivo consiste nell'utilizzare Packer per creare un'immagine di macchina virtuale (VM) di base per i tuoi agenti di build, che fungono da esecutori di build temporanei in Jenkins. L'agente Jenkins di base richiede solo l'installazione di Java. Puoi personalizzare l'immagine aggiungendo comandi shell nella sezione provisioners della configurazione di Packer o aggiungendo altri provisioner per la creazione di pacchetti.

  1. In Cloud Shell, scarica e decomprimi la release più recente di Packer. L'esempio seguente utilizza Packer 1.7.10. Puoi visitare il sito web di Hashicorp per sapere se esiste una versione più recente:

    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. Crea il file di configurazione per le build di immagini Packer:

    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. Crea l'immagine eseguendo Packer:

    ./packer build jenkins-agent.json

    Al completamento della build, il nome dell'immagine disco viene visualizzato nel formato jenkins-agent-[TIMESTAMP], dove [TIMESTAMP] è l'epoca in cui è stata avviata la build.

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

Installazione di Jenkins

In questa sezione utilizzerai Cloud Marketplace per eseguire il provisioning di un'istanza di Jenkins. Puoi personalizzare l'istanza in modo da utilizzare l'immagine dell'agente creata nella sezione precedente.

  1. Vai alla soluzione Cloud Marketplace per Jenkins.

  2. Fai clic su Launch .

  3. Modifica il campo Tipo di macchina in 4 vCPU, 15 GB di memoria, n1-standard-4.

    Selezione del tipo di macchina per il deployment di Jenkins.

  4. Fai clic su Esegui il deployment e attendi che il provisioning dell'istanza di Jenkins termini. Al termine, vedrai:

    È stato eseguito il deployment di Jenkins.

  5. Apri l'istanza di Jenkins nel browser facendo clic sul link Indirizzo del sito.

  6. Accedi a Jenkins utilizzando le opzioni Utente amministratore e Password amministratore visualizzate nel riquadro dei dettagli.

    Riquadro dei dettagli con credenziali e altri dettagli del deployment.

L'istanza Jenkins è ora pronta per essere utilizzata.

Configurazione dei plug-in Jenkins

Jenkins richiede plug-in per creare agenti on demand in Compute Engine e per archiviare gli artefatti in Cloud Storage. Devi installare e configurare questi plug-in.

Installazione di plug-in

  1. Nell'interfaccia utente di Jenkins, seleziona Manage Jenkins.
  2. Fai clic su Gestisci plug-in.
  3. Fai clic sulla scheda Disponibile.
  4. Utilizza la barra dei filtri per trovare i seguenti plug-in e seleziona le caselle corrispondenti:

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

    L'immagine seguente mostra il plug-in di Cloud Storage selezionato:

    Plug-in di Cloud Storage.

  5. Fai clic su Scarica ora e installa dopo il riavvio.

  6. Fai clic sulla casella di controllo Riavvia Jenkins al termine dell'installazione e quando nessun job è in esecuzione. Jenkins si riavvia e completa le installazioni dei plug-in.

Crea credenziali plug-in

Devi creare Google Credentials per i tuoi nuovi plug-in:

  1. Accedi di nuovo a Jenkins e fai clic su Manage Jenkins.
  2. Fai clic su Credentials (Credenziali).
  3. Fai clic su Jenkins in Store.
  4. Nel riquadro principale dell'interfaccia utente, fai clic su Global credentials (senza restrizioni).
  5. Crea le credenziali Google:

    1. Fai clic su Add Credentials (Aggiungi credenziali).
    2. Imposta Tipo su Account di servizio Google da chiave privata.
    3. Nel campo Nome progetto, inserisci il tuo ID progetto Google Cloud.
    4. Fai clic su Scegli file.
    5. Seleziona il file jenkins-sa.json che hai scaricato in precedenza da Cloud Shell.
    6. Fai clic su Ok.

      Credenziali chiave JSON.

  6. Fai clic su Jenkins.

Configura il plug-in di Compute Engine

Configura il plug-in di Compute Engine con le credenziali che utilizza per eseguire il provisioning delle istanze dell'agente.

  1. Fai clic su Gestisci Jenkins.
  2. Fai clic su Gestisci nodi e nuvole.
  3. Fai clic su Configura cloud.
  4. Fai clic su Add a new cloud (Aggiungi un nuovo cloud).
  5. Fai clic su Compute Engine.
  6. Configura le impostazioni seguenti e sostituisci [YOUR_PROJECT_ID] con il tuo ID progetto Google Cloud:

    • Nome: gce
    • ID progetto: [YOUR_PROJECT_ID]
    • Limite di istanza: 8
  7. Scegli l'account di servizio dall'elenco a discesa Credenziali account di servizio. È indicato come ID progetto Google Cloud.

Configura le configurazioni delle istanze Jenkins

Ora che il plug-in di Compute Engine è configurato, puoi configurare le configurazioni dell'istanza Jenkins per le varie configurazioni della build.

  1. Nella pagina Configura cloud, fai clic su Aggiungi per Configurazioni delle istanze.
  2. Inserisci le seguenti impostazioni Generali:

    • Nome: ubuntu-2004
    • Descrizione: Ubuntu agent
    • Etichette: ubuntu-2004
  3. Inserisci quanto segue per le impostazioni di geolocalizzazione:

    • Regione<: us-central1
    • Zona: us-central1-f
  4. Fai clic su Avanzate.

  5. In Configurazione macchina, scegli Tipo di macchina su n1-standard-1.

  6. In Networking, scegli le seguenti impostazioni:

    • Rete: lascia l'impostazione predefinita.
    • Subnet: lascia l'impostazione predefinita.
    • Seleziona Collegare IP esterno?.
  7. Seleziona quanto segue per le impostazioni Disco di avvio:

    • Per Progetto immagine, scegli il tuo progetto Google Cloud.
    • Per Nome immagine, seleziona l'immagine che hai creato in precedenza utilizzando Packer.
  8. Fai clic su Salva per mantenere le modifiche alla configurazione.

    Configurazioni di Compute Engine per Jenkins.

Creazione di un job Jenkins per testare la configurazione

Jenkins è configurato per avviare automaticamente un'istanza quando viene attivato un job che richiede un agente con l'etichetta ubuntu-2004. Creare un job che verifichi se la configurazione funziona come previsto.

  1. Fai clic su Crea nuovo job nell'interfaccia di Jenkins.
  2. Inserisci test come nome dell'elemento.
  3. Fai clic su Progetto freestyle, quindi su OK.
  4. Seleziona le caselle Esegui build simultanee se necessario e Limita dove può essere eseguito il progetto.
  5. Nel campo Espressione etichetta, inserisci ubuntu-2004.
  6. Nella sezione Crea, fai clic su Aggiungi passaggio di build.
  7. Fai clic su Esegui Shell.
  8. Nella casella di comando, inserisci una stringa di test:

    echo "Hello world!"

    Hello World ha digitato nella casella di comando di Jenkins.

  9. Fai clic su Salva.

  10. Fai clic su Crea ora per avviare una build.

    Crea ora.

Caricamento degli artefatti delle build in Cloud Storage

Potrebbe essere opportuno archiviare gli artefatti della build per analisi o test futuri. Configura il job Jenkins per generare un artefatto e caricarlo in Cloud Storage. Il log di build viene caricato nello stesso bucket.

  1. In Cloud Shell, crea un bucket di archiviazione per i tuoi artefatti:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil mb gs://$PROJECT-jenkins-artifacts
  2. Nell'elenco dei job nella UI di Jenkins, fai clic su test.

  3. Fai clic su Configura.

  4. In Crea, imposta il campo di testo Comando su:

    env > build_environment.txt
  5. In Azioni post-build, fai clic su Aggiungi azione post-creazione.

  6. Fai clic su Cloud Storage Plugin.

  7. Nel campo Posizione archiviazione, inserisci il percorso dell'artefatto, sostituendo l'ID progetto Google Cloud con [YOUR_PROJECT_ID]:

    gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER
  8. Fai clic su Aggiungi operazione.

  9. Fai clic su Caricamento classico.

  10. Nel campo Pattern file, inserisci build_environment.txt.

  11. Nel campo Posizione archiviazione, inserisci il tuo percorso di archiviazione sostituendo l'ID progetto Google Cloud con [YOUR_PROJECT_ID]:

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

    Azioni post-creazione per il plug-in di Cloud Storage.

  12. Fai clic su Salva.

  13. Fai clic su Crea ora per iniziare una nuova build. La build viene eseguita sull'istanza Compute Engine di cui hai eseguito il provisioning in precedenza. Una volta completata, la build carica il file dell'artefatto, build_environment.txt, nel bucket Cloud Storage configurato.

  14. In Cloud Shell, visualizza l'artefatto della build utilizzando gsutil:

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

Configurazione della gestione del ciclo di vita degli oggetti

È più probabile che tu acceda agli artefatti della build recenti. Per risparmiare sui costi degli oggetti a cui si accede raramente, usa la gestione del ciclo di vita degli oggetti per spostare i tuoi artefatti da classi di archiviazione con prestazioni più elevate a classi di archiviazione con costi più bassi e a latenza più elevata.

  1. In Cloud Shell, crea il file di configurazione del ciclo di vita per eseguire la transizione di tutti gli oggetti nello spazio di archiviazione Nearline dopo 30 giorni e gli oggetti Nearline allo spazio di archiviazione Coldline dopo 365 giorni.

    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. Carica il file di configurazione nel bucket di archiviazione degli artefatti:

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

Esegui la pulizia

  1. Elimina tutti gli agenti Jenkins ancora in esecuzione:

    gcloud compute instances list --filter=metadata.jclouds-group=ubuntu-2004 --uri | xargs gcloud compute instances delete
  2. Utilizzando Cloud Deployment Manager, elimina l'istanza di Jenkins:

    gcloud deployment-manager deployments delete jenkins-1
  3. Elimina il bucket Cloud Storage:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil -m rm -r gs://$PROJECT-jenkins-artifacts
  4. Elimina l'account di servizio:

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

Passaggi successivi