网易首页 > 网易号 > 正文 申请入驻

不在DEV团队,他靠公开代码修好了全员丢失的徽章

0
分享至

一个不在DEV团队的人,没有管理后台,没有生产数据库权限,也没有内部Slack。他了解DEV如何运转的全部途径,是读公开的forem/forem代码仓库。就凭这些,他诊断出了为什么DEV上没人能拿到多提交贡献者徽章,把服务端修复推了上去,还收到了@benhalpern本人的一句"Thank you for this"并完成合并。


事情从一次贡献冲刺开始。几天里他在forem/forem合并了四个拉取请求:修文档里断掉的Kamal目录锚点、清理管理表单里重复的aria-describedby属性、清理创作者设置里悬空的aria-describedby引用、给user_subscription标签的src加引号并补上缺失的alt。

第一个PR合并后,他的1x徽章(dev-contributor)立刻到账。第四个PR合并时,他从config/schedule.yml知道BadgeAchievements::BadgeAwardWorker每小时的第20分钟跑一次(cron为"20 * * * *")。他查了GitHub的Contributors API,确认自己的账号在第二页,contributions为4。因为Forem设置了Octokit.auto_paginate = true,这个worker肯定能翻到第二页。

一个小时的定时任务过去了,两个过去了,三个过去了,4x-commit-club徽章还是没来。他没有继续刷24小时个人主页,而是打开了app/services/badges/award_contributor_from_github.rb。

把负责1x徽章的award_single_commit_contributors和负责4x、8x、16x、32x的award_multi_commit_contributors放在一起对比,三个问题直接跳了出来:

  • slug静默丢失:BADGE_SLUGS里每个键都通过Badge.id_for_slug(slug)解析,如果生产badges表里的slug和硬编码常量对不上,id_for_slug返回nil,服务对结果哈希调用.compact就继续往下走。没有报错,没有日志,一档徽章就这么悄悄消失。
  • 缺少上下文消息:单提交徽章用first_or_create并带上rewarding_context_message_markdown,多提交徽章却只用了裸的.create,即便创建成功也漏掉了那句"Thank you so much for your contributions!"。四倍的提交,零次的感谢。
  • 缺少幂等保护:create_badges_for_user每小时都对列表里每个贡献者重新尝试已获得的徽章,靠ActiveRecord的唯一性校验静默失败。如果某个徽章设了allow_multiple_awards: true,裸.create每小时都会插入一条重复成就,并触发通知和邮件。

关于第一个问题,他找到了关键线索。Forem只暴露resources :badges, only: [:index],没有公开的/badges/:slug详情路由,无法直接查询单个徽章slug。但翻公开的dev.to/badges目录时,他看到徽章#423的标题是"4x DEV Contributor Club",描述字段里却写着4x-commit-club。原因是Badge#generate_slug在没有显式slug时会把标题参数化,生产库里存的slug和硬编码的"4x-commit-club"根本对不上。

他开了Issue #24114,说明徽章ID 423到426的slug不匹配,并配上PR #24113修复服务本身:给多提交徽章补上rewarding_context_message_markdown;把裸的BadgeAchievement.create换成.where(...).first_or_create(...);把slug查找挪到GitHub认证提供方检查之后,并在配置的slug在数据库中缺失时加日志。

代码评审阶段出现了转折。@benhalpern账号下最初那份深入评审由Forem的自动评审代理(OpenHands)发出,它对badges表做了一次只读查询,确认了他的诊断:五个BADGE_SLUGS键里只有一个能解析,四个Nx-commit-club slug没有对应行,所以create_badges_for_user会跳过它们,今天没人能拿到这些徽章。

评审还抓出了他PR里的两个细节问题。第一,他原本在循环里对每个缺失slug打一条Rails.logger.warn,在生产slug对齐之前,DEV每小时会打4条warn;而Forem支撑着许多独立社区,多数自建实例开了GitHub认证却没播种DEV专属的贡献者徽章,每小时五条warn会把warn变成永久的背景噪音。修复方式是收集所有缺失slug,每次运行只打一条Rails.logger.info。

第二,他为幂等性写的回归测试在main上也能通过。徽章工厂默认allow_multiple_awards: false,在main上第二次.create会撞上唯一性校验静默失败,计数仍为1。这个测试测的不是first_or_create,而是ActiveRecord的唯一性校验器。他把测试改成用allow_multiple_awards: true创建徽章,并断言第二次运行时expect { described_class.call }.not_to change(BadgeAchievement, :count)。

推送修复后34项检查全绿,@benhalpern亲自留言"Thank you for this",随后把#24113以d1b962e合并进forem:main,这是他的第5个合并PR。不久后来自yo@dev.to的徽章邮件进了收件箱,4x DEV Contributor Club徽章落到他的主页上,带着他亲手接上的那句上下文消息。

他给过去的自己留了三条经验:回归测试不看到它在main上失败就不算数,先git stash再跑一遍;日志级别是运维契约,warn意味着有人该行动,可选数据缺失属于info;调试生产不需要生产权限,只需要公开源码、一个可证伪的假设,和顺着线索追下去的好奇心。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
经济学家任泽平账号被封原因深度分析

经济学家任泽平账号被封原因深度分析

柚子新媒
2026-10-24 13:15:01
中超天王山争议判罚!费利佩造点失点,斯坦丘暴怒,媒体人开炮

中超天王山争议判罚!费利佩造点失点,斯坦丘暴怒,媒体人开炮

奥拜尔
2026-10-24 16:17:15
双055护航!辽宁舰编队的“豪华版”有多强,专家详解

双055护航!辽宁舰编队的“豪华版”有多强,专家详解

环球网资讯
2026-10-24 16:31:20
黑色紧身健身套装,贴身面料勾勒熟女饱满曲线

黑色紧身健身套装,贴身面料勾勒熟女饱满曲线

只要高兴就好
2026-09-23 08:15:38
江苏105岁老人“神仙作息”:傍晚五六点准备入睡,第二天清晨四五点起床,睡12个小时;喜欢吃稀饭、鱼虾,不抽烟不喝酒,能骑三轮车赶集

江苏105岁老人“神仙作息”:傍晚五六点准备入睡,第二天清晨四五点起床,睡12个小时;喜欢吃稀饭、鱼虾,不抽烟不喝酒,能骑三轮车赶集

台州交通广播
2026-10-23 17:49:32
“浑身都是放纵的痕迹!”母亲晒儿子大学三年变化,连面相都变了,家长认为责任在学校,网友们痛斥

“浑身都是放纵的痕迹!”母亲晒儿子大学三年变化,连面相都变了,家长认为责任在学校,网友们痛斥

蝴蝶花雨话教育
2026-10-20 00:05:15
vogue盛典:娜扎无人搭理、白鹿被当众看胸、曝刘诗诗缺席内幕

vogue盛典:娜扎无人搭理、白鹿被当众看胸、曝刘诗诗缺席内幕

娱妮啵啵啊
2026-10-24 14:19:38
罗体:阿莱格里赛后连爆粗口,怒骂上赛季欧冠资格被塞给罗马

罗体:阿莱格里赛后连爆粗口,怒骂上赛季欧冠资格被塞给罗马

懂球帝
2026-10-25 04:20:09
桥本1-3蒯曼止步八强!日媒难掩沮丧:生涯首败对手,有人能阻挡削球

桥本1-3蒯曼止步八强!日媒难掩沮丧:生涯首败对手,有人能阻挡削球

颜小白的篮球梦
2026-10-25 05:08:06
云南省召开全省领导干部会议,莫高义、刘奇凡讲话

云南省召开全省领导干部会议,莫高义、刘奇凡讲话

澎湃新闻
2026-10-24 20:05:03
发现没?军方明显越来越"不耐烦"了,说的都是外国人能听懂的话

发现没?军方明显越来越"不耐烦"了,说的都是外国人能听懂的话

小曦谈古今
2026-09-14 20:23:19
特朗普若干满这四年,就已经是两届;虽然中间隔了一届,但美国法律只允许总统任两届,隔一届也没用,美国宪法早就把这条路彻底堵死

特朗普若干满这四年,就已经是两届;虽然中间隔了一届,但美国法律只允许总统任两届,隔一届也没用,美国宪法早就把这条路彻底堵死

谈史论今1
2026-10-24 18:26:26
中方不打算轻易放过日本,11月的APEC现场,高市打算破罐子破摔?

中方不打算轻易放过日本,11月的APEC现场,高市打算破罐子破摔?

策前论
2026-10-24 13:36:29
陈永奇任江西省政府党组书记

陈永奇任江西省政府党组书记

界面新闻
2026-10-24 18:04:04
任泽平获赞超百万的账号遭“禁关”!多个平台已撤销“经济学家”认证,2980元VIP课程仍在售卖

任泽平获赞超百万的账号遭“禁关”!多个平台已撤销“经济学家”认证,2980元VIP课程仍在售卖

时代财经
2026-10-24 22:46:12
42岁知名女星自曝遇到潜规则,唱K时突然被要求伴游,公司同事作为中间人进行游说

42岁知名女星自曝遇到潜规则,唱K时突然被要求伴游,公司同事作为中间人进行游说

叨唠
2026-10-24 04:00:14
皇马公布国家德比23人大名单:姆巴佩领衔出战,维尼修斯缺席

皇马公布国家德比23人大名单:姆巴佩领衔出战,维尼修斯缺席

懂球帝
2026-10-24 21:09:07
绝不姑息!中央暗访现场撕破伪装,这些离谱乱象,怎么洗都洗不掉

绝不姑息!中央暗访现场撕破伪装,这些离谱乱象,怎么洗都洗不掉

辉哥说动漫
2026-10-24 13:22:24
数据显示,超15%的中青年夫妻处于“干婚”状态,68%的中年人拥有固定深交的异性网友

数据显示,超15%的中青年夫妻处于“干婚”状态,68%的中年人拥有固定深交的异性网友

舒山有鹿
2026-07-25 09:57:20
天天敲门查出租屋,深圳的网格员到底是干嘛的?到底有没有用?

天天敲门查出租屋,深圳的网格员到底是干嘛的?到底有没有用?

坠入二次元的海洋
2026-10-24 15:06:17
2026-10-25 06:23:00
碳基打工人
碳基打工人
坐标北京,靠咖啡续命,靠小红书下饭的普通人类。
187文章数 88关注度
往期回顾 全部

科技要闻

写程序、做3D,新Kimi还有多少本事?

头条要闻

近50万买小鹏X9被指撞"报废"气囊未弹出 小鹏汽车回应

头条要闻

近50万买小鹏X9被指撞"报废"气囊未弹出 小鹏汽车回应

体育要闻

从乐透秀到总冠军再到没工作 一共要几年?

娱乐要闻

翁虹19岁女儿三次拒爱,在美国上学却“不随便”

财经要闻

叫"保障"不叫"保险":租车平台的文字游戏

汽车要闻

大众安徽与众09正式上市 双十一权益价16.99万起

态度原创

时尚
艺术
亲子
房产
本地

怕停产专场|| 35岁后越来越觉得,真正的“长期主义”是保住它

艺术要闻

中国画家油画里的东方女神美到失语!一眼沦陷,怎么看都看不够

亲子要闻

全国试点!坪山这所幼儿园筑牢平安校园防线

房产要闻

百亩大盘又 +1!攒量超 200 万㎡!江东,要燃起来了!

本地新闻

这么近,那么美,周末赴贺州丨大湾区后花园

无障碍浏览 进入关怀版