我是如何使用 GitHub Actions 批量关闭 1000 个 GitHub Issues 的

图片

我为什么要这么做呢?

我们有一个私人仓库,维护者可以请求加入私人维护者社区。

有人认为用 @undefined 和 undefined 的句柄提交 1000 个问题到仓库会很有趣,但这是一个问题,因为它使得维护者很难找到需要被批准的实际问题。

图片


在我能够向问题表单添加验证之前,我们需要对仓库做一些额外的工作,但与此同时,我们需要关闭这些问题。因此,我认为一个临时解决方案将是创建一个 GitHub 操作,关闭所有的问题 - 标题包含  Pending invitation request for: @undefined' 。


我们从1600多个问题,在几分钟内减少到64个有效问题。

这就是我所做的。


创建GitHub Action

我做的第一件事就是去找我的人工智能助手聊天(GitHub Copilot Chat),问它我是否可以用一个 GitHub 操作关闭 1000 个问题。它给了我几个选项,但我决定用这个:

图片


然后它生成了 closeIssue.js  文件,看起来像这样:
 

图片


太好了,这是大部分的工作。现在我只需要将动作添加到我的仓库中。

我在 .github/workflows 目录下创建了一个名为 close_issues.yml 的文件,并添加了以下代码:

 
name: Close Undefined Issueson:    workflow_dispatch:    push:      branches: [ "main" ]    pull_request:      # The branches below must be a subset of the branches above      branches: [ "main" ]    schedule:      - cron: '43 0 * * 1'
jobs:  close_issues:    runs-on: ubuntu-latest    steps:      - name: Checkout code        uses: actions/checkout@v2
      - name: Setup Node.js        uses: actions/setup-node@v2        with:          node-version: 14
      - name: Install dependencies        run: npm install
      - name: Run script        run: node closeIssues.js        env:          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 

我对代码做了一些调整,
但总的来说,
这段代码主要是与
Copilot合作编写的。

我创建的下一个文件是 closeIssues.js 文件,我添加了以下代码:

import { Octokit } from "@octokit/rest";
const octokit = new Octokit({  auth: process.env.GITHUB_TOKEN,});
async function closeIssues() {  const { data: issues } = await octokit.issues.listForRepo({    owner: 'OWNER',    repo: 'internal-repo',  });
  const issuesToClose = issues.filter(issue => issue.title === 'Pending invitation request for: @undefined');
  for (const issue of issuesToClose) {    await octokit.issues.update({      owner: 'OWNER',      repo: 'internal-repo',      issue_number: issue.number,      state: 'closed',    });  }}

closeIssues().catch(console.error);

我添加了一个  package.json  文件到我的仓库中,安装了需要的依赖,然后将代码推送到我的仓库中。

测试GitHub Action

经过大约3次(好吧4次!) 尝试,我终于成功地运行了这个GitHub Action。


最初,这个操作一次关闭 30 个问题,因为这是 GitHub API 的限制。因此,我必须阅读文档 来理解如何获取所有符合条件的问题并关闭它们。

更新

在阅读了文档后,我意识到我需要使用paginate() 方法来获取指定仓库的所有问题,我还了解到,通过 paginate,问题将以数组的形式返回,因此我不再需要 const { data: issues } ,在发出请求时,我还需要使用 octokit.rest.issues 。

最终,成功运行并同时关闭所有 1000 个问题的代码如下:
 

 
import { Octokit } from "@octokit/rest";
const octokit = new Octokit({    auth: process.env.GITHUB_TOKEN,});
async function closeIssues() {    try {        console.log('Fetching issues...');        const issues = await octokit.paginate(octokit.rest.issues.listForRepo, {            owner: 'OWNER',            repo: 'internal-repo',            state: 'open',        });
        console.log(`Fetched ${issues.length} issues.`);        const issuesToClose = issues.filter(issue => issue.title === 'Pending invitation request for: @undefined');        console.log(`Found ${issuesToClose.length} issues to close.`);
        for (const issue of issuesToClose) {            console.log(`Closing issue #${issue.number}...`);            await octokit.rest.issues.update({                owner: 'OWNER',                repo: 'internal-repo',                issue_number: issue.number,                state: 'closed',            });            console.log(`Closed issue #${issue.number}.`);        }    } catch (error) {        console.error(error);    }}
closeIssues();

我给代码添加了一些日志,这样我就能看到工作流运行期间发生了什么。我还添加了一个try/catch块来捕获可能发生的任何错误。

图片

结论
 

我很高兴我能做到这一点,因为我的队友要花好几个小时才能手动关闭所有这些问题。我可以在几分钟内完成!我超级兴奋的是,GitHub Copilot能够教我一些新的东西——如何使用Octokit库与GitHub API交互。

图片

你曾经使用过 GitHub Copilot 来帮助你编写 GitHub Actions 吗?请在文章下面发送消息告诉我!我希望你今天学到了新的东西。

   欢迎关注公众号:文本魔术,了解更多

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GitHub Actions是GitHub的持续集成服务,它可以帮助开发者通过自动化的构建、发布和测试来验证代码,从而尽快发现集成错误。\[2\]GitHub Actions由多个操作组成,比如抓取代码、运行测试、登录远程服务器、发布到第三方服务等等,这些操作被称为actions。一个workflow是一次持续集成的运行过程,由一个或多个jobs构成,每个job又由多个steps构成,每个step可以执行一个或多个命令(action)。\[3\] GitHub Actions允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用该脚本,这个脚本就是一个Action。开发者可以从GitHub社区共享的官方市场查找需要的Action,也可以自己编写Action并开源供其他人使用Action可以通过指定commit、标签或分支来引用不同的版本。\[1\] 在使用GitHub Actions之前,需要了解持续集成/持续交付的概念、Git相关知识、Linux/Windows/macOS脚本相关知识以及Yaml基础语法。Yaml是一种用于配置文件的简洁易读的数据序列化格式。\[2\] GitHub Actions提供了Linux、Windows和macOS虚拟机来运行工作流程,也可以在自己的数据中心或云基础架构中托管自己的自托管运行器。通过在代码仓库中的.github/workflows目录下创建.yml文件,可以配置自动触发的工作流程。\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [GitHubActions详解](https://blog.csdn.net/unreliable_narrator/article/details/124468384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Github Actions](https://blog.csdn.net/SeriousLose/article/details/121476152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值