Uso di Jenkins per build distribuite su Compute Engine

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questo tutorial ti mostra come:

  • Crea un sistema di integrazione continua Jenkins per eseguire le tue build utilizzando gli 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 più vecchi in Cloud Storage verso 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 da Compute Engine a Cloud Storage.

Nel diagramma, a Jenkins viene aggiunto un account di servizio per poter 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 all'istante durante l'esecuzione delle build. Man mano che gli artefatti della build diventano più vecchi, si spostano in varie classi di archiviazione per limitare il costo di conservazione.

Obiettivi

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

Costi

Questo tutorial utilizza 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 beneficiare di 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. Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

  4. Attiva l'API Compute Engine.

    Abilita l'API

  5. Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  6. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

  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 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 istanze in Compute Engine. Jenkins esegue le tue build in istanze temporanee e archivia gli artefatti delle build in Cloud Storage.

Crea un account di servizio

  1. Crea l'account di servizio stesso:

    gcloud iam service-accounts create jenkins --display-name jenkins
  2. Archivia l'indirizzo email dell'account di servizio e il tuo ID progetto Google Cloud corrente 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. associare 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 un secondo momento per la configurazione del 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.

Crea un'immagine dell'agente Jenkins

In seguito, crei un'immagine di Compute Engine riutilizzabile contenente il software e gli strumenti necessari per eseguire 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 istanze di 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, questo comando utilizza quella coppia di chiavi; se 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 riferimento per i tuoi agenti di build, che fungono da esecutori di build temporanei in Jenkins. L'agente Jenkins più semplice richiede solo l'installazione di Java. Puoi personalizzare l'immagine aggiungendo comandi shell nella sezione provisioners della configurazione di Packer o aggiungendo altri ProvisionerPacker.

  1. In Cloud Shell, scarica e decomprimi la release più recente di Packer. Nel seguente esempio viene utilizzato il pacchetto 1.7.10. Puoi controllare il sito web di Hashicorp per vedere 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 delle immagini del pacchetto:

    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 termine, viene visualizzato il nome dell'immagine disco con il formato jenkins-agent-[TIMESTAMP], dove [TIMESTAMP] indica il momento del periodo in cui è stata avviata.

    ==> 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 Jenkins. Personalizza questa istanza in modo che utilizzi l'immagine dell'agente creata nella sezione precedente.

  1. Vai alla soluzione Cloud Marketplace per Jenkins.

  2. Fai clic su Launch .

  3. Cambia il campo Tipo di macchina in 4 vCPU e 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 il completamento del provisioning dell'istanza Jenkins. Al termine, vedrai:

    Deployment di Jenkins eseguito.

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

  6. Accedi a Jenkins utilizzando Admin user e Admin password visualizzati nel riquadro dei dettagli.

    Riquadro dei dettagli con credenziali e altri dettagli del deployment.

La tua istanza di Jenkins è ora pronta per l'uso.

Configurazione dei plug-in Jenkins

Jenkins richiede i 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.

Installa plug-in

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

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

    La seguente immagine mostra il plug-in Cloud Storage selezionato:

    Plug-in 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 è completata e nessun job è in esecuzione. Jenkins si riavvia e completa le installazioni del plug-in.

Crea credenziali plug-in

Devi creare Google Credentials per i nuovi plug-in:

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

    1. Fai clic su Add Credentials (Aggiungi credenziali).
    2. Imposta Kind su Google Service Account from private key.
    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 della chiave JSON.

  6. Fai clic su Jenkins.

Configura il plug-in Compute Engine

Configura il plug-in Compute Engine con le credenziali utilizzate per il provisioning delle istanze dell'agente.

  1. Fai clic su Manage Jenkins (Gestisci Jenkins).
  2. Fai clic su Gestisci nodi e nuvole.
  3. Fai clic su Configura 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 l'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. Viene elencato come ID progetto Google Cloud.

Configura configurazioni di istanze Jenkins

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

  1. Nella pagina Configura Cloud, fai clic su Aggiungi per Configurazioni di istanze.
  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 Avanzate.

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

  6. In Networking, scegli le seguenti impostazioni:

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

    • 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. 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'articolo.
  3. Fai clic su Progetto freestyle, quindi su OK.
  4. Seleziona le caselle Esegui build contemporanee, se necessario e Limita le località in cui può essere eseguito questo progetto.
  5. Nel campo Espressione etichetta, inserisci ubuntu-2004.
  6. Nella sezione Build, fai clic su Add build step (Aggiungi passaggio di build).
  7. Fai clic su Esegui Shell.
  8. Nella casella del comando, inserisci una stringa di test:

    echo "Hello world!"

    Hello World ha digitato nella casella di comando Jenkins.

  9. Fai clic su Salva.

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

    Crea ora.

Caricamento degli artefatti della build in Cloud Storage

Potrebbe essere opportuno archiviare gli artefatti della build per analisi o test futuri. Configurare 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 gli artefatti:

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

  3. Fai clic su Configura.

  4. In Build, imposta il campo di testo Command su:

    env > build_environment.txt
  5. In Post-build Actions (Azioni post-build), fai clic su Add post-build action (Aggiungi azione post-build).

  6. Fai clic su Cloud Storage Plugin.

  7. Nel campo Posizione località, inserisci il percorso dell'artefatto, sostituendo il tuo 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 Versione classica di caricamenti.

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

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

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

    Azioni post-build 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 nell'istanza di Compute Engine di cui hai eseguito il provisioning in precedenza. Al completamento, la build carica il file dell'elemento, 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

Hai più probabilità di accedere agli artefatti della build recenti. Per risparmiare sui costi degli oggetti a cui si accede di rado, utilizza la gestione del ciclo di vita degli oggetti per spostare gli artefatti dalle classi di archiviazione ad alte prestazioni a classi di archiviazione a latenza inferiore e a costi inferiori.

  1. In Cloud Shell, crea il file di configurazione del ciclo di vita per eseguire la transizione di tutti gli oggetti allo spazio di archiviazione Nearline dopo 30 giorni, oltre agli 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 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