深入了解 Artifact Registry

1. 概览

作为 Container Registry 的下一代产品,Artifact Registry 让组织可以在一个位置管理容器映像及语言软件包(如 Maven 和 npm)。该产品可与 Google Cloud 的工具和运行时环境完全集成,并支持基于语言的依赖项管理,可与 npm 和 Maven 等工具搭配使用。因此,您可以轻松地将其与 CI/CD 工具集成,以便设置自动化流水线。

本实验将向您介绍 Artifact Registry 中提供的一些功能。

学习内容

本实验的学习目标是什么?

  • 为容器和语言软件包创建代码库
  • 使用 Artifact Registry 管理容器映像
  • 将 Artifact Registry 与 Cloud Code 集成
  • 配置 Maven 以使用 Artifact Registry 存储 Java 依赖项

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为 PROJECT_ID),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。
  • 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

设置 gcloud

在 Cloud Shell 中,设置您的项目 ID 和项目编号。将它们保存为 PROJECT_IDPROJECT_NUMBER 变量。

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

启用 Google 服务

gcloud services enable \
  cloudresourcemanager.googleapis.com \
  container.googleapis.com \
  artifactregistry.googleapis.com \
  containerregistry.googleapis.com \
  containerscanning.googleapis.com

获取源代码

本实验的源代码位于 GitHub 上的 GoogleCloudPlatform 组织中。使用以下命令克隆该项目,然后切换到该目录。

git clone https://github.com/GoogleCloudPlatform/cloud-code-samples/

预配本实验中使用的基础架构

在本实验中,您将将代码部署到 GKE。以下设置脚本会为您准备此基础架构。

gcloud container clusters create container-dev-cluster --zone=us-central1-b

3. 使用容器映像

在 Artifact Registry 上创建 Docker 代码库

Artifact Registry 支持管理容器映像和语言包。不同的工件类型需要不同的规范。例如,Maven 依赖项的请求与 Node 依赖项的请求不同。

为了支持不同的 API 规范,Artifact Registry 需要知道您希望 API 响应采用什么格式。为此,您需要创建一个代码库,并传入 --repository-format 标志,指明所需的代码库类型

在 Cloud Shell 中,运行以下命令以创建 Docker 映像的代码库:

gcloud artifacts repositories create container-dev-repo --repository-format=docker \
--location=us-central1 --description="Docker repository for Container Dev Workshop"

如果出现 Cloud Shell 授权提示,请点击“授权”

前往 Google Cloud 控制台 - Artifact Registry - Repositories,然后找到您新创建的名为 container-dev-repo 的 Docker 代码库,如果您点击该代码库,会发现它目前是空的

配置向 Artifact Registry 的 Docker 身份验证

连接到 Artifact Registry 时,必须提供凭据才能获得访问权限。您可以将 Docker 配置为无缝使用您的 gcloud 凭据,而无需设置单独的凭据。

在 Cloud Shell 中,运行以下命令将 Docker 配置为使用 Google Cloud CLI 对 us-central1 区域中的 Artifact Registry 发出的请求进行身份验证,

gcloud auth configure-docker us-central1-docker.pkg.dev

该命令会提示您确认是否要更改 Cloud Shell Docker 配置,请按 Enter 键。

探索示例应用

您在之前步骤中克隆的 Git 代码库中提供了一个示例应用。切换到 java 目录并查看应用代码。

cd cloud-code-samples/java/java-hello-world

该文件夹包含一个用于呈现简单网页的 Java 示例应用:除了与本实验无关的各种文件之外,它还包含 src 文件夹下的源代码,以及我们将用于在本地构建容器映像的 Dockerfile。

构建容器映像

您需要先创建一个仓库,然后才能在 Artifact Registry 中存储容器映像。

运行以下命令以构建容器映像,并正确标记该映像,以在下一步中将其推送到您的代码库:

docker build -t us-central1-docker.pkg.dev/$PROJECT_ID/container-dev-repo/java-hello-world:tag1 .

将容器映像推送到 Artifact Registry

运行以下命令,将容器映像推送到之前创建的代码库:

docker push us-central1-docker.pkg.dev/$PROJECT_ID/container-dev-repo/java-hello-world:tag1

在 Artifact Registry 中查看映像

前往 Google Cloud 控制台 - Artifact Registry - 制品库. 点击 container-dev-repo,检查是否有 java-hello-world 映像。点击该图片,并记下标记为 tag1 的图片。您可以看到漏洞扫描正在运行或已完成,以及检测到的漏洞数量。

9cb46d3689b3ed2.png

点击漏洞数量,您会看到在映像中检测到的漏洞列表,其中包含 CVE 公告名称和严重程度。您可以点击每个列出的漏洞旁边的“查看”以了解更多详情:

2b17e9d26d9dd7ea.png

4. 与 Cloud Code 集成

在本部分中,您将了解如何将 Artifact Registry Docker 映像仓库与 Cloud Code 搭配使用。

通过 Cloud Code 将应用部署到 GKE 集群

java-hello-world 文件夹中运行以下命令,以打开 Cloud Shell Editor 并将应用文件夹添加到其工作区:

cloudshell workspace .

Cloud Shell 编辑器将打开,其中包含应用文件夹中的资源管理器。

如果系统弹出一个窗口,要求您从工作区中排除 Java 项目设置文件,请点击 Exclude in workspace

以下步骤要求您输入 Artifact Registry 代码库位置。位置的格式为:

us-central1-docker.pkg.dev/<PROJECT_ID>/container-dev-repo

如需查找您的 PROJECT_ID,请在终端中运行以下命令

gcloud config get project

点击 Cloud Code 状态栏(位于左下角),然后选择 Run on Kubernetes

e6e2b06467228e18.png

出现提示时,选择 Yes 以使用指向为实验预配的 container-dev-cluster GKE 集群的 kubeconfig 中的当前上下文

在映像注册库的提示中,输入您找到的地址位置,然后务必将 <PROJECT_ID> 替换为实际值

us-central1-docker.pkg.dev/<PROJECT_ID>/container-dev-repo

当您首次执行“在 Kubernetes 上运行”时,Cloud Code 会提示您输入目标映像代码库位置。提供代码库网址后,该网址会存储在在应用文件夹中创建的 .vscode/launch.json 文件中。

在输出窗格中,您会看到应用映像 java-hello-world, 开始构建,该映像已上传到之前配置的 Artifact Registry 代码库

转到 Cloud 控制台 - Artifact Registry - 代码库,点击 container-dev-repo,检查 java-hello-world 映像并记下标记为 latest 的新映像

查看已部署的应用

返回 Cloud Shell 编辑器:部署完成后,Skaffold/Cloud Code 会输出已转发服务的公开网址,点击“打开 Web 预览”链接:

33257a43826b88ff.png

在新浏览器窗口中,您会看到 hello world 应用页面

d3e49693b0383a5d.png

更新应用代码

现在,更新应用以查看在集群的部署中立即实施的更改:

在 Cloud Shell Editor 中打开 src/main/java/cloudcode/helloworld/web 文件夹中的 HelloWorldController.java

将第 20 行中的文本从“It's running!”更改为“It's updated!”,您应该会看到构建和部署流程立即开始。

部署完成后,再次点击转发的网址或刷新包含应用的浏览器窗口,即可查看所部署的更改:

41787b1da54ff137.png

再次前往 Cloud 控制台 - Artifact Registry - 代码库 点击 container-dev-repo,检查 java-hello-world 映像并记下新映像

5. 使用语言包

在本部分中,您将了解如何设置 Artifact Registry Java 代码库,并将软件包上传到该代码库,以便在不同的应用中使用它们。

创建 Java 软件包代码库

在 Cloud Shell 中,运行以下命令以创建 Java 工件仓库:

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

如果系统显示 Cloud Shell 授权提示,请点击“授权”

前往 Google Cloud 控制台 - Artifact Registry - Repositories,然后找到名为 container-dev-java-repo 的新建 Maven 代码库。如果您点击该代码库,会发现它目前是空的。

设置对工件代码库的身份验证

使用以下命令将应用默认凭据 (ADC) 的众所周知位置更新为您的用户账号凭据,以便 Artifact Registry 凭据帮助程序在与代码库连接时使用这些凭据进行身份验证:

gcloud auth login --update-adc

为 Artifact Registry 配置 Maven

运行以下命令来输出要添加到 Java 项目的代码库配置:

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

在 Cloud Shell 编辑器中打开 pom.xml,然后将返回的设置添加到文件中的相应部分,

更新 distributionManagement 部分

<distributionManagement>
   <snapshotRepository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
   </snapshotRepository>
   <repository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
   </repository>
</distributionManagement>

更新 repositories 部分

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

更新扩展程序

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

以下是完整文件的示例,供您参考。请务必将 <PROJECT> 替换为您的项目 ID。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 
 <artifactId>hello-world</artifactId>
 <packaging>jar</packaging>
 <name>Cloud Code Hello World</name>
 <description>Getting started with Cloud Code</description>
 <version>1.0.0</version>
<distributionManagement>
   <snapshotRepository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
   </snapshotRepository>
   <repository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
   </repository>
 </distributionManagement>
 
 <repositories>
   <repository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
     <releases>
       <enabled>true</enabled>
     </releases>
     <snapshots>
       <enabled>true</enabled>
     </snapshots>
   </repository>
 </repositories>
 
 <parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.6.3</version>
 </parent>
 
 <properties>
   <java.version>1.8</java.version>
   <checkstyle.config.location>./checkstyle.xml</checkstyle.config.location>
 </properties>
 
 <build>
   <plugins>
     <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>jib-maven-plugin</artifactId>
       <version>3.2.0</version>
     </plugin>
     <plugin>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-maven-plugin</artifactId>
     </plugin>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-checkstyle-plugin</artifactId>
       <version>3.1.2</version>
     </plugin>
   </plugins>
   <extensions>
     <extension>
       <groupId>com.google.cloud.artifactregistry</groupId>
       <artifactId>artifactregistry-maven-wagon</artifactId>
       <version>2.1.0</version>
     </extension>
   </extensions>
 </build>
 
 <!-- The Spring Cloud GCP BOM will manage spring-cloud-gcp version numbers for you. -->
 <dependencyManagement>
   <dependencies>
     <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-gcp-dependencies</artifactId>
       <version>1.2.8.RELEASE</version>
       <type>pom</type>
       <scope>import</scope>
     </dependency>
   </dependencies>
 </dependencyManagement>
  
 <dependencies>
 
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter</artifactId>
   </dependency>
 
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-jetty</artifactId>
   </dependency>
 
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
   </dependency>
 
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-thymeleaf</artifactId>
   </dependency>
 
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
   </dependency>
 
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-gcp-starter-logging</artifactId>
   </dependency>
      
 </dependencies>
 
</project>

将 Java 软件包上传到 Artifact Registry

在 Maven 中配置 Artifact Registry 后,您现在可以使用 Artifact Registry 存储 Java Jar,以供贵组织中的其他项目使用。

运行以下命令将 Java 软件包上传到 Artifact Registry:

mvn deploy

在 Artifact Registry 中查看 Java 软件包

依次前往 Cloud 控制台 - Artifact Registry - 代码库。点击 container-dev-java-repo,检查是否存在 hello-world 二进制工件:

e348d976ac1ac107.png

6. 恭喜!

恭喜,您已完成此 Codelab!

您学习了以下内容

  • 为容器和语言软件包创建了代码库
  • 使用 Artifact Registry 的代管式容器映像
  • 将 Artifact Registry 与 Cloud Code 集成
  • 配置 Maven 以使用 Artifact Registry 存储 Java 依赖项

清理

运行以下命令以删除项目

gcloud projects delete $PROJECT_ID