Uso di Jenkins per build distribuite su Compute Engine


Questo tutorial illustra come:

  • Crea un sistema di integrazione continua di Jenkins per eseguire le tue build utilizzando agenti Jenkins on demand in Compute Engine.
  • Archivia gli artefatti delle build in Cloud Storage.
  • Applica un criterio del ciclo di vita per spostare gli artefatti di build più vecchi in Cloud Storage a 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 a Cloud Storage da Compute Engine.

Nel diagramma, viene aggiunto un account di servizio a Jenkins per consentire di creare istanze degli agenti ed eseguire il push degli artefatti a Cloud Storage per l'archiviazione a lungo termine. Jenkins esegue immediatamente il provisioning delle istanze durante l'esecuzione delle build. Man mano che gli artefatti della build passano da una classe di archiviazione all'altra per limitare i costi di conservazione.

Obiettivi

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

Costi

In questo documento, utilizzi 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 potrebbero essere idonei per una prova gratuita.

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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. Attiva l'API Compute Engine.

    Abilita l'API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  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. Eseguirai il resto del tutorial da 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 i dati in Cloud Storage e avviare le istanze in Compute Engine. Jenkins esegue le build in istanze temporanee e archivia gli artefatti di build in Cloud Storage.

Crea un service account

  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 per utilizzarli 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 nel passaggio successivo per configurare il plug-in JClouds per l'autenticazione con l'API Compute Engine.

  1. Crea il file della 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 localmente.

Creare un'immagine dell'agente Jenkins

Poi creerai un'immagine 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 utilizzerai Packer per creare le tue immagini, che richiede il comando ssh per comunicare con le tue istanze della build. Per abilitare l'accesso SSH, crea e carica una chiave SSH in Cloud Shell:

  1. Crea una coppia di chiavi SSH. Se ne esiste già una, questo comando utilizza la 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 prevede l'utilizzo di Packer per creare un'immagine di macchina virtuale (VM) di base per gli 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 di shell nella sezione provisioners della configurazione di Packer o aggiungendo altri provisioner per i pacchetti.

  1. In Cloud Shell, scarica e decomprimi la versione più recente di Packer. L'esempio seguente utilizza Packer 1.7.10. Puoi visitare il sito web di Hashicorp per verificare 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 usare l'immagine dell'agente che hai creato 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 venga completato il provisioning dell'istanza Jenkins. Al termine, vedrai:

    È stato eseguito il deployment di Jenkins.

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

  6. Accedi a Jenkins utilizzando l'utente amministratore e la password amministratore visualizzate nel riquadro dei dettagli.

    Riquadro dei dettagli con le credenziali e altri dettagli del deployment.

La tua istanza di Jenkins è pronta per essere utilizzata.

Configurazione dei plug-in Jenkins

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

Installa plug-in

  1. Nella UI di Jenkins, seleziona Gestisci Jenkins.
  2. Fai clic su Gestisci plug-in.
  3. Fai clic sulla scheda Disponibile.
  4. Utilizza la barra Filter (Filtro) per trovare i seguenti plug-in e seleziona le caselle corrispondenti:

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

    Nell'immagine seguente viene mostrato il plug-in 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 quando l'installazione è completa e nessun job è in esecuzione. Jenkins riavvia e completa le installazioni dei plug-in.

Crea le credenziali del plug-in

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

  1. Accedi di nuovo a Jenkins e fai clic su Gestisci Jenkins.
  2. Fai clic su Credenziali.
  3. Fai clic su Jenkins in Store (Negozio).
  4. Nel riquadro principale della UI, fai clic su Global credentials (unrestricted).
  5. Crea le credenziali Google:

    1. Fai clic su Aggiungi credenziali.
    2. Imposta Kind 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 precedentemente scaricato da Cloud Shell.
    6. Fai clic su Ok.

      Credenziali chiave JSON.

  6. Fai clic su Jenkins.

Configura il plug-in Compute Engine

Configura il plug-in 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 cloud.
  3. Fai clic su Configura i cloud.
  4. Fai clic su 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 istanze: 8
  7. Scegli l'account di servizio dall'elenco a discesa Credenziali dell'account di servizio. È elencato come ID progetto Google Cloud.

Configurare le configurazioni delle istanze Jenkins

Ora che il plug-in Compute Engine è configurato, puoi configurare le configurazioni delle istanze Jenkins per le varie configurazioni di build che preferisci.

  1. Nella pagina Configura cloud, fai clic su Aggiungi per Configurazioni istanza.
  2. Inserisci le seguenti impostazioni generali:

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

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

  5. In Configurazione macchina, scegli il Tipo di macchina di 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. Per le impostazioni del Disco di avvio, seleziona quanto segue:

    • In Progetto immagine, scegli il tuo progetto Google Cloud.
    • In 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. Crea un job che verifichi se la configurazione funziona come previsto.

  1. Fai clic su Create new job (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 contemporanee se necessario e Limita dove può essere eseguito questo progetto.
  5. Nel campo Espressione etichetta, inserisci ubuntu-2004.
  6. Nella sezione Build, fai clic su Aggiungi passaggio build.
  7. Fai clic su Esegui shell.
  8. Nella casella di comando, inserisci una stringa di prova:

    echo "Hello world!"

    Hello World digitato nella casella di comando per Jenkins.

  9. Fai clic su Salva.

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

    Crea ora.

Caricamento degli artefatti di build in Cloud Storage

Potrebbe essere utile archiviare gli artefatti delle build per analisi o test futuri. Configura il tuo job Jenkins per generare un artefatto e caricarlo su 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-creazione, 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 Località archiviazione, inserisci il 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 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. Al termine, 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 ad artefatti build recenti. Per risparmiare sui costi relativi agli oggetti a cui si accede raramente, utilizza la gestione del ciclo di vita degli oggetti per spostare gli artefatti da classi di archiviazione a prestazioni più elevate a classi di archiviazione a latenza più bassa e più elevata.

  1. In Cloud Shell, crea il file di configurazione del ciclo di vita per trasferire tutti gli oggetti all'archiviazione Nearline dopo 30 giorni e agli oggetti Nearline all'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