Como proteger o fornecimento de software

1. Visão geral

O Artifact Registry permite que você armazene diferentes tipos de artefatos, crie vários repositórios em um único projeto e associe uma região ou multirregião específica a cada repositório. Há vários modos de repositório. Cada modo tem uma finalidade diferente. O diagrama a seguir mostra uma das muitas maneiras possíveis de usar repositórios em diferentes modos juntos. O diagrama mostra um fluxo de trabalho em dois projetos do Google Cloud. Em um projeto de desenvolvimento, os desenvolvedores criam um aplicativo Java. Em um projeto de ambiente de execução separado, outro build cria uma imagem de contêiner com o aplicativo para implantação no Google Kubernetes Engine.

5af5e4da3ccfdff3.png

Neste laboratório, você aprenderá a realizar as seguintes tarefas.

  • Usar repositórios padrão para implantar seus pacotes particulares
  • Usar repositórios remotos para armazenar em cache pacotes centrais do Maven
  • Usar repositórios virtuais para combinar vários repositórios upstream em uma configuração

Configuração de ambiente personalizada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google É possível atualizar o local a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto.
  • Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou o projeto inteiro. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Configuração do Workspace

Configurar a gcloud

No Cloud Shell, defina o ID e o número do projeto. Salve-as como variáveis PROJECT_ID e PROJECT_NUMBER.

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

Ativar APIs

gcloud services enable artifactregistry.googleapis.com

Clone o repositório

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

2. Repositórios padrão

Os repositórios padrão oferecem uma maneira de armazenar seus pacotes particulares e compartilhá-los em outros aplicativos

Criar um repositório Maven padrão

No Cloud Shell, execute o seguinte comando para criar um repositório para artefatos Java:

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

Clique em "Autorizar" se o prompt de autorização do Cloud Shell aparecer

Acesse o console do Google Cloud > Artifact Registry > Repositórios e observe o repositório Maven recém-criado chamado container-dev-java-repo. Se você clicar nele, verá que está vazio no momento.

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

deve retornar uma resposta semelhante a esta

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'

Configurar o Maven para o Artifact Registry

Execute o comando a seguir para mostrar a configuração do repositório para adicioná-la ao seu projeto Java.

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

O comando anterior retorna o XML a ser adicionado ao pom.xml dos seus projetos.

  • A seção repositories especifica onde o Maven pode fazer o download de artefatos remotos para uso no projeto atual.
  • A seção distributionManagement especifica para qual repositório remoto o projeto será enviado quando for implantado.
  • A seção extensions adiciona o artifactregistry-maven-wagon, que ativa a camada de autenticação e transporte necessária para se conectar ao Artifact Registry
  • Observação: as extensões podem existir em pom.xml ou extensions.xml. Nos casos em que o projeto depende de um projeto pai, essas dependências são acessadas antes do carregamento do restante das entradas no pom.xml. Para garantir que o pai tenha acesso à extensão, ela pode ser colocada em um arquivo extensions.xml, que é carregado antes do pom.xml, tornando-o disponível para as dependências do pai.

Copie as três seções e abra o arquivo pom.xml no editor do Cloud Shell. Adicione as configurações retornadas na parte de baixo do arquivo, logo dentro da tag de fechamento project.

Dica: no cloudshell, execute o seguinte comando no terminal para abrir o editor no diretório atual.

cloudshell workspace .

Exemplo: (os nomes dos seus projetos serão diferentes nos seus URLs)

  ...

  <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>

Fazer upload do pacote Java para o Artifact Registry

Com o Artifact Registry configurado no Maven, agora você pode usar o Artifact Registry para armazenar jars Java para que outros projetos na sua organização os usem.

Execute o comando a seguir para fazer upload do pacote Java no Artifact Registry:

mvn deploy -DskipTests

Se quiser executar esse comando de novo, aumente a versão no pom.xml.

Verificar o pacote Java no Artifact Registry

Acesse Console do Cloud > Artifact Registry > Repositórios. Clique em container-dev-java-repo e verifique se o artefato binário hello-world está lá:

147eac5168648db1.png

3. Repositórios remotos

Os repositórios remotos permitem armazenar em cache pacotes de terceiros para aumentar a confiabilidade e a segurança.

Criar um repositório remoto

Observação: para detalhes sobre autenticação e configuração, consulte a documentação do produto.

No Cloud Shell, execute o comando a seguir para criar um repositório remoto para artefatos do 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

Analise o repositório no console

Acesse Console do Cloud > Artifact Registry > Repositórios. Clique em maven-central-cache e observe que ele foi criado e está vazio no momento.

Analise o repositório no terminal

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

Integrar o repositório ao seu projeto

Execute o comando a seguir para mostrar a configuração do repositório para adicioná-la ao seu projeto Java.

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

Adicione a seção do repositório ao seu pom.xml. Não copie a tag externa <repositories> da saída.

Mude o ID do repositório recém-adicionado para "central" para garantir que cada entrada de repositório tenha um ID exclusivo.

Exemplo: (os nomes dos seus projetos serão diferentes nos seus URLs)

  ...

  <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>

Execute os comandos a seguir no terminal para criar um extensions.xml para seu projeto. Use o mecanismo de extensões principais para garantir que o Maven possa resolver dependências de plug-ins ou principais do 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/c>ore<-extensio>ns-1.<0.0.xsd>"
  extension
    groupIdcom<.google.>cloud<.artifactr>egistry/groupId
    artifact<Idartifactr>egist<ry-mave>n-wag<on/artif>act<Id
    ver>s<ion2.2.0/ve>rsion
  /extension
/extensions
EOF

Extrair dependências do repositório remoto

Execute o comando a seguir para compilar o aplicativo usando o repositório remoto:

rm -rf ~/.m2/repository 
mvn compile

Revise os pacotes no console

Acesse console do Cloud > Artifact Registry > Repositórios. Clique em maven-central-cache e verifique se os artefatos binários estão armazenados em cache lá:

9deea93caa5fefd7.png

4. Repositórios virtuais

Os repositórios virtuais atuam como uma interface para que vários repositórios sejam acessados por meio de uma única configuração. Isso simplifica a configuração do cliente para os consumidores dos seus artefatos e aumenta a segurança ao mitigar ataques de confusão de dependências.

Criar um arquivo de política

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

Criar o repositório virtual

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

Integrar o repositório ao seu projeto

Execute o comando a seguir para mostrar a configuração do repositório para adicioná-la ao seu projeto Java.

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

Substitua toda a seção de repositórios no seu pom pela seção de repositórios virtuais da saída.

Exemplo: (os nomes dos seus projetos serão diferentes nos seus URLs)

  ...


  <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>


Extrair dependências do repositório virtual

Como o repositório virtual é uma passagem e não armazena nenhum pacote real, para demonstrar claramente o processo, você vai excluir o repositório maven-central-cache que criou anteriormente e recriá-lo para começar novamente com um repositório vazio

Execute os comandos a seguir para recriar o repositório de 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

Você pode revisar o repositório vazio no console. Acesse Console do Cloud > Artifact Registry > Repositórios.

Agora, exercite o repositório virtual criando seu projeto com o seguinte comando:

rm -rf ~/.m2/repository 
mvn compile

Revise os pacotes no console

Acesse Console do Cloud > Artifact Registry > Repositórios. Clique em maven-central-cache e verifique se os artefatos binários foram configurados para serem extraídos do repositório virtual, mas foram extraídos do maven-central-cache:

9deea93caa5fefd7.png

5. Parabéns!

Parabéns, você concluiu o codelab.

Conteúdo abordado

  • Usar repositórios padrão para implantar seus pacotes particulares
  • Usar repositórios remotos para armazenar em cache pacotes centrais do Maven
  • Usar repositórios virtuais para combinar vários repositórios upstream em uma configuração

Limpeza

Execute o comando a seguir para excluir o projeto:

gcloud projects delete ${PROJECT_ID}

Última atualização: 22/03/23