通过 Artifact Registry 对客户端环境进行身份验证,您可以存储专用 Go 模块并将其作为构建依赖项提取。
身份验证选项
上传和下载软件包的身份验证设置有所不同。
上传身份验证
将 Go 模块打包并上传到 Artifact Registry 时,gcloud CLI 工具会在您的环境中查找凭据,以按以下顺序设置身份验证,除非传递了 --json_key 标志以使用服务账号密钥。
应用默认凭证 (ADC),一种按以下顺序查找凭证的策略:
在
GOOGLE_APPLICATION_CREDENTIALS环境变量中定义的凭据。Compute Engine、Google Kubernetes Engine、Cloud Run、App Engine 或 Cloud Run 函数的默认服务账号提供的凭证。
Google Cloud CLI 提供的凭据,包括来自命令
gcloud auth application-default login的用户凭据。
GOOGLE_APPLICATION_CREDENTIALS 变量使身份验证账号更加明确,从而更易于排查问题。如果您不使用该变量,请验证 ADC 可能使用的任何账号是否具有所需的权限。例如,Compute Engine 虚拟机、Google Kubernetes Engine 节点和 Cloud Run 修订版本的默认服务账号对代码库具有只读权限。如果您打算使用默认服务账号从这些环境上传,则必须修改权限。
下载时进行身份验证
从 Artifact Registry 下载打包的 Go 模块以用作依赖项时,Go 二进制文件会使用 netrc 文件中的凭据向 Artifact Registry 进行身份验证。为简化身份验证流程,您可以使用 Go 凭据帮助程序刷新 netrc 文件中的令牌,以便向 Artifact Registry 进行身份验证。
您可以使用 netrc 环境变量设置 netrc 文件的位置。
如果未设置 NETRC 变量,则 go 命令将在类 UNIX 平台上读取 $HOME/.netrc,或在 Windows 上读取 %USERPROFILE%\_netrc。
在 netrc 文件中使用凭证时,Artifact Registry 支持以下身份验证方法:
- 短期凭证(推荐)
- 使用 Artifact Registry Go 凭证帮助程序工具,通过环境中的凭证更新 netrc 文件中的身份验证令牌,或手动将 Artifact Registry 凭证添加到 netrc 文件中。
- 使用服务账号密钥
- 当您无法在环境中使用凭据进行身份验证时,请使用此选项。您可以使用 Artifact Registry Go 凭证帮助程序工具将未加密的服务账号密钥添加到 netrc 文件中,也可以手动将其添加到该文件中。
准备工作
- 安装 Go 1.15 或更高版本。
安装 package-go-module gcloud CLI 插件:
gcloud components install package-go-module
设置 Go 环境
指示 Go 按以下顺序从 Artifact Registry、公共 Go 模块代理和源代码下载模块:
export GOPROXY=https://LOCATION-go.pkg.dev/PROJECT/REPOSITORY,https://proxy.golang.org,direct
替换以下内容:
使用公共校验和数据库排除您的模块,不对其进行检查:
export GONOSUMDB=MODULE_PATH_REGEX
将 MODULE_PATH_REGEX 替换为您的模块路径,或者如果您要排除多个模块,请将其替换为正则表达式。
例如,如需使用公共校验和数据库排除模块
example.com/foo,不对其进行检查,请运行以下命令:export GONOSUMDB=example.com/foo
以下命令会排除模块路径以
example.com开头的所有模块,不对其使用公共校验和数据库进行检查:export GONOSUMDB=example.com/*
将 Artifact Registry 凭证添加到 netrc 文件中
运行以下命令,使用 Go 凭证帮助程序将您的 Artifact Registry 凭证添加到 netrc 文件中:
GOPROXY=proxy.golang.org \ go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.4.0 \ add-locations --locations=LOCATION \ --json_key=PATH_TO_JSON_KEY其中:
- LOCATION 是代码库的区域或多区域位置。如需添加多个位置,请以英文逗号分隔列表的形式输入。
PATH_TO_JSON_KEY(可选)。服务账号密钥的路径。
Go 凭证帮助程序会向 netrc 文件添加设置,以便向 Artifact Registry 进行身份验证。如果您传递
--json_key标志,则密钥会添加到 netrc 文件中,以进行密码身份验证。
如果您使用短期凭据向 Artifact Registry 进行身份验证,则需要先运行以下命令刷新 OAuth 令牌,然后才能将模块用作依赖项:
GOPROXY=proxy.golang.org \ go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.4.0 refresh
使用服务账号密钥进行身份验证
当您需要使用用户名和密码进行身份验证时,请使用此方法。
服务账号密钥是长期有效的凭据。请使用以下准则来限制对代码库的访问:
- 请考虑使用专用服务账号与代码库进行交互。
- 授予服务账号所需的最低 Artifact Registry 角色。例如,将 Artifact Registry Reader 分配给仅用于下载工件的服务账号。
- 如果您组织中的群组需要不同级层的访问权限来访问特定代码库,请在代码库级层而不是项目级层授予访问权限。
- 按照管理凭据的最佳做法操作。
如需配置身份验证,请执行以下操作:
创建一个服务账号代表您的应用执行操作,或选择一个现有服务账号用于进行自动化。
您需要服务账号密钥文件所在的位置,才能使用 Artifact Registry 设置身份验证。对于现有账号,您可以在“服务账号”页面上查看密钥和创建新密钥。
向服务账号授予适当的 Artifact Registry 角色,以提供代码库访问权限。
运行以下命令,使用 Go 凭证帮助程序将服务账号凭证添加到 netrc 文件中:
GOPROXY=proxy.golang.org \ go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.4.0 \ add-locations --locations=LOCATION \ --json_key=PATH_TO_JSON_KEY其中:
您也可以采用以下格式手动将服务账号密钥添加到 netrc 文件中:
machine LOCATION.pkg.dev
login _json_key_base64
password KEY
替换以下内容:
- 将 LOCATION 替换为代码库的单区域或多区域位置。
- 将 KEY 替换为服务账号密钥文件中的 base64 编码密钥。
将 Go 凭证帮助程序添加到 GONOPROXY
在使用 Go 凭据辅助程序之前,您需要将其添加到 GONOPROXY 列表中,以强制 Go 直接从 GitHub 下载。如果您有其他想要直接从源代码下载的模块,可以将其添加到以英文逗号分隔的列表中,如以下示例所示:
export GONOPROXY=MODULE_PATH1, MODULE_PATH2
其中,MODULE_PATH1 和 MODULE_PATH2 是要从源代码下载的模块的模块路径。
如需将 Go 凭证帮助程序添加到 GONOPROXY 列表并运行它以设置凭证,请执行以下操作:
将 Go 凭证帮助程序添加到
GONOPROXYexport GONOPROXY=github.com/GoogleCloudPlatform/artifact-registry-go-tools
运行以下命令,使用 Go 模块软件包工具将您的 Artifact Registry 凭证添加到 netrc 文件中:
GOPROXY=proxy.golang.org \ go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.4.0 \ add-locations --locations=LOCATION \ [--json_key=path/to/service/account/key.json]其中,LOCATION 是代码库的单区域或多区域位置。如需添加多个位置,请以英文逗号分隔列表的形式输入。
Go 凭证帮助程序会向 netrc 文件添加设置,以便向 Artifact Registry 进行身份验证。如果您传递
--json_key标志,则密钥会添加到 netrc 文件中,以进行密码身份验证。