【问题标题】:How to remove a Github Environment如何删除 Github 环境
【发布时间】:2019-04-26 10:24:09
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 我也有类似的问题。我的项目中有一个环境,但我不确定它是如何创建的。我想删除它,但到目前为止我还没有找到。
  • @Alexis.Rolland 我相信它们是通过 webhook 自动创建的,我开始认为这是 Github 的限制,无法删除它们。我真的希望他们能添加这个选项。
  • 是的,有同样的问题,觉得很烦人,没有办法!在我的情况下,我的个人页面配置不佳。最终,我只是恢复到以前的提交(但环境仍然存在)
  • 我遇到了同样的问题。我曾经使用过 Heroku 环境,现在我的仓库中有一个永久的“环境”选项卡,我不知道如何摆脱。
  • 他们应该尽快实施

标签: github heroku heroku-pipelines


【解决方案1】:

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

阅读here

【讨论】:

    【解决方案2】:

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

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

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

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

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

    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 documentationGitHub oauth documentation 的信息。这对我有用。

    【讨论】:

    • 谢谢你,这正是我需要的!
    • 非常感谢!有了这个,我终于摆脱了 GitHub 存储库中显示的部署和环境
    • 感谢您的脚本,我刚刚尝试删除我的 gh-pages 部署,但它似乎没有任何效果,请求已发出,但存储库中没有显示任何更改。
    • 谢谢。我可以生成tttt 访问令牌,方法是转到帐户设置> 开发人员设置> 个人访问令牌,并为“repo”范围生成一个。
    • 只是在您使用curl删除部署时添加。确保标题是双引号,例如 "Authorization: token <insert token>"
    【解决方案3】:

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

    请参阅此要点:https://gist.github.com/ewen-lbh/30f8237e218b14f0f40ca5ed13bf24d6

    【讨论】:

    • 在未将令牌添加到所有请求的情况下不适用于私人回购。
    • 是的,我没有尝试使用私人仓库,我可能会修改脚本以与他们一起使用编辑:我修改了脚本
    【解决方案4】:

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

    Stackblitz - Github Deployments deleter

    编辑 18/07/2020:我也将脚本从 Stackblitz 复制到这里的本地 sn-p 代码,以防 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>

    【讨论】:

    • 如何获取token?
    • 您可以从github.com/settings/tokens 生成一个。记得添加“repo_deployments”权限
    • 小心,脚本会自动启动并删除所有部署。作为问题作者,我只想删除特定环境,即该环境的所有部署。所以我不得不调整脚本以通过.environment 属性过滤部署。
    • 此外,该脚本仅获得 30 个最近的部署。为了获得旧的,您必须在获取部署时将?per_page=100 参数添加到 URL。如果您的部署超过最近的 100 个,则必须分页:docs.github.com/en/rest/guides/traversing-with-pagination
    • 为简单起见,我创建了一个基于@spersico js sn-p 的网页,我还添加了一个选项来保留最后一次部署(以防万一你需要它):githubdeploycleaner.herokuapp.com代码在这里:githubdeploycleaner.herokuapp.com/res/cleaner.js
    【解决方案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
    

    【讨论】:

    • 谢谢。这需要安装jqsudo apt install jq
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

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

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

        请为该功能投票。

        【讨论】:

          【解决方案9】:

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

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

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

          【讨论】:

          • 看起来不错!感谢分享!
          【解决方案10】:

          这不会回答 OP 问题,我一开始以为会,但它的行为与我预期的不同。 因此,我将此答案添加为社区 wiki。

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

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


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

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

          我删除了“暂存”和“生产”环境。

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

          Public environments 仍然包含“staging”和“production”。

          【讨论】:

          • 我用这个删除了公共环境。
          • 这个不存在了吗?
          • @maxcountryman github.com/UnlyEd/next-right-now/settings/environments 仍然对我有用。
          • @Vadorequest 我是组织所有者和仓库管理员,但对我来说同样的路径 404s...
          • 我假设您确实将 url 替换为您的实际 org/repo?对我来说很好。
          【解决方案11】:

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

          【讨论】:

            【解决方案12】:

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

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

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

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

            【讨论】:

              【解决方案13】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-04-15
                • 2015-03-04
                • 2014-11-10
                • 2022-08-05
                • 2011-10-16
                相关资源
                最近更新 更多