GSP1076

概览
作为 Container Registry 的下一代产品,Artifact Registry 让组织可以在一个位置管理容器映像及语言包(如 Maven 和 npm)。该产品可与 Google Cloud 的工具和运行时环境完全集成,并支持原生工件协议。因此,您可以轻松地将其与 CI/CD 工具集成,以设置自动化流水线。
在本实验中,您将了解 Artifact Registry 中提供的一些功能。
目标
在本实验中,您将学习如何完成以下操作:
- 为容器和语言软件包创建仓库
- 使用 Artifact Registry 管理容器映像
- 将 Artifact Registry 与 Cloud Code 集成
- 配置 Maven 以使用 Artifact Registry 获取 Java 依赖项
设置和要求
点击“开始实验”按钮前的注意事项
请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。
此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。
为完成此实验,您需要:
- 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。
如何开始实验并登录 Google Cloud 控制台
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。左侧是“实验详细信息”窗格,其中包含以下各项:
- “打开 Google Cloud 控制台”按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示“登录”页面。
提示:将这些标签页安排在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在“实验详细信息”窗格中找到“用户名”。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在“实验详细信息”窗格中找到“密码”。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。
激活 Cloud Shell
Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。
-
点击 Google Cloud 控制台顶部的激活 Cloud Shell
。
-
在弹出的窗口中执行以下操作:
- 继续完成 Cloud Shell 信息窗口中的设置。
- 授权 Cloud Shell 使用您的凭据进行 Google Cloud API 调用。
如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 Project_ID 。输出内容中有一行说明了此会话的 Project_ID:
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud 是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
- 点击授权。
输出:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (可选)您可以通过此命令列出项目 ID:
gcloud config list project
输出:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注意:如需查看在 Google Cloud 中使用 gcloud 的完整文档,请参阅 gcloud CLI 概览指南。
您必须等待实验预配完毕,然后才能对环境进行任何更改!当实验指示环境已准备就绪时,您就可以使用预配置的环境部分了。
任务 1. 准备实验环境
设置变量
- 在 Cloud Shell 中,设置您的项目 ID 和项目编号。将这两者保存为
PROJECT_ID 和 PROJECT_NUMBER 变量:
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION={{{ project_0.default_region }}}
gcloud config set compute/region $REGION
启用 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/
cd ~/cloud-code-samples
预配本实验中使用的基础设施
在本实验中,您将把代码部署到 Kubernetes Engine (GKE)。
gcloud container clusters create container-dev-cluster --zone={{{ project_0.default_zone | "ZONE" }}}
点击检查我的进度,验证已完成以下目标:
启用 Google 服务并创建 GKE 集群
任务 2. 使用容器映像
在 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=$REGION \
--description="Docker repository for Container Dev Workshop"
如果出现 Cloud Shell 授权提示,请点击授权。
- 在 Cloud 控制台中,前往 Artifact Registry > 代码库,并注意您新创建的 Docker 代码库,名为
container-dev-repo。点击该代码库,可以看到目前是空的。
点击检查我的进度,验证已完成以下目标:(验证可能需要一分钟的时间。如果您已成功完成,但系统未验证,请稍等片刻,然后重试。)
使用容器映像
配置 Docker 以向 Artifact Registry 进行身份验证
连接到 Artifact Registry 时,需要提供凭据才能授予访问权限。Docker 可以配置为无缝使用您的 gcloud 凭据,而无需设置单独的凭据。
- 在 Cloud Shell 中运行以下命令,将 Docker 配置为使用 Google Cloud CLI 对向 区域中的 Artifact Registry 发出的请求进行身份验证:
gcloud auth configure-docker {{{ project_0.default_region | "Filled in at lab start" }}}-docker.pkg.dev
- 该命令会提示您确认是否更改 Cloud Shell Docker 配置,请点击 ENTER。
探索示例应用
您克隆的 Git 代码库中提供了一个示例应用。
cd ~/cloud-code-samples/java/java-hello-world
该文件夹包含一个示例 Java 应用,用于渲染一个简单的网页:除了与本实验无关的各种文件外,它还包含 src 文件夹下的源代码,以及您将用于在本地构建容器映像的 Dockerfile。
构建容器映像
在 Artifact Registry 中存储容器映像之前,您需要先创建一个。
docker build -t {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/{{{ project_0.project_id | "PROJECT_ID" }}}/container-dev-repo/java-hello-world:tag1 .
将容器映像推送到 Artifact Registry
docker push {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/{{{ project_0.project_id | "PROJECT_ID" }}}/container-dev-repo/java-hello-world:tag1
查看 Artifact Registry 中的映像
-
在 Artifact Registry > 代码库中,点击 container-dev-repo 并检查 java-hello-world 映像是否在其中。
-
点击映像,并注意标记为 tag1 的映像。您可以看到漏洞扫描正在运行或已完成,并且可以看到检测到的漏洞数量。

点击漏洞数量,您将看到映像中检测到的漏洞列表,其中包含 CVE 公告名称和严重级别。点击列出的每个漏洞旁边的查看,了解更多详细信息:

任务 3. 与 Cloud Code 集成
在本部分中,您将结合使用 Artifact Registry Docker 映像代码库和 Cloud Code。
使用 Cloud Code 将应用部署到 GKE 集群
- 在
java-hello-world 文件夹中运行以下命令,打开 Cloud Shell 编辑器并将应用文件夹添加到此工作区:
cd ~/cloud-code-samples/
cloudshell workspace .
Cloud Shell 编辑器将打开,并在应用文件夹中显示资源管理器。
- 在左侧菜单中,选择 Cloud Code,然后展开 COMPUTE ENGINE 选项,点击选择项目,并选择实验说明中提供的项目 ID。

另外,展开 KUBERNETES 选项。您将能够看到集群正在加载。
等待片刻,直到您看到集群同时列在 KUBERNETES 和 COMPUTE ENGINE 下。
- 在接下来的步骤中,您需要输入 Artifact Registry 代码库位置。位置的格式为:
{{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/{{{ project_0.project_id | "PROJECT_ID" }}}/container-dev-repo
在 Cloud Shell 编辑器
中,点击 Navigation menu(导航菜单)> View > Command Palette...(视图 > 命令面板…),输入 Run on Kubernetes(在 Kubernetes 上运行),然后选择 Cloud Code: Run on Kubernetes(Cloud Code:在 Kubernetes 上运行)。

-
选择 cloud-code-samples/java/java-hello-world/skaffold.yaml,然后选择 dockerfile。
-
如果系统提示您选择上下文,请选择是以使用当前上下文。
-
在映像注册表的提示中,选择输入映像代码库的地址,输入您在下面找到的地址位置,然后按 Enter 键。

{{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/{{{ project_0.project_id | "PROJECT_ID" }}}/container-dev-repo
- 首次执行在 Kubernetes 上运行时,Cloud Code 会提示您输入目标映像代码库位置。提供后,代码库网址会存储在应用文件夹中创建的
.vscode/launch.json 文件中。
在输出窗格中,您会看到应用映像 java-hello-world 的构建已开始,该映像已上传到之前配置的 Artifact Registry 代码库。
- 在 Artifact Registry > 代码库中,点击
container-dev-repo,检查 java-hello-world 映像,并注意标记为 latest 的新映像。
查看已部署的应用
- 返回 Cloud Shell 编辑器。部署完成后,Skaffold/Cloud Code 将输出公开的网址,服务已转发到该网址,点击链接 - Follow link(点击链接):

在新浏览器窗口中,您会看到“Hello World”应用页面。

更新应用代码
现在更新应用,看看更改是否立即在集群上的部署中实现:
-
点击 Cloud Shell 编辑器中的
导航菜单,然后点击视图 > 命令面板…,打开 HelloWorldController.java,然后点击一次退格键,输入路径 src/main/java/cloudcode/helloworld/web,并点击以 Hello.. 开头的选项。
-
将第 20 行中的文本从“It's running!”(正在运行!)更改为“It's updated!”(已更新!)。您应该会看到构建和部署过程立即开始。
-
部署完成后,再次点击转发的网址,或刷新包含应用的浏览器窗口,以查看已部署的更改:

- 在 Cloud 控制台中,依次前往导航菜单 > Artifact Registry > 代码库,然后点击
container-dev-repo,检查 java-hello-world 映像并记下新映像。
点击检查我的进度,验证已完成以下目标:
与 Cloud Code 集成
任务 4. 使用语言包
在本部分中,您将设置 Artifact Registry Java 代码库并向其中上传软件包,然后在不同的应用中利用这些软件包。
创建 Java 软件包代码库
- 在 Cloud Shell 中运行以下命令,为 Java 工件创建一个仓库:
gcloud artifacts repositories create container-dev-java-repo \
--repository-format=maven \
--location={{{ project_0.default_region | "REGION" }}} \
--description="Java package repository for Container Dev Workshop"
-
如果出现 Cloud Shell 授权提示,请点击“授权”
-
在 Cloud 控制台中,前往 Artifact Registry > 代码库,您会看到新创建的 Maven 代码库 container-dev-java-repo。点击该代码库,您会发现目前是空的。
点击检查我的进度,验证已完成以下目标:
创建 Java 软件包代码库
设置对 Artifact Repository 的身份验证
- 使用以下命令,将应用默认凭据 (ADC) 的已知位置更新为您的用户账号凭据,以便 Artifact Registry 凭据帮助程序在连接到代码库时可以使用这些凭据进行身份验证:
gcloud auth login --update-adc
如果系统提示您进行身份验证:
- 选择 Y。
- 将代码粘贴到浏览器窗口中。
- 选择“Google 登录”,然后使用实验中提供的凭据登录。
- 将浏览器中的身份验证代码复制回控制台,以完成身份验证。
为 Artifact Registry 配置 Maven
- 运行以下命令来输出要添加到 Java 项目的代码库配置。
gcloud artifacts print-settings mvn \
--repository=container-dev-java-repo \
--location={{{ project_0.default_region | "REGION" }}}
- 在 Cloud Shell Editor 中打开
pom.xml,并将返回的设置添加到文件中的相应部分:
- 添加 distributionManagement 部分。
<distributionManagement>
<snapshotRepository>
<id>artifact-registry</id>
<url>artifactregistry://{{{ project_0.default_region | "REGION" }}}-maven.pkg.dev/{{{ project_0.project_id | "PROJECT_ID" }}}/container-dev-java-repo</url>
</snapshotRepository>
<repository>
<id>artifact-registry</id>
<url>artifactregistry://{{{ project_0.default_region | "REGION" }}}-maven.pkg.dev/{{{ project_0.project_id | "PROJECT_ID" }}}/container-dev-java-repo</url>
</repository>
</distributionManagement>
<repositories>
<repository>
<id>artifact-registry</id>
<url>artifactregistry://{{{ project_0.default_region | "REGION" }}}-maven.pkg.dev/{{{ project_0.project_id | "PROJECT_ID" }}}/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>
以下是完整文件的示例,供您参考。
<?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://{{{ project_0.default_region | "REGION" }}}-maven.pkg.dev/{{{ project_0.project_id | "PROJECT_ID" }}}/container-dev-java-repo</url>
</snapshotRepository>
<repository>
<id>artifact-registry</id>
<url>artifactregistry://{{{ project_0.default_region | "REGION" }}}-maven.pkg.dev/{{{ project_0.project_id | "PROJECT_ID" }}}/container-dev-java-repo</url>
</repository>
</distributionManagement>
<repositories>
<repository>
<id>artifact-registry</id>
<url>artifactregistry://{{{ project_0.default_region | "REGION" }}}-maven.pkg.dev/{{{ project_0.project_id | "PROJECT_ID" }}}/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-hello-world 文件夹。
cd ~/cloud-code-samples/java/java-hello-world
- 运行以下命令,将 Java 软件包上传到 Artifact Registry:
mvn deploy
检查 Artifact Registry 中的 Java 软件包
在 Cloud 控制台中,前往 Artifact Registry > 代码库,然后点击 container-dev-java-repo,检查 hello-world 二进制工件是否已存在:

恭喜!
在本实验中,您了解了 Artifact Registry 中提供的一些功能。您首先为容器和语言软件包创建了存储库。然后,您使用 Artifact Registry 管理容器映像,并将其与 Cloud Code 集成。最后,您配置了 Maven 以使用 Artifact Registry 来处理 Java 依赖项。现在,您已经对 Artifact Registry 中提供的功能有了扎实的了解。
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
上次更新手册的时间:2024 年 5 月 9 日
上次测试实验的时间:2024 年 5 月 9 日
版权所有 2026 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。