使用 Cloudflare Workers 监控 Fedora Copr 构建状态

本文最后更新于:2025年2月26日 下午

确信,是 cloudflare workers 用上瘾了

「使用 Github Action 更新用于 rpm 打包的 spec 文件」一文中,我利用 Github Action 实现了自动化的 spec 版本号更新,配合 Fedora Copr 的 webhook 就可以实现 Copr 软件包更新的自动化构建。看似很完美,但缺少了一个构建状态的监控机制,这导致出现构建错误的时候我不能及时得到通知(无论构建错误是 spec 本身的问题或者是构建时的网络环境问题)。

西木野羰基 提出 notifications.fedoraproject.org 可以配置通知,Filters 的 Applications 选项中有 copr,但很可惜,实测没有效果。这里的通知配置的似乎只是邮件的过滤规则——如果 copr 本来就没打算构建失败的时候给你发邮件,那即使建立了过滤规则,依然是不可能收到邮件的。

不过好在 Fedora Copr 本身有非常完备的 api 文档/monitor 这个 API 能用来获取软件包最新的构建情况。

因此,我们就可以通过 Cloudflare 的 cronjob 定时请求这个接口,查询是否有软件包构建失败。

先来编写打请求的部分

async function fetchCopr() {
    const ownername = "zhullyb";
    const projectname = "v2rayA";

    const url = new URL("https://copr.fedorainfracloud.org/api_3/monitor")
    url.searchParams.set("ownername", ownername)
    url.searchParams.set("projectname", projectname)
    const response = await fetch(url)
    const data = await response.json()
    if (data.output !== "ok") {
        throw new Error("Failed to fetch COPR data")
    }
    return data
}

随后编写通知部分,我这里采用的是飞书的 webhook 机器人

async function notify(text) {
    const webhook = "https://open.feishu.cn/open-apis/bot/v2/hook/ffffffff-ffff-ffff-ffff-ffffffffffff"
    const body = {
        msg_type: "text",
        content: {
            text: text
        }
    }
    const response = await fetch(webhook, {
        method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify(body)
    })
    console.log(response)
}

最后就是 cronjob 的调用部分和构建状态解析部分

export default {
    async fetch(request, env, ctx) {
      return new Response('Hello World!');
    },

    async scheduled(event, env, ctx) {
        const data = await fetchCopr()
        const errorPackages = new Array()

        for (const pkg of data.packages) {
            for (const chroot of Object.values(pkg.chroots)) {
                if (chroot.state == "failed") {
                    errorPackages.push(pkg.name)
                    break
                }
            }
        }

        if (errorPackages.length > 0) {
            await notify(`COPR 以下包发生构建失败:\n${errorPackages.join("\n")}`)
        } else {
            console.log("COPR 所有包构建成功")
        }
    }
};

随后在 Cloudflare Workers 的 Settings 部分设置好 Cron 表达式即可,我这里选择在每小时的 55 分进行一次检测,这样下来一天只会消耗 24 次 workers 次数,简直毫无压力。

缺点: 我懒得使用持久化数据库记录软件包构建的成功状态,这会导致出现一个包构建失败后,每隔 1 小时都会有一条提醒,什么夺命连环 call。我目前不想修复这个问题,要不然还是降低 cron 的触发频率好了。


使用 Cloudflare Workers 监控 Fedora Copr 构建状态
https://zhul.in/2025/02/23/monitor-copr-build-state-with-cloudflare-workers/
作者
竹林里有冰
发布于
2025年2月23日
更新于
2025年2月26日
许可协议