我在存储库的文件夹中创建了几个工作流.github/workflows
来试验 GitHub Actions。从那以后,我学到了很多东西,并从我的仓库中删除了所说的“实验性”工作流程。删除“实验性”工作流 yaml 文件并提交删除后,当我转到存储库的“操作”选项卡时,我仍然看到我已删除的工作流。
我看不到删除并从头开始的选项?!这不可能吗?是否可以通过 GitHub API 实现?唔。
我在存储库的文件夹中创建了几个工作流.github/workflows
来试验 GitHub Actions。从那以后,我学到了很多东西,并从我的仓库中删除了所说的“实验性”工作流程。删除“实验性”工作流 yaml 文件并提交删除后,当我转到存储库的“操作”选项卡时,我仍然看到我已删除的工作流。
我看不到删除并从头开始的选项?!这不可能吗?是否可以通过 GitHub API 实现?唔。
自 2020 年 7 月 7 日起,您现在可以删除单个工作流运行的结果。为此,导航到您的工作流程,找到您要删除的工作流程运行,然后选择“...”菜单。在此菜单中,选择“删除工作流运行”。
工作流运行及其日志将被删除。
目前,您必须为每个单独运行的工作流执行此操作。
编辑:截至 2021 年 2 月,似乎在删除所有工作流程运行后 ,工作流程自行消失。下面的一条评论似乎也证实了这一点。
目前似乎没有一种方法可以删除这些工作流程——这没有任何意义——但似乎一旦有人犯了创建一个错误,他们就会永远坚持下去。到目前为止,我发现的唯一解决方案是禁用这些工作流程。
因此,如果我转到Actions 选项卡(编辑 url 以匹配您的 repo),然后我可以单击一个工作流并通过该选项卡右上角的 [...] 禁用它,如下面的快照所示:
在此处删除记录是我在此处找到的解决方案,对原始版本稍作修改:
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_USERNAME
和替换REPO_NAME
为相应的 github 用户名和 repo 名称。
这将删除所有不在master
分支上的旧工作流。你可以进一步调整它来做你需要的。
先决条件:
gh
找到最新版本。笔记:
gh auth login
如果这是您第一次使用它,您可能必须这样做gh api --silent
如果您不想看到详细的输出,您可以进一步更改命令。xargs
部分 - 原来使用
-J
的代替-I
GNU 不支持xargs
。-J
结果是一个命令,并且-I
将为每个记录执行命令,所以它有点慢。感谢社区论坛上的 OP 首先分享这个。
这里有一些命令可以快速清理您的工作流程。
您将需要xargs
和gh
CLIjq
工具。
根据您运行的次数,您必须多次执行删除步骤,因为 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/{}
根据@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 客户端和所需的令牌权限。
我设法通过使用“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",
...
}
]
}
使用您要删除的工作流的 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 应该会消失。
在 GitHub 实现“删除所有工作流运行”之前,您必须依赖 API。使用 CLI 工具gh
并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/{}
最后一个命令将删除最后 100 次运行(来自 GitHub API 的限制)。如果有更多,请多次运行以删除所有内容。
删除属于您的工作流程的所有工作,您的工作流程将消失
P/s:如果您有数千个作业要删除,那么使用 API 是一个很好的方法:https ://docs.github.com/en/rest/reference/actions#workflow-runs
@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 -I{} gh api -X DELETE /repos/$OWNER/$REPOSITORY/actions/runs/{}
它需要GitHub CLI:
brew install gh
gh auth login
和jq:
brew install jq
还有一个 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 个结果。
删除所有相关的工作流程运行后,它应该会自动删除。
就我而言,删除通过 CLI 运行的工作流只是解决方案的一部分。GitHub 仍然拒绝显示我之后尝试再次添加的任何工作流程。
我通过使用 GH 中的“新工作流程”按钮并从模板创建工作流程来解决它。我粘贴了原始 YML 文件的内容并重命名了该文件,以使一切看起来像以前一样。最后,我通过网络提交——GitHub 再次展示了我的工作流程。
对于任何想知道的人,删除作品中的workflow.yml
文件.github/workflows
但您需要确保在所有分支中都将其删除。如果master/main
仍然有工作流文件,那么 GitHub 将保留它们。
遵循 Github Actions 文档:https ://docs.github.com/en/actions/managing-workflow-runs/deleting-a-workflow-run
workflow
删除不再需要的应该很容易,就像在这张图片中显示的那样
如果您没有看到,delete option
而是disable workflow
相反,那是因为该工作流程仍然有一些workflow runs
. 您需要删除这些工作流程运行,然后会出现删除选项:)
我有 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
更新您的本地分支以与 master 同步,然后删除 github/workflows。提交并推送您的更改。应在 master 中删除 Wokflow
我确实找到了这样做的方法。您可以转到.github/workflows或设置工作流的任何位置,然后提交删除文件(工作流文件),最终将其删除。
如果要删除多个工作流运行,则应使用 GitHub Action API 获取要删除的运行 ID,然后发送带有包含个人访问令牌的标头的 DELETE 请求以删除工作流运行。
试试这个 python 脚本来删除所有工作流运行。
https://github.com/wh201906/garage/blob/master/Python/DeleteGithubAction/delete.py
它使用grequests一次发出多个请求,这个脚本不需要gh和jq。
您的工作流程是 *.yml 文件保存在文件夹 /.github/workflows/ 中的存储库中
只需删除它们!
我尝试从这个位置 .github/workflows/ 删除 yml 文件,它就像一个魅力。