Protezione della fornitura di software

1. Panoramica

Artifact Registry consente di archiviare diversi tipi di artefatti, creare più repository in un singolo progetto e associare una regione o una località a più regioni specifiche a ogni repository. Esistono diverse modalità di repository. Ciascuna modalità ha uno scopo diverso. Il seguente diagramma mostra uno dei molti possibili modi in cui è possibile utilizzare insieme i repository in modalità diverse. Il diagramma mostra un flusso di lavoro tra due progetti Google Cloud. In un progetto di sviluppo, gli sviluppatori creano un'applicazione Java. In un progetto di runtime separato, un'altra build crea un'immagine container con l'applicazione per il deployment in Google Kubernetes Engine.

5af5e4da3ccfdff3.png

In questo lab imparerai a eseguire le attività seguenti.

  • Usare Standard Repositories per il deployment di pacchetti privati
  • Usare repository Git remoti per memorizzare nella cache i pacchetti Maven Central
  • Usa i repository virtuali per combinare più repository upstream in un'unica configurazione

Configurazione dell'ambiente autogestito

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Il Nome progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi aggiornarla in qualsiasi momento.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca; di solito non ti importa cosa sia. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere è identificato come PROJECT_ID). Se l'ID generato non ti soddisfa, puoi generarne un altro casuale. In alternativa, puoi provarne una personalizzata per verificare se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà per tutta la durata del progetto.
  • Per informazione, c'è un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare risorse/API Cloud. Eseguire questo codelab non dovrebbe costare molto. Per arrestare le risorse in modo da non incorrere in fatturazione oltre questo tutorial, puoi eliminare le risorse che hai creato o eliminare l'intero progetto. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.

Configurazione dell'area di lavoro

Configura gcloud

In Cloud Shell, imposta l'ID e il numero del progetto. Salvale come variabili PROJECT_ID e PROJECT_NUMBER.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

Abilita API

gcloud services enable artifactregistry.googleapis.com

Clona il repository

git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/container-registry/container-analysis

2. Repository standard

I repository standard forniscono un modo per archiviare pacchetti privati e condividerli tra le tue altre applicazioni

Crea un repository Maven standard

Da Cloud Shell, esegui questo comando per creare un repository per gli artefatti Java:

gcloud artifacts repositories create container-dev-java-repo \
    --repository-format=maven \
    --location=us-central1 \
    --description="Java package repository for Container Dev Workshop"

Fai clic su Autorizza se viene visualizzata la richiesta di autorizzazione di Cloud Shell

Vai a Google Cloud Console - Artifact Registry - Repository e osserva il repository Maven appena creato denominato container-dev-java-repo. Se fai clic su di esso, puoi vedere che al momento è vuoto.

gcloud artifacts repositories describe container-dev-java-repo \
    --location=us-central1

Deve restituire una risposta simile alla seguente

Encryption: Google-managed key
Repository Size: 0.000MB
createTime: '2023-03-21T19:01:45.461589Z'
description: Java package repository for Container Dev Workshop
format: MAVEN
mavenConfig: {}
mode: STANDARD_REPOSITORY
name: projects/qwiklabs-gcp-03-4304110dc461/locations/us-central1/repositories/container-dev-java-repo
updateTime: '2023-03-21T19:01:45.461589Z'

Configura Maven per Artifact Registry

Esegui questo comando per stampare la configurazione del repository da aggiungere al tuo progetto Java:

gcloud artifacts print-settings mvn \
    --repository=container-dev-java-repo \
    --location=us-central1

Il comando precedente restituisce il file xml da aggiungere ai tuoi progetti pom.xml.

  • La sezione repository specifica dove Maven può scaricare gli artefatti remoti per l'utilizzo da parte del progetto corrente.
  • La sezione distributionManagement specifica in quale repository remoto viene eseguito il push del progetto quando viene eseguito il deployment.
  • La sezione relativa alle estensioni aggiunge artefatto-maven-wagon che abilita il livello di autenticazione e trasporto necessario per la connessione ad Artifact Registry
  • Nota: le estensioni possono esistere in pom.xml o extensions.xml. Nei casi in cui il progetto dipende da un progetto padre, si accede a tali dipendenze prima del caricamento delle altre voci in pom.xml. Per assicurarsi che l'elemento padre abbia accesso all'estensione, può essere inserito in un file extensions.xml che viene caricato prima di pom.xml rendendolo così disponibile per le dipendenze padre.

Copia le tre sezioni, quindi apri pom.xml nell'editor di Cloud Shell e aggiungi le impostazioni restituite in fondo al file all'interno del tag project di chiusura.

Suggerimento: in Cloudshell, esegui questo comando nel terminale per aprire l'editor nella directory attuale.

cloudshell workspace .

Esempio: (i nomi dei progetti saranno diversi negli URL)

  ...

  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.2.0</version>
      </extension>
    </extensions>
  </build>

</project>

Carica il tuo pacchetto Java in Artifact Registry

Con Artifact Registry configurato in Maven, ora puoi utilizzare Artifact Registry per archiviare jar Java per l'utilizzo da parte di altri progetti della tua organizzazione.

Esegui questo comando per caricare il pacchetto Java in Artifact Registry:

mvn deploy -DskipTests

Se vuoi eseguire di nuovo questo comando, assicurati di aumentare la versione nel file pom.xml.

Controlla il pacchetto Java in Artifact Registry

Vai a Cloud Console - Artifact Registry - Repositories. Fai clic su container-dev-java-repo e verifica che l'artefatto binario hello-world sia presente:

147eac5168648db1.png

3. Repository remoti

Remote Repositories consente di memorizzare nella cache pacchetti di terze parti per maggiore affidabilità e sicurezza.

Crea un repository remoto

Nota: per maggiori dettagli sull'autenticazione e sulla configurazione, consulta la documentazione del prodotto.

Da Cloud Shell, esegui questo comando per creare un repository remoto per gli artefatti Maven Central:

gcloud artifacts repositories create maven-central-cache \
    --project=$PROJECT_ID \
    --repository-format=maven \
    --location=us-central1 \
    --description="Remote repository for Maven Central caching" \
    --mode=remote-repository \
    --remote-repo-config-desc="Maven Central" \
    --remote-mvn-repo=MAVEN-CENTRAL

Rivedi il repository nella console

Vai a Cloud Console - Artifact Registry - Repositories. Fai clic su maven-central-cache e nota che è stato creato e al momento è vuoto.

Esamina il repository nel terminale

gcloud artifacts repositories describe maven-central-cache \
    --location=us-central1

Integra il repository nel progetto

Esegui questo comando per stampare la configurazione del repository da aggiungere al tuo progetto Java:

gcloud artifacts print-settings mvn \
    --repository=maven-central-cache \
    --location=us-central1

Aggiungi la sezione repository nel tuo file pom.xml. Assicurati di non copiare i <repository> esterni un tag dall'output.

Modifica l'ID del repository appena aggiunto in "centrale" per assicurarti che ogni voce del repository abbia un ID univoco.

Esempio: (i nomi dei progetti saranno diversi negli URL)

  ...

  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>

    <repository>
      <id>central</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/maven-central-cache</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>


  </repositories>

  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.2.0</version>
      </extension>
    </extensions>
  </build>

</project>

Esegui questi comandi nel terminale per creare un'extensions.xml per il tuo progetto. Per utilizzare il meccanismo delle estensioni principali, assicurati che Maven possa risolvere le dipendenze padre o plug-in da Artifact Registry.

mkdir .mvn 
cat > .mvn/extensions.xml << EOF
<extensions xmlns="http://maven.apache.org/EXTENSIONS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd">
  <extension>
    <groupId>com.google.cloud.artifactregistry</groupId>
    <artifactId>artifactregistry-maven-wagon</artifactId>
    <version>2.2.0</version>
  </extension>
</extensions>
EOF

Esegui il pull delle dipendenze dal repository remoto

Esegui questo comando per compilare l'applicazione utilizzando il repository remoto:

rm -rf ~/.m2/repository 
mvn compile

Esamina i pacchetti nella console

Vai a Cloud Console - Artifact Registry - Repositories. Fai clic in maven-central-cache e verifica che gli artefatti binari ci siano memorizzati nella cache:

9deea93caa5fefd7.png

4. Repository virtuali

I repository virtuali fungono da interfaccia per più repository a cui è possibile accedere tramite un'unica configurazione. Ciò semplifica la configurazione client per i consumatori dei tuoi artefatti e aumenta la sicurezza mitigando gli attacchi di confusione di dipendenza.

Crea un file dei criteri

cat > ./policy.json << EOF
[
  {
    "id": "private",
    "repository": "projects/${PROJECT_ID}/locations/us-central1/repositories/container-dev-java-repo",
    "priority": 100
  },
  {
    "id": "central",
    "repository": "projects/${PROJECT_ID}/locations/us-central1/repositories/maven-central-cache",
    "priority": 80
  }
]

EOF

Crea il repository virtuale

gcloud artifacts repositories create virtual-maven-repo \
    --project=${PROJECT_ID} \
    --repository-format=maven \
    --mode=virtual-repository \
    --location=us-central1 \
    --description="Virtual Maven Repo" \
    --upstream-policy-file=./policy.json

Integra il repository nel progetto

Esegui questo comando per stampare la configurazione del repository da aggiungere al tuo progetto Java:

gcloud artifacts print-settings mvn \
    --repository=virtual-maven-repo \
    --location=us-central1

Sostituisci l'intera sezione dei repository nel file pom con l'unica sezione dei repository virtuali dell'output.

Esempio: (i nomi dei progetti saranno diversi negli URL)

  ...


  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/virtual-maven-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.2.0</version>
      </extension>
    </extensions>
  </build>

</project>


Esegui il pull delle dipendenze dal repository virtuale

Poiché il repository virtuale è un passthrough e non archivia i pacchetti effettivi, per dimostrare chiaramente il processo devi eliminare il repository maven-central-cache che hai creato in precedenza e ricrearlo, per ricominciare con un repository vuoto

Esegui questi comandi per ricreare il repository della cache

gcloud artifacts repositories delete maven-central-cache \
    --project=$PROJECT_ID \
    --location=us-central1 \
    --quiet

gcloud artifacts repositories create maven-central-cache \
    --project=$PROJECT_ID \
    --repository-format=maven \
    --location=us-central1 \
    --description="Remote repository for Maven Central caching" \
    --mode=remote-repository \
    --remote-repo-config-desc="Maven Central" \
    --remote-mvn-repo=MAVEN-CENTRAL

Puoi esaminare il repository vuoto nella console. Vai a Console Cloud - Artifact Registry - Repositories

Ora esercita il repository virtuale creando il tuo progetto con il seguente comando

rm -rf ~/.m2/repository 
mvn compile

Esamina i pacchetti nella console

Vai a Cloud Console - Artifact Registry - Repositories Fai clic su maven-central-cache e verifica che gli artefatti binari siano stati configurati per il pull dal repository virtuale, ma alla fine siano stati estratti da maven-central-cache:

9deea93caa5fefd7.png

5. Complimenti!

Complimenti, hai completato il codelab.

Argomenti trattati

  • Utilizzo di repository standard per il deployment di pacchetti privati
  • Utilizzo dei repository remoti per memorizzare nella cache i pacchetti Maven Central
  • Utilizzo di repository virtuali per combinare più repository upstream in un'unica configurazione

Esegui la pulizia

Esegui questo comando per eliminare il progetto

gcloud projects delete ${PROJECT_ID}

Ultimo aggiornamento: 22/03/23