如何删除 Github 环境

我的问题是关于清理 Github 存储库中的“ Environment”选项卡。

我以前通过 Heroku 部署,使用来自两个独立的 Github 分支(一个用于分段,一个用于生产)的自动部署。

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

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

我的 Github 回购文件中的“环境”选项卡没有办法删除我不再使用的环境。在 Github 或 Heroku 上,我似乎找不到任何地方可以让 Github“忘记”这个部署环境。

我希望我的问题足够清楚,如果我可以详细说明什么,请让我知道。

26441 次浏览

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

阅读 给你

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

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

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

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

首先,列出回购中的所有部署:

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

每个部署都有一个 id整数。请注意,并用该 ID 替换即将出现的代码块中的 $iiii。或者为它创建另一个 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 文档。这对我有用。

我做了一个小网页/脚本,以自动化的过程(我没有安装 Python,我没有看到其他人已经做了一个脚本) ,这是在线和把你的信息会自动完成的过程。

Stackblitz-Github 部署删除器

编辑18/07/2020: 我把脚本从 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>

基于 凯蒂丝的回答,我构建了以下 bash 脚本。

该令牌需要 repo_deployment OAuth 作用域。

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

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

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

我不知道这是否已经发布了,但我肯定不想手动删除我的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

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

Https://github.com/vishalramesh50/github-environment-cleaner

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

拜托,给这个专题投票吧。

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

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

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

这将不会回答 OP 的问题,我一开始认为它会,但它并没有像我预期的那样运行。因此,我将这个答案添加为一个社区维基。

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

我把我的经验作为一个答案添加到下面,因为它真的很令人困惑。


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

enter image description here

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

enter image description here

我删除了“准备”和“生产”环境。

enter image description here

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

公共环境 仍然包含“分段”和“生产”。

使用 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/%
"

如果存储库的 public。但是对于 private存储库,您必须使其公开或使用 githubAPI。这两种方法都可以工作,但下面是我删除环境的方法。

我为此创建了一个 npm 包(给你)。

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

PS: 这是我的 github repo-(Github) ,请随意贡献代码。

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

更多信息可以从 Github 官方文档中阅读: 删除环境

GitHub Environments

我希望你已经得到了你的问题的答案这个答案是为那些不想删除环境标签从那里 GitHib 回购

据我所知

  • 如果要删除屏幕右侧显示的“环境”选项卡
  • 如果要删除特定环境

删除环境标签

删除整个选项卡
  1. 在你的回购页面点击设置按钮 < br > < img src = “ https://i.stack.imgur.com/lx01b.png”>
  2. 取消环境标记 < br > < img src = “ https://i.stack.imgur.com/mpAHh.png”>

它将从右侧移除“环境”选项卡

删除特定环境

用于移除特定环境
  1. 点击设置 < br > < img src = “ https://i.stack.imgur.com/JyQ8L.png”>
  2. 点击环境 < br > < a href = “ https://i.stack.imgur.com/hIDxR.png”rel = “ nofollow noReferrer”> < img src = “ https://i.stack.imgur.com/yPABB.png”>
  3. < li > 在这里您可以删除一个特定的环境 < br > < img src = “ https://i.stack.imgur.com/ArbQQ.png”>

GitHub 对删除私人回购环境的回复

Hi Deekshith,


Thanks for writing in!


As it turns out, the Environments feature is an enterprise-only feature for private repositories, however, they still get created as a side effect of Deployments in private repositories.


https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment


This means that though you'd be able to create Deployments in a private repository, you won't be able to manage (e.g delete, add rules e.t.c) the deployment Environments. I'm afraid this is currently the expected behaviour. Our engineers are still discussing how best to help users who'd want to delete environments in non-enterprise private repositories, such as in your case. We’ll be sure to update you as soon as there’s any news to share.


Sorry that we could not be of more help with this -- please let us know if you have any questions at all!


Regards,
Peter
GitHub Support