62

我的问题是关于清理 Github 存储库上的“环境”选项卡。

我之前通过 Heroku 部署,使用来自两个单独的 Github 分支(一个用于暂存,一个用于生产)的自动部署。

这在存储库上创建了一个“环境”选项卡,其中显示了两个 Heroku 环境 - 完全符合预期。

一旦我开始深入研究 Heroku 管道,我现在已经将应用程序配置为从 staging 升级到生产环境,因此生产环境不再从分支自动部署。

我的 Github repo 上的 Environments 选项卡无法删除我不再使用的环境。我似乎在 Github 或 Heroku 上找不到任何地方让 Github “忘记”这个部署环境。

我希望我的问题足够清楚;如果我可以详细说明任何事情,请告诉我。

4

13 回答 13

47

它似乎没有 UI,但您可以使用 GitHub API 来完成。

在执行此操作之前,您可能应该断开 GitHub 和 Heroku。

首先,转到您的 GitHub 帐户设置,然后是开发人员设置,然后是个人访问令牌。创建一个允许 repo_deployments 的新令牌。生成后,保存十六进制令牌,您将需要它来处理即将到来的 API 请求。

对于这些示例,我假设您的用户名是$aaaa,您的仓库名称是$bbbb,您的访问令牌是$tttt。将这些替换为您的实际用户名和存储库名称以及访问令牌。或者只是使用 shell 变量来存储实际值,这样您就可以直接粘贴代码块。

首先,列出你的 repo 中的所有部署:

curl https://api.github.com/repos/$aaaa/$bbbb/deployments

每个部署都有一个id整数。记下它,并$iiii在即将到来的代码块中替换为该 ID。或者为它创建另一个 shell 变量。

现在您必须为该部署创建“非活动”状态:

curl https://api.github.com/repos/$aaaa/$bbbb/deployments/$iiii/statuses -X POST -d '{"state":"inactive"}' -H 'accept: application/vnd.github.ant-man-preview+json' -H "authorization: token $tttt"

现在您可以永久删除部署:

curl https://api.github.com/repos/$aaaa/$bbbb/deployments/$iiii -X DELETE -H "authorization: token $tttt"

如果您有多个部署,请发送第一个请求以查看所有剩余的部署,然后您也可以根据需要删除这些部署。

删除所有部署后,GitHub 存储库上的环境按钮将消失。

信息来自GitHub 部署文档GitHub oauth 文档。这对我有用。

于 2020-04-17T12:54:18.700 回答
46

我也制作了一个小网页/脚本,以自动化该过程(我没有安装 Python,而且我没有看到其他人已经制作了脚本),这是在线的,您的信息将完成该过程自动地。

Stackblitz - Github 部署删除器

2020 年 7 月 18 日编辑:我也将 Stackblitz 中的脚本复制到了此处的本地代码段,以防 Stackblitz 消失:

// RECOMMENDED: Disconnect HEROKU from Github before doing this (though not strictly necessary, I think).
//See https://stackoverflow.com/a/61272173/6569950 for more info.

// PARAMETERS
const TOKEN = ""; // MUST BE `repo_deployments` authorized
const REPO = "your-repo"; // e.g. "monorepo"
const USER_OR_ORG = "your-name"; // e.g. "your-name"

// GLOBAL VARS
const URL = `https://api.github.com/repos/${USER_OR_ORG}/${REPO}/deployments`;
const AUTH_HEADER = `token ${TOKEN}`;

// UTILITY FUNCTIONS
const getAllDeployments = () =>
  fetch(`${URL}`, {
    headers: {
      authorization: AUTH_HEADER
    }
  }).then(val => val.json());

const makeDeploymentInactive = id =>
  fetch(`${URL}/${id}/statuses`, {
    method: "POST",
    body: JSON.stringify({
      state: "inactive"
    }),
    headers: {
      "Content-Type": "application/json",
      Accept: "application/vnd.github.ant-man-preview+json",
      authorization: AUTH_HEADER
    }
  }).then(() => id);

const deleteDeployment = id =>
  fetch(`${URL}/${id}`, {
    method: "DELETE",
    headers: {
      authorization: AUTH_HEADER
    }
  }).then(() => id);

// MAIN
getAllDeployments()
  .catch(console.error)
  .then(res => {
    console.log(`${res.length} deployments found`);
    return res;
  })
  .then(val => val.map(({
    id
  }) => id))
  .then(ids => Promise.all(ids.map(id => makeDeploymentInactive(id))))
  .then(res => {
    console.log(`${res.length} deployments marked as "inactive"`);
    return res;
  })
  .then(ids => Promise.all(ids.map(id => deleteDeployment(id))))
  .then(res => {
    console.log(`${res.length} deployments deleted`);
    return res;
  })
  .then(finalResult => {
    const appDiv = document.getElementById("app");
    appDiv.innerHTML = `
<h1>CLEANUP RESULT</h1>
<br>
Removed Deployments: ${finalResult.length}
<br>
<br>Ids:<br>
${JSON.stringify(finalResult)}
<br><br><br><br><br><br>
  <p>(Open up the console)</p>
`;
  });
h1,
h2 {
  font-family: Lato;
}
<div id="app">
  <h1>Github Deployment's Cleaner</h1>
  <p> You need to put the parameters in!</p>
</div>

于 2020-04-24T18:30:50.220 回答
9

这不会回答 OP 问题,我一开始以为会,但它的表现并不像我预期的那样。因此,我将此答案添加为社区 wiki。

GitHub 似乎有两个“环境”的概念,OP 的意思是“公共环境”,但 GitHub 似乎也有某种“私有环境”。

我在下面添加我的经验作为答案,因为它确实令人困惑。


您可以通过“设置 > 环境”访问“私人环境”。(例如https://github.com/UnlyEd/next-right-now/settings/environments:)

在此处输入图像描述

然后,您可以删除每个环境。它会提示一个确认对话框。一经确认,环境将被破坏。

在此处输入图像描述

我删除了“登台”和“生产”环境。

在此处输入图像描述

但是公共环境仍然存在,连同它们的所有部署。(这不是OP想要的)

公共环境仍然包含“登台”和“生产”。

于 2021-01-24T10:38:11.803 回答
8

基于@Cadence 的回答,我构建了以下 bash 脚本。只需设置适当的参数并让它运行。

令牌需要repo_deploymentOAuth 范围。

env=asd
token=asd
repo=asd
user=asd

for id in $(curl -u $user:$token https://api.github.com/repos/$user/$repo/deployments\?environment\=$env | jq ".[].id"); do
    curl -X POST -u $user:$token -d '{"state":"inactive"}' -H 'accept: application/vnd.github.ant-man-preview+json' https://api.github.com/repos/$user/$repo/deployments/$id/statuses
    curl -X DELETE -u $user:$token https://api.github.com/repos/$user/$repo/deployments/$id
done
于 2020-06-19T19:47:53.103 回答
8

我制作了一个交互式 python 脚本,它可以按名称(这是我的问题)或所有部署删除特定环境。检查一下,让我知道它是否适合您:https ://github.com/VishalRamesh50/Github-Environment-Cleaner 。

这实际上也会删除所有部署,即使您有超过 30 个与此处的其他脚本不同,因为它通过来自 Github 的 API 的分页响应数据,而不仅仅是使用第一页。

于 2020-06-27T22:22:06.723 回答
4

我已经构建了一个在线工具来帮助删除部署

我遇到了同样的问题,发现@spersico 的代码非常方便,但需要更多的工具/反馈。我迭代了@spersico 代码以添加一些前端。与@spersico 的版本相同,所有调用都是在客户端进行的(并且在您的控制台/网络日志中可见)。

项目在 Github 上是开源的,在 Netlify 上有一个托管版本,可以立即使用: https ://github-deployment-cleaner.netlify.app/

于 2020-10-14T13:41:36.090 回答
3

不幸的是,“部署”仪表板似乎目前处于测试阶段,这意味着它们可能还没有功能。

在这里阅读。

于 2019-03-25T23:04:46.680 回答
3

我刚刚使用了这个 Python 脚本:5 分钟,我删除了我不需要的环境:

https://github.com/VishalRamesh50/Github-Environment-Cleaner

GitHub社区有讨论:https ://github.community/t/how-to-remove-the-environment-tab/10584/10?u=aerendir

请投票支持该功能。

于 2020-09-25T10:09:04.027 回答
1

使用@Cadence 的答案,我制作了一个快速而肮脏的python3 脚本来自动化该过程。只需运行它并输入您的信息,所有部署都将被删除,从您的存储库中删除“部署”选项卡。

看到这个要点:https ://gist.github.com/ewen-lbh/30f8237e218b14f0f40ca5ed13bf24d6

于 2020-04-18T10:58:15.220 回答
1

我不知道这是否已经发布,但我绝对不想手动删除我的 40 多个部署,所以我创建了以下脚本,也可以随意使用它:)

#!/bin/bash

REPO=<your GH name>/<your project name>
TOKEN=<your personal access token>

# https://starkandwayne.com/blog/bash-for-loop-over-json-array-using-jq/
for deployment in $(curl https://api.github.com/repos/$REPO/deployments | jq -r '.[] | @base64'); do
    DEPLOYMENT_ID=$(echo "$deployment" | base64 --decode | jq -r '.id')
    echo "$DEPLOYMENT_ID"
    curl "https://api.github.com/repos/$REPO/deployments/$DEPLOYMENT_ID/statuses" \
        -X POST \
        -d '{"state":"inactive"}' \
        -H 'accept: application/vnd.github.ant-man-preview+json' \
        -H "authorization: token $TOKEN"
done
for deployment in $(curl https://api.github.com/repos/$REPO/deployments | jq -r '.[] | @base64'); do
    DEPLOYMENT_ID=$(echo "$deployment" | base64 --decode | jq -r '.id')
    curl "https://api.github.com/repos/$REPO/deployments/$DEPLOYMENT_ID" \
        -X DELETE \
        -H "authorization: token $TOKEN"
done
于 2020-09-20T17:06:26.323 回答
1

使用GitHub CLI

org=':org:'
repo=':repo:'
env=':env:'

gh api "repos/${org}/${repo}/deployments?environment=${env}" \
  | jq -r .[].id \
  | xargs -n 1 -I % sh -c "
  gh api -X POST -F state=inactive repos/${org}/${repo}/deployments/%/statuses
  gh api -X DELETE repos/${org}/${repo}/deployments/%
"
于 2021-11-26T08:13:00.777 回答
0

您可以从存储库中删除环境,如果其public. 但是对于private存储库,您必须将其公开或使用 github API。两者都有效,但这是我删除环境的方法。

我为此创建了一个 npm 包(此处)。只需获取repo_deployments启用范围的 github 访问令牌。

现在运行npx delete-github-environment并选择要删除的环境。如果一切顺利,您的环境将被删除。

PS:这是我的 github 存储库 - ( github ),请随时为代码做出贡献。

于 2021-12-20T05:10:45.077 回答
0

要删除 Github 环境,请转到设置 -> 环境 -> 并单击要删除的环境旁边的垃圾桶图标(见下图)。

更多信息可以从 Github 官方文档中阅读: Deleting an Environment

GitHub 环境

于 2022-01-12T21:39:30.740 回答