Как удалить / удалить / отвязать / отменить версию пакета из реестра пакетов Github

Вопрос: Как я могу заставить пакет «исчезнуть» из реестра пакетов Github?

  • Документация говорит: вы не можете «удалить», но пакет «исчезнет» при удалении всех версий.

Фон:

  • Опечатка в задаче публикации Gradle привела к выпуску пакетов, которые не следует публиковать.

Шаги на данный момент:

  • Я не нашел опции «удалить» в веб-приложении Github.
  • Я попытался удалить через GraphQL API Github, но мне нужен идентификатор пакета для этой команды:
curl -X POST \
-H "Accept: application/vnd.github.package-deletes-preview+json" \
-H "Authorization: bearer ACCESS_TOKEN" \
-d '{"query":"mutation { deletePackageVersion(input:{packageVersionId:\"PACKAGE_ID==\"}) { success }}"}' \
https://api.github.com/graphql
  • Я не нашел полного packageVersionId в веб-приложении Github.
  • Я попытался запросить API для идентификаторов пакетов, но не смог сформировать действительный запрос:
curl -X POST \
-H "Accept: application/vnd.github.package-deletes-preview+json" \
-H "Authorization: bearer ACCESS_TOKEN" \
-d "query {
  organization(login: "ORGANIZATION_ACCOUNT") {
    registryPackages {
      edges {
        node {
          name
          id
        }
      }
    }
  }
}" \
https://api.github.com/graphql

# The API returns:
{
  "message": "Problems parsing JSON",
  "documentation_url": "https://developer.github.com/v4"
}
  • Я попытался использовать GraphQL API Explorer, но автоматически настроенный токен не имеет достаточных прав:
# See query above - the API returns via the Explorer:
{
  "errors": [
    {
      "type": "INSUFFICIENT_SCOPES",
      "locations": [
        {
          "line": 6,
          "column": 11
        }
      ],
      "message": "Your token has not been granted the required scopes to execute this query. The 'name' field requires one of the following scopes: ['read:packages'], but your token has only been granted the: ['read:gpg_key', 'read:org', 'read:public_key', 'read:repo_hook', 'repo', 'user'] scopes. Please modify your token's scopes at: https://github.com/settings/tokens."
    },
    {
      "type": "INSUFFICIENT_SCOPES",
      "locations": [
        {
          "line": 7,
          "column": 11
        }
      ],
      "message": "Your token has not been granted the required scopes to execute this query. The 'id' field requires one of the following scopes: ['read:packages'], but your token has only been granted the: ['read:gpg_key', 'read:org', 'read:public_key', 'read:repo_hook', 'repo', 'user'] scopes. Please modify your token's scopes at: https://github.com/settings/tokens."
    }
  ]
}
  • Я не нашел в приложении Explorer Web возможности установить другой токен доступа.

Желаемое решение

  • Мне нравится знать, есть ли более простой способ сделать это, а если нет, то как получить packageVersionIds, необходимый для отсоединения пакетов, чтобы они исчезли.

Обновление1: речь идет о пакетах, опубликованных в общедоступном репозитории.


person hb0    schedule 29.11.2019    source источник


Ответы (4)


Удаление пакета из общедоступного реестра запрещено, однако вы можете удалить версию пакета из частного реестра, как указано в Документы GitHub:

Теперь его можно удалить напрямую на GitHub:

  1. На GitHub перейдите на главную страницу репозитория.
  2. Справа от списка файлов щелкните Пакеты.
  3. Щелкните имя пакета, который хотите удалить.
  4. Справа используйте раскрывающийся список «Изменить пакет» и выберите «Управление версиями».
  5. Справа от версии, которую вы хотите удалить, нажмите «Удалить».
  6. Чтобы подтвердить удаление, введите имя пакета и нажмите Я понимаю последствия, удалить эту версию.

В прошлом GraphQL был единственным методом для этой цели:

$ curl -X POST https://api.github.com/graphql \
-H "Accept: application/vnd.github.package-deletes-preview+json" \
-H "Authorization: bearer <github_token>" \
-d '{"query":"mutation { deletePackageVersion(input:{packageVersionId:\"MDE0OlBhY2thZ2VWZXJzaW9uMzc5MTE0kFcA\"}) { success }}"}'

Идентификатор версии пакетов GitHub может быть указан следующим образом:

$ curl -sL -X POST https://api.github.com/graphql \
-H "Authorization: bearer <github_token>" \
-d '{"query":"query{repository(owner:\"<repo_owner>\",name:\"<repo_name>\"){packages(first:10){nodes{packageType,name,id,versions(first:10){nodes{id,version,readme}}}}}}"}' | jq .

Обновите параметры ниже своими:

  • <github_token>
  • <repo_owner>
  • <repo_name>

Он возвращается следующим образом:

{
  "data": {
    "repository": {
      "registryPackages": {
        "nodes": [
          {
            "packageType": "DOCKER",
            "registryPackageType": "docker",
            "name": "demo_image_1",
            "nameWithOwner": "aki***/demo_image_1",
            "id": "MDc6UGFja2FnZTYzNjg3AkFc",
            "versions": {
              "nodes": [
                {
                  "id": "MDE0OlBhY2thZ2VWZXJzaW9uMzc5MTE0kFcA",
                  "version": "0.1a",
                  "readme": null
                },
                {
                  "id": "MDE0OlBhY2thZ2VWZXJzaW9uMzYzNTY2FcAk",
                  "version": "0.1",
                  "readme": null
                },
                {
                  "id": "MDE0OlBhY2thZ2VWZXJzaW9uMzYzNTY0cAkF",
                  "version": "docker-base-layer",
                  "readme": null
                }
              ]
            }
          },
        ]
      }
    }
  }
person Akif    schedule 03.12.2019
comment
Я поддержал ваш ответ, так как это работает для частных пакетов, и я пропустил заявить в вопросе, что это касается общедоступных пакетов. Спасибо за ваш вклад о том, как ПОЛУЧИТЬ идентификаторы версий пакета! - person hb0; 03.12.2019
comment
Частные пакеты не могут быть перечислены с токеном, который имеет только разрешение read:packages. Достаточно следующих разрешений: read:packages, repo, write:packages - person hb0; 03.12.2019
comment
Я обновил свой ответ, чтобы уточнить, что удаление пакета из общедоступного реестра запрещено GitHub. - person Akif; 06.12.2019
comment
Здравствуйте, не могли бы вы взглянуть на мой вопрос? stackoverflow.com/ questions / 59559176 / Я попробовал ваш метод curl, но у меня все еще возникают проблемы с парсингом json - person JianYA; 02.01.2020
comment
Имейте в виду, что это по-прежнему не работает для образов докеров, он возвращает: "Version deletion is currently unsupported for docker. For more on our deletion policy, see https://help.github.com/articles/about-github-package-registry/#deleting-a-package.", что на самом деле не упоминает никаких предостережений относительно Docker. Странный. - person Omar; 14.02.2020

Сопровождающий может удалить версии пакета частного:

  • Через API Github см. Ответ @Akif
  • Через поддержку Github
  • Via the Web App Github.com
    • Перейдите к пакетам ваших репозиториев https://github.com/orgs/YOUR_ACCOUNT/packages?repo_name=YOUR_REPO

    • Выберите один пакет https://github.com/YOUR_ACCOUNT/YOUR_REPO/packages/PACKAGE_ID

    • Показать все версии этого пакета https://github.com/cyface-de/backend/packages/81398/versions

    • Используйте кнопку DELETE, чтобы удалить этот частный пакет

      введите описание изображения здесь

Версии пакетов общедоступного репозитория не может быть удален сопровождающим, то есть:

  • Для удаления пакета или версии необходимо связаться со службой поддержки Github.

  • Обходной путь: сделайте репозиторий временно закрытым для удаления:

    • Attention: This results into loss of stars, etc., see Github Warning!
    • Repository Settings > Danger Zone > Make private
    • To delete the package versions:
      • via API: Follow instructions by @Akif's answer
      • через веб-приложение: см. выше
    • Repository Settings > Danger Zone > Make public
person hb0    schedule 29.11.2019
comment
Мне нравится, что этот обходной путь существует, но GitHub запрещает удаление пакетов из общедоступных репозиториев. Какой в ​​этом смысл? Похоже, что единственные люди, на которых это действительно влияет, - это люди с разветвленными репозиториями, из-за чего они не могут удалять какие-либо пакеты, которые они загружают в свою вилку, или прибегают к удалению своей вилки. - person smac89; 18.04.2020
comment
Только предположение: это может быть связано с безопасностью: образ очень важного общедоступного пакета, на который полагаются многие другие приложения. Когда вы импортируете эту версию пакета X, вы можете проверить базу кода, чтобы убедиться в отсутствии проблем с безопасностью. Если владелец пакета может просто удалить и заменить ту же версию другой сборкой, содержащей неисправность, приложения, использующие эту версию пакета, не заметят, что сборка, стоящая за версией, изменилась. То же самое применимо, когда вы удаляете и заменяете полный пакет вместо одной версии. - person hb0; 19.04.2020
comment
Но, вынуждая владельца репозитория снова сделать репозиторий частным и общедоступным, репозиторий теряет все свои звезды и т.д., и из-за этого другие приложения, которые полагаются на этот пакет / версию, могут получить уведомление и знать, что они больше не могут принимать пакет. / версия, которую они использовали раньше, остается тем же кодом / сборкой. Я не хочу начинать обсуждение, это всего лишь возможное объяснение. Для получения дополнительных сведений обратитесь в службу поддержки Github или на форум сообщества. - person hb0; 19.04.2020

Нашел решение как удалить пакет.

  1. Зайдите в настройки репозитория и измените видимость на приватную.
  2. Зайдите в репозиторий, нажмите на пакеты ›› Управление версиями
  3. На странице видим кнопку удаления.
  4. После удаления вернитесь в настройки репозитория и измените видимость на общедоступную.
  5. Выгода!
person Andrey Helldar    schedule 21.09.2020

Во время тестирования (частные пакеты) я несколько раз публиковал одну и ту же версию и удалял ее. До момента, когда он каким-то образом застрял, и я не мог щелкнуть «Управление версиями» в пользовательском интерфейсе, поскольку вместо этого кнопка изменилась на «Параметры пакета». Предоставленный ранее GraphQL не помог, но я смог определить версии в GraphQL Explorer с помощью следующий:

query {
  repository(owner: "<org>", name: "<repo>") {
    packages(first: 10) {
      edges {
        node {
          latestVersion {
            id
            version
          }
        }
      }
    }
  }
}

Это вернуло немного рассинхронизированный список узлов, похожий на:

{
  "data": {
    "repository": {
      "packages": {
        "edges": [
          {
            "node": {
              "latestVersion": null
            }
          },
          {
            "node": {
              "latestVersion": null
            }
          },
          {
            "node": {
              "latestVersion": null
            }
          },
          {
            "node": {
              "latestVersion": null
            }
          },
          {
            "node": {
              "latestVersion": null
            }
          },
          {
            "node": {
              "latestVersion": null
            }
          },
          {
            "node": {
              "latestVersion": null
            }
          },
          {
            "node": {
              "latestVersion": null
            }
          },
          {
            "node": {
              "latestVersion": {
                "id": "MDE0OlBhY2thZ2VWZXJzaW9uNTYxMjQyOQ=="
                "version": "0.1.0"
              }
            }
          }
        ]
      }
    }
  }
}

При этом я смог удалить их один за другим с помощью:

curl -X POST https://api.github.com/graphql \
-H "Accept: application/vnd.github.package-deletes-preview+json" \
-H "Authorization: bearer $TOKEN" \
-d '{"query":"mutation { deletePackageVersion(input:{packageVersionId:\"MDE0OlBhY2thZ2VWZXJzaW9uNTYxMjQyOQ==\"}) { success }}"}'
person Anton Yurchenko    schedule 07.12.2020