我的问题是关于清理Github存储库中的“环境”标签。
我以前是通过Heroku部署的,使用了来自两个单独的Github分支的自动部署(一个用于登台,一个用于生产)。
这在存储库上创建了一个“环境”选项卡,其中完全按照预期显示了两个Heroku环境。
一旦我开始深入研究Heroku管道,现在我已经将应用程序配置为从登台升级到生产环境,因此生产环境不再从分支机构自动部署。
我的Github存储库上的Environments选项卡无法删除我不再使用的环境。我似乎在Github或Heroku上找不到任何地方可以使Github“忘记”这个部署环境。
我希望我的问题足够清楚;如果我可以详细说明,请告诉我。
答案 0 :(得分:31)
我也制作了一些网页/脚本来自动化该过程(我没有安装Python,并且我没有看到其他人已经编写了脚本),并且它在线并且将您的信息自动执行该过程。
Stackblitz - Github Deployments deleter
编辑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>
答案 1 :(得分:29)
似乎没有UI,但是您可以使用GitHub API来实现。
在执行此操作之前,您可能应该断开GitHub和Heroku的连接。
首先,进入GitHub帐户设置,然后进入开发人员设置,然后进入个人访问令牌。创建一个允许repo_deployments的新令牌。生成后,保存十六进制令牌,您将在即将到来的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 deployments documentation和GitHub oauth documentation的信息。这对我有用。
答案 2 :(得分:6)
我制作了一个交互式python脚本,该脚本可以按名称(这是我的问题)或部署的 all 删除特定的环境。检查一下,让我知道它是否对您有用:https://github.com/VishalRamesh50/Github-Environment-Cleaner。
这实际上也会删除所有部署,即使您有30个以上的脚本(不同于此处的其他脚本),因为它会经过Github API的分页响应数据,而不仅仅是使用首页。
答案 3 :(得分:5)
基于@Cadence的回答,我构建了以下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
答案 4 :(得分:2)
我已经构建了一个在线工具来帮助删除部署
我遇到了同样的问题,发现@spersico的代码非常方便,但是需要更多的工具/反馈。我在@spersico代码上进行了迭代,以添加一些前端。 与@spersico的版本相同,所有调用都在客户端进行(并且在控制台/网络日志中可见)。
项目在Github上是开源的,并且在Netlify上具有托管版本,可以立即使用: https://github-deployment-cleaner.netlify.app/
答案 5 :(得分:2)
这不会回答 OP 问题,我一开始以为会回答,但它的表现并不像我预期的那样。 因此,我将此答案添加为社区维基。
GitHub 似乎有两种“环境”的概念,一种是 OP 的意思是“公共环境”,但 GitHub 似乎也有某种“私有环境”。
我在下面添加我的经验作为答案,因为它真的很令人困惑。
您可以通过“设置 > 环境”访问“私人环境”。 (例如:https://github.com/UnlyEd/next-right-now/settings/environments
)
然后您可以删除每个环境。它会提示一个确认对话框。一经确认,环境将被破坏。
我删除了“暂存”和“生产”环境。
但是公共环境仍然存在,以及它们的所有部署。(这不是 OP 想要的)
Public environments 仍然包含“staging”和“production”。
答案 6 :(得分:1)
不幸的是,“ Deployments”仪表板当前处于测试阶段,这意味着它们可能还没有功能。
阅读here。
答案 7 :(得分:1)
使用@Cadence的答案,我制作了一个快速且肮脏的python3脚本来自动化该过程。只需运行它并输入您的信息,所有部署将被删除,从您的存储库中删除“部署”标签。
查看要点:https://gist.github.com/ewen-lbh/30f8237e218b14f0f40ca5ed13bf24d6
答案 8 :(得分: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
答案 9 :(得分:1)
我刚刚使用了以下Python脚本:5分钟,然后删除了不需要的环境:
https://github.com/VishalRamesh50/Github-Environment-Cleaner
在GitHub社区中有一个讨论:https://github.community/t/how-to-remove-the-environment-tab/10584/10?u=aerendir
请对功能进行投票。