删除在Github Package Registry上推送的图像的方法

下结论

如果我先从结论开始写的话,在公共仓库的情况下,我无法自己删除已经推送的图像!如果非常必要,似乎只能通过填写这里提供的表格联系管理员请他们帮忙…

スクリーンショット 2019-10-30 15.19.01.png

开端

Github包注册根本不知不觉就能用了,我立马把随意的镜像上传试试!

上传成功了!
嗯?ansible?

スクリーンショット 2019-10-22 16.37.31.png

啊啊…啊啊啊,我发现有个打字错误!!
先删除它吧!可是怎么删除呢?我想删除,但是怎么找不到删除选项呢?在Docker的子命令里也没有类似的选项,怎么办?所以我开始查找,结果发现这个问题意外地麻烦。

在 GraphQL 上的努力之旅…

首先,可以使用 GitHub GraphQL 的 deletePackageVersion 变异来删除 API。

然而因为不知道该如何实施它,所以我在Google上搜索…然后在查阅文档中的输入和返回字段规范的同时,我发现应该发出以下类似的查询。

curl -sL -XPOST https://api.github.com/graphql \
  -H "Authorization: bearer $TOKEN" \
  -H 'Accept: application/vnd.github.package-deletes-preview+json' \
  -d '{"query":"mutation{deletePackageVersion(input:{clientMutationId: \"1\",packageVersionId:\"XXXXX\"}){clientMutationId,success}}"}'

由于不太明白,我来写出来,POST的JSON查询以及GraphQL和响应如下。
我不太清楚要指定什么样的输入值,所以我随便输入了一些值,结果被批评了一番。顺便提一下,clientMutationId应该是任何值都可以(可能是传递给请求和响应的用于唯一标识用户的值),但是我并不了解应该指定什么样的值给packageVersionId……暂时先随便试一下。

mutation {
  deletePackageVersion(
    input:{
      clientMutationId: "1",
      packageVersionId: "XXXXX"
    }
  )
  {
    clientMutationId,
    success
  }
}

GraphQL查询响应的示例。

{
  "data": {
    "deletePackageVersion": null
  },
  "errors": [
    {
      "type": "NOT_FOUND",
      "path": [
        "deletePackageVersion"
      ],
      "locations": [
        {
          "line": 1,
          "column": 10
        }
      ],
      "message": "Could not resolve to a node with the global id of 'XXXXX'"
    }
  ]
}

就先不管那個難以理解的信息,再次考慮packageVersionId。我先試試latest、ansibke:latest還有kawaz/docker-ansible/ansibke:latest這些值,但都返回404……。
再次查看關於packageVersionId的文檔,發現它是一個Base64編碼的獨特值。明白了,這東西我不懂。或者我們應該先送一個GET請求去尋找內部ID之類的,然後找到相應的API來獲取包列表。所以我開始尋找能夠獲取包列表的API。

边阅读文档和尝试API,我终于搞明白了…嘿,GraphQL真是够复杂的啊。要想获取想要的字段,必须一个个查找并列举出来,太麻烦了…于是我就放弃了。

curl -sL -X POST https://api.github.com/graphql \
  -H "Authorization: bearer $TOKEN" \
  -d '{"query":"query{repository(owner:\"kawaz\",name:\"docker-ansible\"){registryPackages(first:10){nodes{packageType,registryPackageType,name,nameWithOwner,
id,versions(first:10){nodes{id,version,readme}}}}}}"}'
query {
  repository(owner:"kawaz", name:"docker-ansible") {
    registryPackages(first:10) {
      nodes {
        packageType,
        registryPackageType,
        name,
        nameWithOwner,
        id,
        versions(first:10) {
          nodes{
            id,
            version,
            readme
          }
        }
      }
    }
  }
}

GraphQL查询的响应。

{
  "data": {
    "repository": {
      "registryPackages": {
        "nodes": [
          {
            "packageType": "DOCKER",
            "registryPackageType": "docker",
            "name": "ansibke",
            "nameWithOwner": "kawaz/ansibke",
            "id": "MDE1OlJlZ2lzdHJ5UGFja2FnZTQxNDM3",
            "versions": {
              "nodes": [
                {
                  "id": "MDIyOlJlZ2lzdHJ5UGFja2FnZVZlcnNpb24xNzc3MTY=",
                  "version": "docker-base-layer",
                  "readme": "あああ。。。イメージ名 typo しとる…。"
                }
              ]
            }
          },
          {
            "packageType": "DOCKER",
            "registryPackageType": "docker",
            "name": "ansible",
            "nameWithOwner": "kawaz/ansible",
            "id": "MDE1OlJlZ2lzdHJ5UGFja2FnZTQxNDQw",
            "versions": {
              "nodes": [
                {
                  "id": "MDIyOlJlZ2lzdHJ5UGFja2FnZVZlcnNpb24xNzc3MzA=",
                  "version": "latest",
                  "readme": null
                },
                {
                  "id": "MDIyOlJlZ2lzdHJ5UGFja2FnZVZlcnNpb24xNzc3Mjk=",
                  "version": "2.8.4",
                  "readme": null
                },
                {
                  "id": "MDIyOlJlZ2lzdHJ5UGFja2FnZVZlcnNpb24xNzc3Mjc=",
                  "version": "docker-base-layer",
                  "readme": null
                }
              ]
            }
          }
        ]
      }
    }
  }
}

啊啦啦,GraphQL真让人烦啊!!不过终于出现了我想要的类似ID的东西。那就尝试把它用在第一个删除查询中吧!

curl -sL -XPOST https://api.github.com/graphql \
  -H "Authorization: bearer $TOKEN" \
  -H 'Accept: application/vnd.github.package-deletes-preview+json' \
  -d '{"query":"mutation{deletePackageVersion(input:{clientMutationId: \"1\",packageVersionId:\"MDIyOlJlZ2lzdHJ5UGFja2FnZVZlcnNpb24xNzc3MTY=\"}){clientMutationId,success}}"}'

所以,最终删除查询的响应形式发生了变化!这是一个胜利的机会吗??? 啊啊啊啊啊啊啊啊。

{
  "data": {
    "deletePackageVersion": null
  },
  "errors": [
    {
      "type": "UNPROCESSABLE",
      "path": [
        "deletePackageVersion"
      ],
      "locations": [
        {
          "line": 1,
          "column": 11
        }
      ],
      "message": "Public package versions are not eligible for deletion. For more on our deletion policy, see https://help.github.com/articles/about-github-package-registry/#deleting-a-package."
    }
  ]
}

我們原本有個政策,說公開的套餐我們不會刪除的。但是我們經過了很多困難,最後的結論是我們無法刪除它!如果你真的需要,請從這裡聯絡我們。

嗯,这次的工作让我对GraphQL有了一些模糊的理解,就算是好事吧…

广告
将在 10 秒后关闭
bannerAds