1. 概览
借助 Artifact Registry,您可以存储不同的制品类型;在单个项目中创建多个制品库,并将某个特定区域或多区域位置与每个制品库相关联。制品库模式有多种。每种模式用途不同。下图展示了在不同模式下组合使用多个制品库的其中一种可行方案。该图显示了跨两个 Google Cloud 项目的工作流。在开发项目中,开发者构建了一个 Java 应用。在一个单独的运行时项目中,另一个构建会创建一个包含该应用的容器映像,以便部署到 Google Kubernetes Engine。

在本实验中,您将学习如何执行以下任务。
- 使用标准制品库部署私有软件包
- 使用远程制品库缓存 Maven Central 软件包
- 使用虚拟制品库在一个配置中合并多个上游制品库
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。



- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时更新。
- 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用
PROJECT_ID标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。 - 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除整个项目。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
Workspace 设置
设置 gcloud
在 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)')
启用 API
gcloud services enable artifactregistry.googleapis.com
克隆代码库
git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/container-registry/container-analysis
2. 标准代码库
标准制品库提供了一种存储专用软件包并在其他应用中共享这些软件包的方式
创建标准 Maven 制品库
在 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 - 代码库,您会看到新创建的 Maven 制品库 container-dev-java-repo。点击该制品库,您会发现目前是空的。
gcloud artifacts repositories describe container-dev-java-repo \
--location=us-central1
应返回类似如下所示的响应
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'
为 Artifact Registry 配置 Maven
运行以下命令,输出要添加到 Java 项目的制品库配置。
gcloud artifacts print-settings mvn \
--repository=container-dev-java-repo \
--location=us-central1
上述命令会返回要添加到项目 pom.xml 中的 xml。
- repositories 部分用于指定 Maven 可以从何处下载远程制品以供当前项目使用。
- distributionManagement 部分用于指定项目在部署时将推送到哪个远程制品库。
- extensions 部分添加了 artifactregistry-maven-wagon,用于启用连接到 Artifact Registry 所需的身份验证和传输层
- 注意:Extensions(扩展程序)可以存在于 pom.xml 或 extensions.xml 中。如果项目依赖于父项目,则在加载 pom.xml 中的其余条目之前,系统会先访问这些依赖项。为确保父项目有权访问扩展程序,可将扩展程序放置在 extensions.xml 文件中,该文件会在 pom.xml 之前加载,从而使其可供父级依赖项使用。
复制这三个部分,然后在 Cloud Shell 编辑器中打开 pom.xml,并将返回的设置添加到文件底部,刚好在 project 结束标记之前。
提示:在 Cloud Shell 中,在终端中运行以下命令,以在当前目录中打开编辑器。
cloudshell workspace .
示例:(您的网址中的项目名称会有所不同)
...
<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>
将 Java 软件包上传到 Artifact Registry
在 Maven 中配置 Artifact Registry 后,您现在可以使用 Artifact Registry 存储 Java jar 文件,供组织中的其他项目使用。
运行以下命令,将 Java 软件包上传到 Artifact Registry:
mvn deploy -DskipTests
如果您想再次运行此命令,请务必提升 pom.xml 中的版本。
检查 Artifact Registry 中的 Java 软件包
前往 Cloud 控制台 - Artifact Registry - 制品库,点击进入 container-dev-java-repo,检查 hello-world 二进制制品是否已存在:

3. 远程代码库
远程制品库可用于缓存第三方软件包,以提高可靠性和安全性。
创建远程代码库
注意:如需详细了解身份验证和配置,请参阅产品文档。
在 Cloud Shell 中运行以下命令,为 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
在控制台中查看制品库
前往 Cloud 控制台 - Artifact Registry - 制品库 点击进入 maven-central-cache,您会发现它已创建,但目前为空
在终端中查看制品库
gcloud artifacts repositories describe maven-central-cache \
--location=us-central1
将代码库集成到您的项目中
运行以下命令,输出要添加到 Java 项目的制品库配置。
gcloud artifacts print-settings mvn \
--repository=maven-central-cache \
--location=us-central1
将制品库部分添加到您的 pom.xml 中。确保不要复制输出中的外层 <repositories> 标记。
将新添加的制品库的 ID 更改为“central”,以确保每个制品库条目都有唯一的 ID。
示例:(您的网址中的项目名称会有所不同)
...
<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>
在终端中运行以下命令,为项目创建 extensions.xml,以使用核心扩展程序机制,确保 Maven 能够解析来自 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
从远程制品库拉取依赖项
运行以下命令,使用远程制品库编译应用:
rm -rf ~/.m2/repository
mvn compile
在控制台中查看软件包
前往 Cloud 控制台 - Artifact Registry - 制品库,点击 maven-central-cache,确认二进制制品缓存在该处:

4. 虚拟制品库
虚拟制品库起着接口作用,以便通过单个配置访问多个制品库。这可简化制品使用者的客户端配置,并通过缓解依赖项混淆攻击来提高安全性。
创建政策文件
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
创建虚拟制品库
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
将代码库集成到您的项目中
运行以下命令,输出要添加到 Java 项目的制品库配置。
gcloud artifacts print-settings mvn \
--repository=virtual-maven-repo \
--location=us-central1
将 pom 中的整个 repositories 部分替换为输出中的一个虚拟制品库部分。
示例:(您的网址中的项目名称会有所不同)
...
<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>
从虚拟制品库拉取依赖项
由于虚拟制品库只是直通通道,并不存储任何实际软件包,为了清楚地演示该流程,您将删除之前创建的 maven-central-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
您可以在控制台中查看空制品库。前往 Cloud 控制台 - Artifact Registry - 制品库
现在,运行以下命令来构建项目,以练习使用虚拟制品库
rm -rf ~/.m2/repository
mvn compile
在控制台中查看软件包
前往 Cloud 控制台 - Artifact Registry - 制品库,点击 maven-central-cache,确认二进制制品配置为从虚拟制品库拉取,但最终是从 maven-central-cache 拉取:

5. 恭喜!
恭喜,您已完成此 Codelab!
所学内容
- 使用标准制品库部署私有软件包
- 使用远程制品库缓存 Maven Central 软件包
- 使用虚拟制品库在一个配置中合并多个上游制品库
清理
运行以下命令以删除项目
gcloud projects delete ${PROJECT_ID}
—
上次更新时间:2023 年 3 月 22 日