Protezione dell'approvvigionamento di software

1. Panoramica

Artifact Registry ti consente di archiviare diversi tipi di artefatti, creare più repository in un unico progetto e associare una regione o più regioni specifiche a ogni repository. Esistono diverse modalità di repository. Ogni modalità ha uno scopo diverso. Il seguente diagramma mostra uno dei tanti modi possibili per utilizzare i repository in diverse modalità. Il diagramma mostra un flusso di lavoro in 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:

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

Configurazione dell'ambiente autonomo

  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 del progetto è il nome visualizzato per i partecipanti a questo progetto. È una stringa di caratteri non utilizzata dalle API di Google. Puoi aggiornarlo in qualsiasi momento.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo l'impostazione). La console Cloud genera automaticamente una stringa univoca, di solito non ti interessa di cosa si tratta. Nella maggior parte dei codelab, devi fare riferimento all'ID progetto (in genere è identificato come PROJECT_ID). Se non ti piace l'ID generato, puoi generarne un altro casuale. In alternativa, puoi provare a crearne uno e vedere se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà per tutta la durata del progetto.
  • Per tua informazione, esiste un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, devi abilitare la fatturazione in Cloud Console per utilizzare le risorse/API Cloud. L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Per arrestare le risorse in modo da non incorrere in costi di fatturazione al termine di questo tutorial, puoi eliminare le risorse che hai creato o l'intero progetto. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.

Configurazione di Workspace

Configura gcloud

In Cloud Shell, imposta l'ID e il numero del progetto. Salvali 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 offrono un modo per archiviare i pacchetti privati e condividerli con le 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 visualizzato il prompt di autorizzazione di Cloud Shell

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

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

Dovrebbe 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 codice XML da aggiungere al file pom.xml dei tuoi progetti.

  • La sezione repositories specifica dove Maven può scaricare gli artefatti remoti da utilizzare nel progetto corrente.
  • La sezione distributionManagement specifica il repository remoto in cui verrà eseguito il push del progetto al momento del deployment.
  • La sezione extensions aggiunge artifactregistry-maven-wagon, che abilita l'autenticazione e il livello di trasporto necessari 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 principale, si accede a queste dipendenze prima che vengano caricate le altre voci nel file pom.xml. Per garantire che il genitore abbia accesso all'estensione, questa può essere inserita in un file extensions.xml caricato prima di pom.xml, rendendola disponibile per le dipendenze del genitore.

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

Suggerimento: in Cloud Shell, esegui questo comando nel terminale per aprire l'editor nella directory corrente.

cloudshell workspace .

Esempio: (i nomi dei tuoi 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 pacchetto Java su Artifact Registry

Con Artifact Registry configurato in Maven, ora puoi utilizzare Artifact Registry per archiviare i file JAR Java da utilizzare in altri progetti della tua organizzazione.

Esegui questo comando per caricare il pacchetto Java su 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 console Cloud - 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

I repository remoti consentono di memorizzare nella cache i pacchetti di terze parti per una maggiore affidabilità e sicurezza.

Crea un repository remoto

Nota: per informazioni dettagliate su autenticazione e 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

Esaminare il repository nella console

Vai a console Cloud - Artifact Registry - Repository fai clic su maven-central-cache e noterai che è stato creato ed è attualmente vuoto

Esamina il repository nel terminale

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

Integrare 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 del repository a pom.xml. Assicurati di non copiare il tag esterno <repositories> dall'output.

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

Esempio: (i nomi dei tuoi 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. Utilizza il meccanismo delle estensioni principali per assicurarti che Maven possa risolvere le dipendenze padre o dei 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

Esaminare i pacchetti nella console

Vai a console Cloud - Artifact Registry - Repository. Fai clic su maven-central-cache e verifica che gli artefatti binari memorizzati nella cache:

9deea93caa5fefd7.png

4. Repository virtuali

I repository virtuali fungono da interfaccia per accedere a più repository tramite un'unica configurazione. In questo modo, la configurazione del client per i consumatori degli artefatti viene semplificata e la sicurezza viene aumentata grazie alla mitigazione degli attacchi di confusione delle dipendenze.

Creare un file di 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

Integrare 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 la sezione dei repository virtuali dell'output.

Esempio: (i nomi dei tuoi 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>


Pull delle dipendenze dal repository virtuale

Poiché il repository virtuale è un pass-through e non memorizza pacchetti effettivi, per dimostrare chiaramente la procedura eliminerai il repository maven-central-cache creato in precedenza e lo ricreerai 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 Cloud Console - Artifact Registry - Repository

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

rm -rf ~/.m2/repository 
mvn compile

Esaminare i pacchetti nella console

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

9deea93caa5fefd7.png

5. Complimenti!

Congratulazioni, hai completato il codelab.

Argomenti trattati

  • Utilizzo di repository standard per il deployment dei pacchetti privati
  • Utilizzo di repository remoti per memorizzare nella cache i pacchetti Maven Central
  • Utilizzato 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/2023