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

skå*_*fan 1 github github-api github-actions

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

我没有选择删除并重新开始的选项吗?这不可能吗?是否有可能通过GitHub API?嗯

sta*_*son 30

目前似乎没有办法删除这些工作流——这没有意义——但似乎一旦犯了创建一个的错误,他们就会永远坚持下去。到目前为止,我找到的唯一解决方案是禁用这些工作流程。

因此,如果我转到“操作”选项卡(编辑 url 以匹配您的存储库),然后我可以单击工作流并通过该选项卡右上角的 [...] 禁用它,如下面的快照所示:

在此处输入图片说明

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

删除这里的记录是我在此处找到的解决方案,对原始记录略有修改:

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
Run Code Online (Sandbox Code Playgroud)

相应地将GH_USERNAME和替换REPO_NAME为所需的 github 用户名和 repo 名称。

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

先决条件:

  • 您将在此处找到最新gh版本。

笔记:

  • 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” (5认同)
  • 对于初学者:您还需要安装“jq”包。可能是最新的“gh”版本,如上面的链接。来自 apt-get 的命令暂时没有“api”命令。之后,您需要使用“gh auth login”登录。另请注意:由于 API 限制,您可能必须运行多次。 (2认同)

Dav*_*uel 21

删除特定工作流程中的所有运行

@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/{}
Run Code Online (Sandbox Code Playgroud)

-txargs每个工作流程运行删除请求打印到终端的选项。)

它需要GitHub CLI

brew install gh
gh auth login
Run Code Online (Sandbox Code Playgroud)

jq

brew install jq
Run Code Online (Sandbox Code Playgroud)

*注意:如果您想完全删除工作流文件,请不要忘记在运行脚本后从主分支中删除它。

  • 为什么这不是一个被接受的答案?这完全符合预期 (6认同)

Sam*_*ler 16

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

你需要 xargs,ghjqCLI 工具。

根据您的运行次数,您必须多次执行删除步骤,因为 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/{}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不将 --paginate 添加到 gh 命令中? (4认同)
  • 谢谢!通过将 `-P 30` 添加到 `xargs` 选项,我能够更快地运行:我们可以一次向 github 发送许多请求 - 无需等待删除一次运行才能继续进行下一次运行。 (4认同)
  • 列出和删除步骤需要“--paginate”来列出所有结果,例如“gh api --paginate -X” (3认同)
  • 还可以使用 homebrew 下载 jq `brew install jq` (2认同)

Gia*_*olà 13

我设法通过使用“gh” CLI 工具和阅读REST API 文档来解决这个问题(目前无法通过 UI 实现)。

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

$ gh api repos/$YOUR_USER/$YOUR_REPO/actions/workflows
{
  "total_count": 2,
  "workflows": [
    {
      "id": 3611607,
      "name": "FreeBSD",
      ...
    },
    {
      "id": 4336318,
      "name": "MacOS",
      ...
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

使用您要删除的工作流的 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",
      ...
    },
}
Run Code Online (Sandbox Code Playgroud)

对于每个运行 ID(假设为 363876785),删除它:

$ gh api repos/$YOUR_USER/$YOUR_REPO/actions/runs/363876785 -X DELETE
Run Code Online (Sandbox Code Playgroud)

在此之后,Web UI 左栏中的不可删除的 Action 应该会消失。


Séb*_*ier 10

在 GitHub 实现“删除所有工作流程运行”之前,您必须依赖 API。gh通过在工作站上安装CLI 工具jq,您可以运行以下命令来删除该工作流的所有运行。一旦所有运行被删除,它将不再显示在 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/{}
Run Code Online (Sandbox Code Playgroud)

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


Rib*_*iro 8

基于@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
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

确保已安装 Github 客户端并在 Github 中获得所需的令牌权限。

  • 正是@MitchWare,对于这些情况,我们可以做类似 `while :; 的事情。做清楚;源脚本.sh;睡10;完成`。 (3认同)
  • 您可以将 --paginate 添加到 run_ids 行,这样您就不必多次运行它。来自 gh 帮助文档:``` **--paginate Make additional HTTP requests to fetch all pages of results** ``` 所以脚本中的更新行将是: **run_ids=( $(gh api repos/ $org/$repo/actions/workflows/$workflow_id/runs --paginate | jq '.workflow_runs[].id') )** (2认同)

Duc*_*Mai 7

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

在此输入图像描述

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


Edw*_*son 5

目前尚无法实现。将会在未来。

  • 我期待该功能。同时,建议设置Actions时,在另一个存储库中进行操作,以使您创建的所有实验碎屑不会困扰您。可悲的是,对于任何阅读本文的人来说,可能为时已晚。 (6认同)
  • 重要的是,可以删除操作日志,以防止在正在测试的操作/代码之一发生日志记录错误时传播凭据和/或机密信息... (3认同)
  • 刚刚这样做,它也从侧边栏中删除了工作流程标签。我首先禁用了工作流程,然后从 UI 中删除了其所有运行。工作流程现在消失了:) (2认同)
  • 但如果工作流程为空,则从存储库中删除文件。将无法删除工作流程。因为无法删除工作流程中的任何运行 (2认同)

msa*_*ord 5

还有一个 PowerShell 实现(感谢其他受访者),它也需要ghcli

$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 }
Run Code Online (Sandbox Code Playgroud)

重新运行“一行”,直到没有更多;目前它分页至 30 个结果。