如何使用 googleapis Artifacts API 以编程方式查找和删除通过 Google Cloud Build 构建的容器映像?

Posted

技术标签:

【中文标题】如何使用 googleapis Artifacts API 以编程方式查找和删除通过 Google Cloud Build 构建的容器映像?【英文标题】:How do I programmatically find and delete a container image built through Google Cloud Build with the googleapis Artifacts API? 【发布时间】:2022-01-23 07:09:45 【问题描述】:

我的目标是找到并删除我之前通过 Google Cloud Build 构建的 Docker 容器映像(通过 Node googleapis 库,使用 Artifacts API)。我在构建容器时将信息传回给我,我想通过 Node googleapis 库将其删除。

Cloud Build 返回的镜像路径如下:“us-central1-docker.pkg.dev/project-1234/dev/foo:bar”

我尝试删除工件失败,如下所示:

const artifacts = artifactregistry( version: 'v1beta2', auth: authClient);
await artifacts.projects.locations.repositories.packages.delete(name: config.containerLocation)

这会导致错误:在此服务器上找不到请求的 URL /v1beta2/us-central1-docker.pkg.dev/project-1234/dev/foo:bar。 看起来好像我没有正确指定位置,但不清楚如何解决。

我应该如何删除图像?

【问题讨论】:

网址错误。但是,您没有发布足够的代码,并且您掩盖了太多变量以了解问题。 API 端点以 artifactregistry.googleapis.com/v1beta2 开头 我没有直接到达终点;如图所示,我正在使用 googleapis 节点库。我的代码没有被屏蔽;除了 config.container 有不同的项目、容器和标签名称。除了这些变量之外,CloudBuild 还提供了该格式的图像位置;并且应该可以使用 Artifacts API 以某种方式删除该图像。 @Aadmaa config.containerLocation 的值是多少?此外,我建议使用更新的 Artifact Registry 库,正如 Ricco 在他的回答中所展示的那样。 Cloud 客户端库是以编程方式访问 Cloud API 的现代标准。 谢谢唐纳德。该值是 Cloud Build 返回的映像位置值。这里是字符串:“us-central1-docker.pkg.dev/project-1234/dev/foo:bar” 【参考方案1】:

我能够使用 Artifact Registry Cloud 客户端库删除一个包,因为这是现在推荐的访问 API 的方法,因为它更易于使用且有据可查。见Cloud Client Library docs。

下面的代码展示了如何在 Artifact Registry 中删除一个包,前提是您已经知道要删除哪个包。这在namePackage 变量中定义,并传递给callDeletePackage(),后者将调用deletePackage() 继续删除。

const ArtifactRegistryClient = require('@google-cloud/artifact-registry');
        const client = new ArtifactRegistryClient();
async function main() 

        const projectId = 'project-id';
        const location = 'us-central1';
        const repositoryName = 'your-repository-name';
        const packageName = 'your-package-name';
        var namePackage = `projects/$projectId/locations/$location/repositories/$repositoryName/packages/$packageName`;
      
        callDeletePackage(namePackage);


async function callDeletePackage(name) 
        const deletePack = await client.deletePackage(name: name);
        console.log(deletePack);

main();

如果您需要以编程方式获取存储库和软件包,您可以查看此代码。它有listsRepositories()listsPackages()callDeletePackage()

listsRepositories() 列出了可用的仓库,你可以选择哪个仓库有要删除的包。 listsPackages() 列出所选存储库的包 callDeletePackage() 删除包。

下面的代码只获取存储库和包的返回列表中的第一个元素,然后删除。如何删除所需的包由您决定。

const ArtifactRegistryClient = require('@google-cloud/artifact-registry');
        const client = new ArtifactRegistryClient();
async function main() 

        const projectId = 'your-project-id';
        const location = 'us-central1';
        var parentRepo = `projects/$projectId/locations/$location`;

        names = await listsRepositories(parentRepo);
        var nameRepo = names[0];
        console.log(nameRepo);
        var repos = await listsPackages(nameRepo);
        console.log(repos[0])
        callDeletePackage(repos[0]);

async function listsRepositories(parent) 
        var nameArr = []
        const repositories = await client.listRepositories(parent : parent);
        const repo = repositories[0];
        for (const data in repo) 
                nameArr.push(repo[data].name);
        
        return nameArr;


async function listsPackages(parent) 
        var namePackArr = []
        const packages = await client.listPackages(parent : parent);
        const pack = packages[0];
        for (const data in pack) 
                namePackArr.push(pack[data].name);
        
        return namePackArr;


async function callDeletePackage(name) 
        const deletePack = await client.deletePackage(name: name);
        console.log(deletePack);


main();

【讨论】:

谢谢@Ricco。对于以后遵循此操作的任何人:(1)确保运行代码的服务帐户具有所需的工件角色(2)如果您需要通过 API 进行身份验证,并且您还按照建议从 googleapis 切换,您可能还必须从“google-auth-library”而不是从“googleapis”获取 GoogleAuth

以上是关于如何使用 googleapis Artifacts API 以编程方式查找和删除通过 Google Cloud Build 构建的容器映像?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PAT 从本地 Azure Artifacts 存储库在 docker 容器中安装 powershell 模块?

如何在 Android 中签署 AAR Artifacts?

如何使用 googleapis bigquery api 进行选择

IntelliJ-项目配置,解决no artifacts的warnings

使用 npm 包 googleapis 在对用户进行身份验证后如何获取用户的电子邮件地址?

intellij idea 中project structure 配置 的Artifacts配置 Webapplication:exploded 和 archive区别