有人知道从 GitHub Actions 中删除工作流的方法吗?

Posted

技术标签:

【中文标题】有人知道从 GitHub Actions 中删除工作流的方法吗?【英文标题】:Anyone know a way to delete a workflow from GitHub Actions? 【发布时间】:2020-01-15 12:51:34 【问题描述】:

我在存储库的 .github/workflows 文件夹中创建了几个工作流来试验 GitHub Actions。从那以后,我学到了很多东西,并从我的仓库中删除了所说的“实验性”工作流程。在删除“实验性”工作流 yaml 文件并提交删除操作后,当我转到存储库的“操作”选项卡时,我仍然看到我已删除的工作流。

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

【问题讨论】:

【参考方案1】:

截至 2020 年 7 月 7 日,you can now delete the results of individual workflow runs。为此,导航到您的工作流程,找到您要删除的工作流程运行,然后选择“...”菜单。在此菜单中,选择“删除工作流运行”。

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

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

编辑:截至 2021 年 2 月,似乎在 所有工作流程运行都被删除之后 它自己的工作流程消失了。下面的一条评论似乎也证实了这一点。

【讨论】:

我很期待这个功能。同时,在设置 Actions 时,我建议在另一个 repo 中进行,这样您在实验中创建的所有碎屑都不会困扰您。可悲的是,对于任何阅读本文的人来说,可能为时已晚。 一个没人抱怨的功能可能没用:) 动作看起来很有用,但工作流的运行似乎很奇怪。像这样的***用户数据对象可用的正常操作不是“创建、读取、更新、销毁”吗?目前工作流运行似乎只支持读取和更新(重新运行)。显然创建或删除它们只会自动发生,不能手动完成。 重要的是可以删除操作日志,以防止在正在测试的操作/代码之一发生日志记录错误时传播凭据和/或机密信息...跨度> @jactor-rises 确实,这是一个非常好的观点!我现在会非常小心地在公共存储库中试验我的构建。 刚刚这样做,它也从侧边栏中删除了工作流标签。我首先禁用了工作流,然后从 UI 中删除了它的所有运行。工作流程现在消失了:)【参考方案2】:

目前似乎没有一种方法可以删除这些工作流程 - 这没有任何意义 - 但似乎一旦创建一个错误,他们就会永远坚持下去。到目前为止,我发现的唯一解决方案是禁用这些工作流程。

因此,如果我转到 Actions tab(编辑 url 以匹配您的存储库),然后我可以单击工作流并通过该选项卡右上角的 [...] 禁用它,就像在快照中一样下面:

一次性删除所有工作流结果

这里删除记录是我找到的解决方案here,对原作稍加修改:

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 名称。

这将删除不在master 分支上的所有旧工作流。你可以进一步调整它来做你需要的。

先决条件:

您将找到最新的gh 版本here。

注意事项:

如果这是您第一次使用它,您可能需要gh auth login 如果您不想看到详细输出,可以进一步将命令更改为 gh api --silent。 对于命令链的最后 xargs 部分 - 原来使用 -J 而不是 -I,GNU xargs 不支持。 -J 生成单个命令,-I 将执行该命令 每个记录,所以它有点慢。

感谢社区论坛上的 OP 首先分享此内容。

【讨论】:

您应该像这样在删除操作中添加--silent 修饰符:gh api --silent repos/$user/$repo/actions/runs/% -X DELETE 对于初学者:您还需要安装 jq 软件包。并且可能是最新的gh 版本,如上面的链接。来自 apt-get 的那个暂时没有“api”命令。之后,您需要使用gh auth login 登录。还有一点需要注意:由于 API 限制,您可能需要多次运行。 我真的不想在答案中留下旧的/不需要的信息,但看起来它是从 3 月开始的 github.com/cli/cli/releases/tag/v1.7.0 惊人的答案 ;) 非常感谢您删除所有工作流程的详细和工作说明【参考方案3】:

这里有一些命令可以快速清理您的工作流程。

您需要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/

【讨论】:

jq下载 最好的!对于其他任何人,在最后一个命令之后点击 q 与您的工作流程的计数一样多,直到它全部被删除。 也可以用homebrew下载jqbrew install jq 为什么不将 --paginate 添加到 gh 命令?【参考方案4】:

根据@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 中获得所需的令牌权限。

【讨论】:

工作得很好(多次运行后,为了绕过 API 的批处理限制,只返回每个工作流的运行子集)。谢谢! 完全是@MitchWare,对于这些情况,我们可以执行while :; do clear; source script.sh; sleep 10; done 之类的操作。 很棒的解决方案。 ?? 您可以将 --paginate 添加到 run_ids 行,这样您就不必多次运行它。来自 gh 帮助文档:``` --paginate 发出额外的 HTTP 请求以获取所有结果页面 ``` 所以脚本中的更新行将是:run_ids=( $( gh api repos/$org/$repo/actions/workflows/$workflow_id/runs --paginate | jq '.workflow_runs[].id') ) @TerrySposato 添加--paginate 效果很好,谢谢。【参考方案5】:

我通过使用“gh”CLI 工具并阅读 REST API docs 设法解决了这个问题(目前无法通过 UI)。

首先,获取所有工作流程(这些工作流程显示在 Web UI -> 操作 -> 左栏中):

$ 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 左栏中不可删除的 Action 应该会消失。

【讨论】:

对我不起作用;已经有 0 次对抗该动作。此外,单个运行直接在 web ui 中删除,因此无需通过 api 调用来执行此操作,除非您有很多要循环的内容。 在我的情况下由于某种原因它们没有显示在 UI 中 谢谢,为我工作! UI 反映没有运行,因为它们已被删除,但通过 API 检查工作流显示 2 次运行。删除那些使卡住的工作流程消失【参考方案6】:

在 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/

最后一个命令将删除最后 100 次运行(来自 GitHub API 的限制)。如果还有更多,请多次运行以删除所有内容。

【讨论】:

【参考方案7】:

删除属于您的工作流程的所有作业,您的工作流程将消失

P/s:如果您有数千个作业要删除,那么使用 API 是一个不错的方法:https://docs.github.com/en/rest/reference/actions#workflow-runs

【讨论】:

这个答案应该有更多的赞成票:)【参考方案8】:

还有一个 PowerShell 实现(感谢其他受访者), 这也需要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 个结果。

【讨论】:

【参考方案9】:

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

@Sheece Gardazi's answer的改进版,支持选择某个工作流:

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 -I gh api -X DELETE /repos/$OWNER/$REPOSITORY/actions/runs/

需要GitHub CLI:

brew install gh
gh auth login

和jq:

brew install jq

【讨论】:

为什么这不是一个公认的答案?这完全符合预期【参考方案10】:

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

【讨论】:

令人惊讶的是,鉴于它是对最高投票答案的扩展,因此投票如此之多。您可以删除所有运行,工作流程将消失,但这对于 100 次以上的运行不太可行。只需转到每个分支并删除 workflow.yaml 文件就更容易了。只要您对存储库中的所有分支执行此操作,Ewerton 的解决方案也有效。【参考方案11】:

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

【讨论】:

【参考方案12】:

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

我通过使用 GH 中的“新建工作流程”按钮并从模板创建工作流程来解决了这个问题。 我粘贴了原始 YML 文件的内容并重命名了该文件,以使一切看起来像以前一样。 最后,我通过网络提交 - GitHub 再次展示了我的工作流程。

【讨论】:

【参考方案13】:

遵循 Github Actions 文档:https://docs.github.com/en/actions/managing-workflow-runs/deleting-a-workflow-run

删除您不再需要的workflow 应该很容易,就像这张图片中显示的

如果您没有看到 delete option 而是看到 disable workflow,那是因为该工作流仍然有一些 workflow runs。 您需要删除这些工作流运行,然后会出现删除选项:)

【讨论】:

【参考方案14】:

我有 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

【讨论】:

使用--paginate 选项【参考方案15】:

更新您的本地分支以与 master 同步,然后删除 github/workflows。 提交并推送您的更改。 应该在 master 中删除 Wokflow

【讨论】:

我有一个旧的工作流程卡在那里。它不作为实际文件存在。我不知道如何摆脱它!【参考方案16】:

我确实找到了这样做的方法。您可以转到 .github/workflows 或设置工作流的任何位置,然后提交删除文件(工作流文件),最终将其删除。

【讨论】:

【参考方案17】:

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

【讨论】:

欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么存在,然后引用最多您链接到的页面的相关部分,以防目标页面不可用。 Answers that are little more than a link may be deleted. @LukaKiebel 好的。我将在那里添加更多信息。【参考方案18】:

您的工作流程是保存在您的存储库中的 /.github/workflows/ 文件夹中的 *.yml 文件

删除它们!

【讨论】:

不知道为什么这被否决了,如果您删除工作流并提交您的存储库,它确实有效。 @GideonleGrange 我不确定你的意思。我删除了一个工作流 YAML,提交并推送,但它仍在“操作”选项卡中。 @DominickPastore - 更改(删除)必须在 master 此解决方案的问题在于 OP 询问的是删除工作流运行而不是操作本身。删除文件将删除操作,但旧的工作流程仍将保留,需要手动删除。但这正是我所需要的,删除该操作使其不再触发。我在工作流中找到了路径并搜索了如何删除操作。【参考方案19】:

我尝试从 .github/workflows/ 这个位置删除 yml 文件,它就像一个魅力。

【讨论】:

【参考方案20】:

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

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

【讨论】:

问题中已经提到过,这不会删除该工作流的运行:删除“实验性”工作流 yaml 文件并提交删除后,当我转到存储库的“操作”选项卡时,我仍然查看我已删除的工作流程。 是的,它不会删除工作流标签。即使我们重置了分支。 这也适用于我。自从最初发布问题以来,这开始看起来像是一个可能已在 github 中修复的错误。我在尝试此解决方案之前删除了工作流运行,因此我不知道它是否会自动执行此操作,但如果没有,请尝试手动删除所有以前的工作流运行并遵循此海报的建议(从 .github/workflows 中删除 yaml 工作流描述符文件本身)

以上是关于有人知道从 GitHub Actions 中删除工作流的方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

从版本列表中删除了 Node.js v15,但 Github Actions 仍将其显示在检查列表中

在 GitHub Actions 中使用 docker 文件

将 Go 项目从 Travis 迁移至 GitHub Actions

仅当有人打开 PR 时才运行 GitHub Action

Github Actions生成 secrets

PyPI危机:恶意软件包下载超3万次平台再曝GitHub Actions高危漏洞