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.
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.
Utilizza il Calcolatore prezzi per generare una stima dei costi in base all'utilizzo previsto.
Prima di iniziare
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Attiva l'API Compute Engine.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Attiva l'API Compute Engine.
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.
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
Crea l'account di servizio:
gcloud iam service-accounts create jenkins --display-name jenkins
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)')
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.
Crea il file della chiave:
gcloud iam service-accounts keys create jenkins-sa.json --iam-account $SA_EMAIL
In Cloud Shell, fai clic su Altro more_vert, quindi su Scarica file.
Digita
jenkins-sa.json
.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:
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 ""
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.
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
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
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.
Vai alla soluzione Cloud Marketplace per Jenkins.
Fai clic su Launch .
Modifica il campo Tipo di macchina in 4 vCPU 15 GB di memoria, n1-standard-4.
Fai clic su Esegui il deployment e attendi che venga completato il provisioning dell'istanza Jenkins. Al termine, vedrai:
Apri l'istanza di Jenkins nel browser facendo clic sul link Site Address (Indirizzo del sito).
Accedi a Jenkins utilizzando l'utente amministratore e la password amministratore visualizzate nel riquadro dei dettagli.
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
- Nella UI di Jenkins, seleziona Gestisci Jenkins.
- Fai clic su Gestisci plug-in.
- Fai clic sulla scheda Disponibile.
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:
Fai clic su Scarica ora e installa dopo il riavvio.
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:
- Accedi di nuovo a Jenkins e fai clic su Gestisci Jenkins.
- Fai clic su Credenziali.
- Fai clic su Jenkins in Store (Negozio).
- Nel riquadro principale della UI, fai clic su Global credentials (unrestricted).
Crea le credenziali Google:
- Fai clic su Aggiungi credenziali.
- Imposta Kind su Account di servizio Google da chiave privata.
- Nel campo Nome progetto, inserisci il tuo ID progetto Google Cloud.
- Fai clic su Scegli file.
- Seleziona il file
jenkins-sa.json
che hai precedentemente scaricato da Cloud Shell. Fai clic su Ok.
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.
- Fai clic su Gestisci Jenkins.
- Fai clic su Gestisci nodi e cloud.
- Fai clic su Configura i cloud.
- Fai clic su Aggiungi un nuovo cloud.
- Fai clic su Compute Engine.
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
- Nome:
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.
- Nella pagina Configura cloud, fai clic su Aggiungi add per Configurazioni istanza.
Inserisci le seguenti impostazioni generali:
- Nome:
ubuntu-2004
- Descrizione:
Ubuntu agent
- Etichette:
ubuntu-2004
- Nome:
Inserisci quanto segue per le impostazioni di Posizione:
- Regione<:
us-central1
- Zona:
us-central1-f
- Regione<:
Fai clic su Advanced (Avanzate).
In Configurazione macchina, scegli il Tipo di macchina di n1-standard-1.
In Networking, scegli le seguenti impostazioni:
- Rete: lascia l'impostazione predefinita.
- Subnet: lascia l'impostazione predefinita.
- Seleziona Collegare IP esterno?.
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.
Fai clic su Salva per mantenere le modifiche alla configurazione.
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.
- Fai clic su Create new job (Crea nuovo job) nell'interfaccia di Jenkins.
- Inserisci
test
come nome dell'elemento. - Fai clic su Progetto Freestyle, quindi su OK.
- Seleziona le caselle Esegui build contemporanee se necessario e Limita dove può essere eseguito questo progetto.
- Nel campo Espressione etichetta, inserisci
ubuntu-2004
. - Nella sezione Build, fai clic su Aggiungi passaggio build.
- Fai clic su Esegui shell.
Nella casella di comando, inserisci una stringa di prova:
echo "Hello world!"
Fai clic su Salva.
Fai clic su Crea ora per iniziare una build.
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.
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
Nell'elenco dei job nella UI di Jenkins, fai clic su test.
Fai clic su Configura.
In Crea, imposta il campo di testo Comando su:
env > build_environment.txt
In Azioni post-creazione, fai clic su Aggiungi azione post-creazione.
Fai clic su Cloud Storage Plugin.
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
Fai clic su Aggiungi operazione.
Fai clic su Caricamento classico.
Nel campo Pattern file, inserisci
build_environment.txt
.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
Fai clic su Salva.
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.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.
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
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
Elimina tutti gli agenti Jenkins ancora in esecuzione:
gcloud compute instances list --filter=metadata.jclouds-group=ubuntu-2004 --uri | xargs gcloud compute instances delete
Utilizzando Cloud Deployment Manager, elimina l'istanza di Jenkins:
gcloud deployment-manager deployments delete jenkins-1
Elimina il bucket Cloud Storage:
export PROJECT=$(gcloud info --format='value(config.project)') gsutil -m rm -r gs://$PROJECT-jenkins-artifacts
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
- Scopri di più sul deployment continuo con Jenkins
- Esegui il deployment di Jenkins su Kubernetes Engine
- Esplora le architetture di riferimento, i diagrammi e le best practice su Google Cloud. Visita il nostro Cloud Architecture Center.