从 GitHub Actions 中删除工作流

我在我的存储库的 .github/workflows文件夹中创建了几个工作流,以便对 GitHub Actions 进行试验。从那以后,我学到了很多,并从我的回购中删除了所谓的“实验性”工作流。在删除“实验性”工作流 yaml 文件并提交删除之后,当我转到存储库的 Actions 选项卡时,我 还是会看到我已经删除的工作流。

我看不到删除和从头开始的选项? !这不可能吗?有可能通过 GitHub API 实现吗?嗯。

45086 次浏览

As of July 7, 2020, 您现在可以删除各个工作流运行的结果. To do this, navigate to your workflow, find the workflow run that you want to delete, and select the "..." menu. In this menu, select "Delete workflow run".

工作流运行及其日志将被删除。

Delete workflow run

目前,您必须为每个单独运行的工作流执行此操作。

编辑: 从2021年2月开始,似乎在 < em > 之后所有的工作流程都被删除了 the workflow it self disappears. One comment below also seems to confirm this.

您可以从 github 的 Code 选项卡中删除该文件,因为它是作为普通提交添加的

enter image description here

点击文件,然后点击删除图标:

enter image description here

将本地分支更新为与 master 同步,然后删除 github/workflow。 提交并推动您的更改。 工作流应该在主服务器中删除

您的工作流是 * . yml 文件,保存在/. github/workflow/文件夹中的 repo 中

删掉就是了!

It doesn't seem that there is currently a way to delete those workflows - this makes no sense - but it appears that once one makes the mistake of creating one they are stuck with it forever. The only solution so far I found is to disable these workflows.

因此,如果我进入 行动标签(编辑网址以匹配你的回购) ,我就可以点击一个工作流,然后通过标签右上角的[ ... ]禁用它,如下图所示:

enter image description here

To delete all workflow results at once

要删除这里的记录,我找到的解决方案是 给你,只对原始记录进行了一些小小的修改:

user=GH_USERNAME repo=REPO_NAME; gh api repos/$user/$repo/actions/runs \
--paginate -q '.workflow_runs[] | select(.head_branch != "master") | "\(.id)"' | \
xargs -n1 -I % gh api repos/$user/$repo/actions/runs/% -X DELETE

GH_USERNAMEREPO_NAME替换为所需的 github 用户名和相应的 repo 名称。

This will delete all the old workflows that aren't on the master branch. You can further tweak this to do what you need.

Prerequisites:

  • 您将找到最新的 gh版本 给你

备注:

  • 如果这是你第一次使用它,你可能不得不使用 gh auth login
  • You may further change the command to gh api --silent if you prefer not to see the verbose output.
  • 对于命令链的最后一部分 xargs-原始使用的 -J instead of -I, which is not supported by GNU xargs. -J 结果为单个命令,并且 -I将为 每张唱片,所以会慢一点。

感谢社区论坛上的 OP 首先分享这个。

我尝试从这个位置. github/workflow/删除 yml 文件,它非常有效。

对于任何人想知道,删除 .github/workflows内的 workflow.yml文件的工作,但你需要确保它是在所有分支删除。如果 master/main仍然保留工作流文件,那么 GitHub 将保留它们。

I managed to fix this (currently not possible via UI) by using "gh" CLI tool and reading REST API 文档.

首先,获取所有的工作流(这些是在 web UI-> Actions-> left 列中显示的工作流) :

$ gh api repos/$YOUR_USER/$YOUR_REPO/actions/workflows
{
"total_count": 2,
"workflows": [
{
"id": 3611607,
"name": "FreeBSD",
...
},
{
"id": 4336318,
"name": "MacOS",
...
}
]
}

使用您想要删除的工作流的 ID (比如3611607)来获得它的所有单独运行:

$ gh api repos/$YOUR_USER/$YOUR_REPO/actions/workflows/3611607/runs
{
"total_count": 17,
"workflow_runs": [
{
"id": 363876785,
"name": "FreeBSD",
...
},
{
"id": 363876786,
"name": "FreeBSD",
...
},
{
"id": 363876787,
"name": "FreeBSD",
...
},
}

对于每个运行 id (例如363876785) ,删除它:

$ gh api repos/$YOUR_USER/$YOUR_REPO/actions/runs/363876785 -X DELETE

在此之后,web UI 左栏中的 undeletable Action 应该会消失。

下面是一些快速清理工作流的命令。

您将需要 xargsghjq CLI 工具。

根据运行次数的不同,您必须多次执行删除步骤,因为 GH API 端点是分页的。

OWNER=<your user/org name>
REPO=<repo name>


# list workflows
gh api -X GET /repos/$OWNER/$REPO/actions/workflows | jq '.workflows[] | .name,.id'


# copy the ID of the workflow you want to clear and set it
WORKFLOW_ID=<workflow id>


# list runs
gh api -X GET /repos/$OWNER/$REPO/actions/workflows/$WORKFLOW_ID/runs | jq '.workflow_runs[] | .id'


# delete runs (you'll have to run this multiple times if there's many because of pagination)
gh api -X GET /repos/$OWNER/$REPO/actions/workflows/$WORKFLOW_ID/runs | jq '.workflow_runs[] | .id' | xargs -I{} gh api -X DELETE /repos/$OWNER/$REPO/actions/runs/{}

我确实找到了一个办法。你可以转到 . github/workflow或者任何你设置了工作流的地方,然后转到 提交删除文件(工作流文件),它会最终删除你的工作流。

基于@Giampaolo Rodolà 的回答(对我很有用) ,我创建了这个简单的 shell 脚本来完成这项工作。

在执行此脚本之前禁用要删除的工作流(通过 Github 控制台)。

org=<your org>
repo=<your repo>


# Get workflow IDs with status "disabled_manually"
workflow_ids=($(gh api repos/$org/$repo/actions/workflows | jq '.workflows[] | select(.["state"] | contains("disabled_manually")) | .id'))


for workflow_id in "${workflow_ids[@]}"
do
echo "Listing runs for the workflow ID $workflow_id"
run_ids=( $(gh api repos/$org/$repo/actions/workflows/$workflow_id/runs --paginate | jq '.workflow_runs[].id') )
for run_id in "${run_ids[@]}"
do
echo "Deleting Run ID $run_id"
gh api repos/$org/$repo/actions/runs/$run_id -X DELETE >/dev/null
done
done

结果:

Listing runs for the workflow ID 5261185
Deleting Run ID 507553125
Deleting Run ID 507548002
Listing runs for the workflow ID 5261568
Deleting Run ID 525274011
Deleting Run ID 525264327
Deleting Run ID 525247443

确保在 Github 中安装了 Github 客户端和所需的令牌权限。

一旦删除了所有相关的工作流运行,它应该被自动删除。

在我的例子中,删除通过 CLI 运行的工作流只是解决方案的一部分。 GitHub 仍然拒绝显示我之后试图添加的任何工作流。

I solved it by using the "新的工作流程" button in GH and to create a workflow from template. 我粘贴了我原来的 YML 文件的内容,并重命名了该文件,这样一切看起来都和以前一样。 最后,我通过网络提交—— GitHub 再次展示了我的工作流程。

在 GitHub 实现“删除所有工作流运行”之前,您必须依赖于 API。使用工作站上安装的 CLI 工具 ghjq,您可以运行以下命令来删除该工作流的所有运行。一旦所有的运行都被删除,它将不会再出现在 UI 中.

cd /path/to/your/repo


gh workflow list # Pick-up the workflow ID for which you want to delete all runs
WORKFLOW_ID=<the workflow id> # Change this line!


# List last 10 runs of the workflow you picked to double check the id
gh run list -L 10 -w $WORKFLOW_ID


# Some set up
REPO_INFO=$(gh repo view --json name,owner)
REPO_FULL_NAME="$(echo $REPO_INFO | jq '.owner.login' -r)/$(echo $REPO_INFO | jq '.name' -r)"


# Ready? Let's delete some runs!
gh api -X GET "/repos/$REPO_FULL_NAME/actions/workflows/$WORKFLOW_ID/runs?per_page=100" | jq '.workflow_runs[] | .id' -r | xargs -t -I{} gh api --silent -X DELETE /repos/$REPO_FULL_NAME/actions/runs/{}

The last command will delete the last 100 runs (limit from GitHub API). If you have more, run it multiple times to delete all.

删除属于您的工作流的所有作业,您的工作流将不复存在

enter image description here

P/s: 如果你有上千个作业要删除,那么使用 API 是一个很好的选择: https://docs.github.com/en/rest/reference/actions#workflow-runs

Github Actions 文档的后续内容: https://docs.github.com/en/actions/managing-workflow-runs/deleting-a-workflow-run

它应该很容易删除一个 workflow,你不需要任何更多,喜欢显示在这个图像enter image description here

If you don't see that delete option but the disable workflow instead, then it's because that workflow still have some workflow runs. 您需要删除这些工作流运行,然后删除选项将出现:)

enter image description here

以及 PowerShell 实现(感谢其他受访者) , which also requires the gh cli.

$user = "your user"
$repo = "repo"


(gh api repos/$user/$repo/actions/runs | ConvertFrom-Json).workflow_runs |
%{ $_.id } |
%{ gh api repos/$user/$repo/actions/runs/$_ -X DELETE }

重新运行“一行程序”,直到没有更多的结果为止; 它当前的页面为30个结果。

我有600多个动作,我想删除,所以有多个网页。我必须在 for 循环中运行命令:

# install following packages
sudo snap install jq gh
# To authenticate github cli
gh auth login


# for reference path to your code repository: https://github.com/$OWNER/$REPOSITORY
export OWNER=<OWNER_NAME/ORGANIZATIONS_NAME>
export REPOSITORY=<REPOSITORY_NAME>


# repeat command 30 times, if there are 30 pages of workflow history
for i in {1..30}; do gh api -X GET /repos/$OWNER/$REPOSITORY/actions/runs | jq '.workflow_runs[] | .id' | xargs -I{} gh api -X DELETE /repos/$OWNER/$REPOSITORY/actions/runs/{}; done

从某个工作流中删除所有运行

@Sheece Gardazi答案的一个改进版本,支持选择特定的工作流:

export OWNER="my-user"
export REPOSITORY="my-repo"
export WORKFLOW="My Workflow"


gh api -X GET /repos/$OWNER/$REPOSITORY/actions/runs --paginate \
| jq '.workflow_runs[] | select(.name == '\"$WORKFLOW\"') | .id' \
| xargs -t -I{} gh api -X DELETE /repos/$OWNER/$REPOSITORY/actions/runs/{}

(xargs-t选项将每个工作流运行删除请求打印到终端。)

它需要 GitHub CLI:

brew install gh
gh auth login

jq:

brew install jq

如果要删除多个工作流运行,应该使用 GitHub Action API 获取要删除的运行 ID,然后发送包含个人访问令牌的 DELETE 请求来删除工作流运行。
尝试使用此 python 脚本删除所有工作流运行。
Https://github.com/wh201906/garage/blob/master/python/deletegithubaction/delete.py
它使用 grequest 一次发出多个请求,这个脚本不需要 gh 和 jq。

我不能删除这个工作流程,尽管所有的答案在这个职位。.对我有用的是,我首先使用“ gh auth login”对自己进行身份验证,并使用下面的命令获取您想要删除的工作流的详细信息。如果您不知道工作流 ID,那么只需运行“ gh api repos/$org/$repo/actions/workflow/”来查看所有的工作流。一旦您运行了这个命令,您就会知道需要从哪个分支中删除工作流。在我们的例子中,工作流存在于“开发”分支中。您可以在“ html _ url”中看到这一点。一旦我从开发分支中删除了工作流文件,工作流就从所有地方消失了。另外,当您运行“ gh api repos/$org/$repo/actions/workflow/$flow _ id”时,您会注意到状态将被更改为“ delete”。

$> gh api repos/$org/$repo/actions/workflows/$workflow_id


{
"id": 6,
"node_id": "blah",
"name": "Run Unit Tests",
"path": ".github/workflows/unittests.yml",
"state": "active",
"created_at": "2021-05-15T00:25:19.000-07:00",
"updated_at": "2022-03-10T13:02:43.000-08:00",
"url": "blah",
"html_url": "https://company-name/workspace/project/blob/develop/.github/workflows/unittests.yml",
"badge_url": "blah"
}

下面是另一个选项,可以使用 Ritchie CLI自动删除 Github 操作工作流中的所有日志。

你要做的就是:

  • 运行 rit github delete workflow-logs
  • inform your Github 用户名 and token
  • inform the 回购所有人 and name
  • 选择 repo 工作流 进行清理

一个例子可以看到 here。注意,您需要使用 Ritchie CLI 工具导入这个存储库,以使命令工作。

  1. 安装 Ritchie CLI: < a href = “ https://docs.ritchiecli.io/”rel = “ nofollow norefrer”> https://docs.ritchiecli.io/

  2. 运行 rit add repo

? Select your provider: Github
? Repository name: formulas-github
? Repository URL: https://github.com/GuillaumeFalourd/formulas-github
? Is a private repository? no
? Select a tag version: {latest}
? Set the priority: 1
  1. Run rit set formula-runner
? Select a default formula run type: docker
The default formula runner has been successfully configured!
  1. 启动 Docker 桌面

  2. 转到 https://github.com/settings/tokens,添加生成 GitHub 个人访问令牌(使用“工作流”作用域)

  3. Run rit github delete workflow-logs

  4. 输入您的 GitHub 用户名、 GitHub 令牌、 GitHub 所有者、 GitHub 存储库名称,并选择您希望删除运行的工作流

  5. 撤销你的 < a href = “ https://github.com/sets/tokens”rel = “ nofollow norefrer”> PAT

我创建这个命令行工具是为了方便地从导航列表中选择多个条目并将它们一起删除:

Https://github.com/jv-k/delete-workflow-runs

I made some minor adjustments to @ David-Miguel's answer which offloads the filtering to github's api instead of doing it locally.

#!/bin/sh


OWNER="user-name|org-name"
REPOSITORY="repository-name"
WORKFLOW="workflow-human-friendly-name"


gh run list --repo "$OWNER/$REPOSITORY" -w "$WORKFLOW" --json databaseId \
| jq '.[].databaseId' \
| xargs -I{} gh api -X DELETE /repos/$OWNER/$REPOSITORY/actions/runs/{}

对于那些删除了工作流并且不能删除工作流运行的人(404) ?

在找到这个线程之后,我仍然花了相当多的时间让我的工作流运行淡出..。

@ ribeiro 提供的答案是正确的,但是对于拥有 删除他们的工作流,他们将无法删除运行的人来说,它将解析为404!

如何删除不再有工作流的工作流运行 我尝试了很多方法,最后,只有这个对我有用:

  1. 对于删除的每个工作流,创建与前一个工作流同名的 yml 文件(文件名工作流中的 name 属性必须与前一个相同)。这样,github 就会将它们视为“存在的”。
  2. 创建一个。Sh 文件并输入以下内容(我将使用 Ribeiro 提供的答案,但是,我将删除状态过滤器,因为我希望删除它们所有)
OWNER="aOwner"
REPO="aRepo"


workflow_ids=($(gh api repos/$OWNER/$REPO/actions/workflows | jq '.workflows[] | .id'))


for workflow_id in "${workflow_ids[@]}"
do
echo "Listing runs for the workflow ID $workflow_id"
run_ids=( $(gh api repos/$OWNER/$REPO/actions/workflows/$workflow_id/runs --paginate | jq '.workflow_runs[].id') )
for run_id in "${run_ids[@]}"
do
echo "Deleting Run ID $run_id"
gh api repos/$OWNER/$REPO/actions/runs/$run_id -X DELETE >/dev/null
done
done
  1. Run the sh file. You should see workflows run deleted (it does take some times tho)