想象你走进一家名为「开源食堂」的共享厨房。任何路过的人都能端上一盘自己研发的菜,但老板很快发现了麻烦:有人把隔壁餐厅的招牌菜改良一下就端上来,还署上自己的名字;也有人担心自己的秘方被端走,却讨不回一个说法。于是老板立下两条规矩:每位来交菜的师傅,先在一张「原创保证书」上签字,证明这道菜确实是自己研发的;再签一张「使用授权书」,说明自己同意食堂如何处置这份菜谱。这两张纸,就是开源世界里的 DCO 与 CLA。看似只是动动笔,却让这个自由交换的厨房安安稳稳运转了几十年——既保护了每位厨师的劳动,也让食堂敢把菜收进菜单、放心地交给更多人品尝。本文就用这个厨房的故事,带你认识 DCO(开发者原创声明)与 CLA(贡献者许可协议)究竟是什么、该怎么签、在法律上如何保护各方,以及企业和项目维护者应该如何把这套流程变成日常习惯。

岗位关联

在开源贡献已成为 AI 工程师日常动作的今天,理解 DCO 与 CLA 不只是避开法律风险的必修课,更是你从「能提交代码」走向「能主导开源协作」的关键一步。

目录
  1. 可视化演示
  2. 概念初识:原创声明与使用授权
  3. 签署流程:从签名到合并的三步走
  4. 法律作用:权利边界的护栏
  5. 维护者视角:开店先设验菜台
  6. 企业策略:总部统一对接
  7. 风险防范:守住三道防线
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

演示开发者原创声明与贡献者许可协议签署流程,理解两者在知识产权保护中的不同作用。

本节配有交互动效(进入视口后自动加载,约 3KB)。

DCO流程:原创声明 提交签名 验证通过 DCO 开发者原创声明

概念初识:原创声明与使用授权

老板把两张纸并排挂在墙上,新来的厨师总忍不住问:「这两张纸不都是签字吗?有什么区别?」其实差远了。第一张「原创保证书」回答的是「这道菜从哪儿来」,第二张「使用授权书」回答的是「这道菜大家能怎么用」。一个是追溯过去,一个是面向未来。追溯过去的,叫 DCO;面向未来的,叫 CLA。

DCO 的全称是 Developer Certificate of Origin,最早由 Linux 内核社区提出。它本质是一段承诺文本:贡献者确认「这段代码是我写的,或者我有权把它提交上来」。你不需要通过律师,只需在提交信息里附上一行签名,就完成了一次「原创声明」。CLA 则是 Contribution License Agreement,它是一份正式协议,贡献者要填写真实身份、阅读条款并同意,项目方才获得复制、修改、再分发乃至专利许可的权利。

两者各管一段,常常搭配出现。DCO 保证代码「来路清白」,CLA 保证代码「用得放心」。在 Apache、Kubernetes 等顶级开源项目中,两道手续都是合入代码的前提。如果一个项目只做了 DCO 而忽略 CLA,那项目方只能证明来源,却没有权利把代码整合进自己的发行版;反过来只签 CLA 不签 DCO,代码来源不明,一旦出现抄袭纠纷同样麻烦。用一句话概括这套关系:

所以下次走进开源食堂,别嫌两道手续麻烦——一张纸证明菜是你的,另一张纸同意大家吃。老板只有同时拿到这两张纸,才敢放心地把你的菜收进菜单。

合规贡献=原创声明(DCO)∧使用授权(CLA)\text{合规贡献} = \text{原创声明(DCO)} \land \text{使用授权(CLA)}
这个公式表示:一次能被项目放心接纳的代码贡献,必须同时满足「原创声明」和「使用授权」两个条件,逻辑与符号「∧」强调两者缺一不可。
  1. 合规贡献一个能够被项目安全接纳、不会埋下法律隐患的代码提交。
    合规贡献\text{合规贡献}
  2. 原创声明(DCO)贡献者签下承诺,保证代码来源合法、不抄袭。
    原创声明(DCO)\text{原创声明}(DCO)
  3. 使用授权(CLA)贡献者许可项目在约定的范围内复制、修改与分发。
    使用授权(CLA)\text{使用授权}(CLA)
  4. 逻辑与 ∧两个条件必须同时成立,任一缺失,整体就为「不通过」。
    A∧BA \land B

签署流程:从签名到合并的三步走

厨师想把自己研发的招牌菜放进食堂菜单,按规矩得走三步:递上菜谱、在「原创保证书」上签名、再签「使用授权书」。少任何一步,申请就会被老板退回。开源项目里的签署流程,几乎就是这回事。

在 Git 世界里,DCO 的签署方式是给每一次提交(commit)的说明信息末尾加上一行 Signed-off-by: 姓名 <邮箱>。这就好比每道菜出锅时都贴上一张原创标签,随着菜一起端到验菜台。CLA 的签署则通常发生在代码托管平台上:贡献者打开授权页面,填写组织与身份信息,阅读协议文本,点击同意,系统留下记录。相比 DCO 的「一句话」,CLA 多了一层正式合同的仪式感。

为了不让老板手工翻每一份菜谱,社区发明了自动化工具。DCO Bot 会自动扫描每个 PR(Pull Request,拉取请求)中的提交信息,检查是否带上了 Signed-off-by 签名;CLA Assistant 则引导贡献者完成授权签署,并把状态同步到 PR 的检查清单里。两项检查都亮绿灯,方可点下「合并」按钮。整个流程可以抽象成一个判定函数:

在开源食堂里,老板不会逐道菜去问「你签过了吗」——那样太慢。装上 DCO Bot 和 CLA Assistant 这两台「验菜机器」,每道菜递上来的瞬间,合规检查就自动完成了。你只需要保证自己的提交信息里真真切切带着那一行签名。

f(PR)=1  ⟺  signdco=1∧signcla=1f(PR) = 1 \iff \text{sign}_{\text{dco}} = 1 \land \text{sign}_{\text{cla}} = 1
这个公式表示:一个拉取请求的最终放行值 f(PR) 为 1(通过),当且仅当 DCO 签名状态与 CLA 签署状态都等于 1(已完成)。
  1. f(PR)对一个拉取请求做整体合规评估,输出 1 表示可以合并,0 表示拦截。
    f(PR)f(PR)
  2. sign_dco = 1DCO 签名检查通过,提交信息包含有效的 Signed-off-by。
    signdco=1\text{sign}_{dco} = 1
  3. sign_cla = 1CLA 授权协议已被贡献者确认签署。
    signcla=1\text{sign}_{cla} = 1
  4. 当且仅当 ⇔两项检查同时满足才放行,这正对应「缺少任一张纸都会被退回」的食堂规矩。
    A  ⟺  BA \iff B

法律作用:权利边界的护栏

「原创保证书」把「这道菜确实出自你手」白纸黑字写下来,「使用授权书」则把「大家可以用到什么程度」讲清楚。日后若有人端着食堂的菜谱去别处开店,老板和厨师都能从这两张纸里找到依据,分清是非。

在法律层面,DCO 的价值在于保留原创性证据。社区里每天有成千上万次提交,一旦哪天冒出「这段代码是我的」的争议,维护者只需要回溯提交记录,Signed-off-by 签名就能把贡献链条完整还原出来,快速定位是谁、在何时、提交了什么内容。CLA 的价值则在于明确授权边界:项目在重分发、修改、专利使用等环节的权利边界都由 CLA 字句界定。有些 CLA 还包含专利许可条款——贡献者不仅授权代码,也授权其中涉及的专利,让下游使用者免于被突然起诉的风险。

这也是为什么 Linux 内核用 DCO、而许多基金会项目偏向 CLA:DCO 轻量但只解决来源问题,CLA 厚重但覆盖面更广。从法律实效看,两条轨道都是为了同一件事——让任何一次代码使用行为都不超出贡献者同意的范围。用集合的语言描述:

食堂能够长久开下去,不是因为大家都自觉,而是因为每个关键环节都留下了「白纸黑字」。DCO 和 CLA 就是开源世界里最基础的护栏——它们不阻挡创造,只阻挡越界。

∀c∈code:use(c)⊆grant(c)\forall c \in \text{code}: \text{use}(c) \subseteq \text{grant}(c)
这个公式表示:对于仓库中的每一段代码 c,项目对它的使用行为 use(c),都必须被包含在 CLA 授予的权利范围 grant(c) 之内,不会越界。
  1. c ∈ code遍历仓库中的每一段代码,一条都不能遗漏。
    c∈codec \in \text{code}
  2. use(c)项目实际对这段代码做的各种事情,比如复制、修改、分发。
    use(c)\text{use}(c)
  3. grant(c)许可证与协议明确授予的权利范围。
    grant(c)\text{grant}(c)
  4. 包含于 ⊆所有使用行为都必须落在授权边界以内,越界即侵权。
    A⊆BA \subseteq B

维护者视角:开店先设验菜台

食堂老板的职责不光是收菜,更要在门口立好「验菜台」。新菜端上来先看三样:有没有原创保证书,有没有使用授权书,菜本身有没有抄袭嫌疑。三道关都过了,才允许上架。项目维护者面对如潮水般涌来的 PR,同样需要一套可复用的验菜流程。

最基础的一步,是检查提交信息里是否包含 Signed-off-by 签名。但靠人肉翻提交记录不现实,所以成熟项目会引入 DCO Bot 做自动拦截:只要发现提交缺少签名,机器人就在 PR 上打红叉。与此配套,维护者还要接入 CLA Assistant,在贡献者首次提交时自动弹出授权页面,把 CLA 签署变成「进门先换鞋」式的固定动作。

除了工具,文档同样重要。维护者应在 CONTRIBUTING.md(贡献指南)里写明流程:提交前阅读 DCO 文本、何时需要签署 CLA、遇到疑问找谁咨询。对于不活跃的贡献者或代表组织提交的开发者,额外保留沟通记录也很有价值——这些记录在日后发生纠纷时,和签名一样能当证据。一个贡献是否能被接受,本质上是一道三重关卡:

从某种意义上说,开源食堂的「菜单」就是项目的主分支。每一道新菜上架前都要经过验菜台,这既是对食客负责,也是对端菜的人负责——有了这套关卡,大家的信任才能沉淀成社区的长期资产。

Amerge(p)=Rdco(p)⋅Rcla(p)⋅Rreview(p)A_{\text{merge}}(p) = R_{\text{dco}}(p) \cdot R_{\text{cla}}(p) \cdot R_{\text{review}}(p)
这个公式表示:PR p 能否合并,是由三项检查的乘积决定的——DCO 检查、CLA 检查、代码评审全部通过(都等于 1),乘积才为 1,结果才为「可合并」。
  1. A_merge(p)针对这个 PR 的最终合并决策,1 表示通过,0 表示拒绝。
    Amerge(p)A_{merge}(p)
  2. R_dco(p)DCO 签名检查结果,通过为 1,缺失为 0。
    Rdco(p)R_{dco}(p)
  3. R_cla(p)CLA 授权检查结果,已签署为 1,未签为 0。
    Rcla(p)R_{cla}(p)
  4. R_review(p)代码评审结果,维护者确认质量达标为 1。
    Rreview(p)R_{review}(p)
  5. 三项连乘任何一项为 0,整体立即变 0——这就是「一道关不过,全部退回」。
    A=x⋅y⋅zA = x \cdot y \cdot z

企业策略:总部统一对接

连锁餐厅集团旗下有几百位厨师,都在开源食堂里做菜。如果每位厨师按自己理解随便签字,总部根本不知道自家菜谱被授权到了哪里。于是总部派出一位「签约专员」,统一对接食堂的授权流程。在真实世界里,这个角色叫 OSPO(开源项目办公室)。

企业参与开源时,最怕的是「个人行为」与「公司资产」的边界模糊。员工以个人身份提交代码,但代码很可能是工作时间写的,版权归属公司。如果员工随手一点签了 CLA,等于把公司的知识产权授权了出去。因此大型企业通常要求:所有对外贡献必须走审批流程,由法务确认 CLA 的适用范围,以公司名义统一签署并记录在案。

落地时,企业可以建立「贡献白名单」:按项目分类,给不同仓库授予不同的授权范围;为高频贡献者提供模板化签署指引,降低操作门槛。对于可能涉及核心专利的代码,提交前必须做内部审查,避免无意间把关键专利赠予他人。从全局视角看,企业整体的授权覆盖是所有成员授权的并集:

就像连锁集团不能指望每个厨师都懂法律一样,企业内部也需要一名「签约专员」把流程标准化。统一的审批、统一的签署、统一的台账——这三件套做扎实了,几百位厨师的贡献才不会变成一团乱麻。

Entcover=⋃e∈ECLAe\text{Ent}_{\text{cover}} = \bigcup_{e \in E} \text{CLA}_e
这个公式表示:企业的总授权覆盖范围 Ent_cover,等于企业内每一位贡献者 e 所签署的 CLA 授权范围的并集。任何一个角落漏签,整体覆盖就会出现空洞。
  1. E企业内所有参与开源贡献的开发者集合。
    EE
  2. CLA_e某一位贡献者或某一次签署所产生的授权范围。
    CLAe\text{CLA}_e
  3. 并集 ∪把所有授权范围叠加起来,取最大覆盖。
    ⋃e∈E\bigcup_{e \in E}
  4. Ent_cover企业整体可对外声明的授权覆盖范围,它是判断企业合规姿态的核心指标。
    Entcover\text{Ent}_{cover}

风险防范:守住三道防线

有位厨师偷懒,没贴原创保证书就把菜递了上来,结果这道菜其实是隔壁大厨的秘方。老板差点被告上法庭。这件事让全食堂明白:合规防线一旦失守,代价远远大于签字的五分钟。

实际项目中,法律风险通常出在三个环节:一是代码没有签名,来源成谜;二是员工个人提交,擅自把自己写的但版权归公司的代码授权出去;三是 CLA 版本升级后,旧授权覆盖不足,项目用了新功能却只有旧授权。这三类风险的共同本质,都是「授权链条断了」——要么缺了一环,要么环与环之间对不上。

防范措施也因此分为三层。第一层在提交前:用 DCO Bot 拦截缺签名的提交,让问题在第一秒就暴露。第二层在运行中:定期审计 CLA 签署记录,清点仓库里有没有「无授权」的历史贡献。第三层在纠纷发生时:靠 DCO 签名和 CLA 记录还原完整的责任链,快速判断是哪一位贡献者、哪一次提交惹出的麻烦。把三条防线合起来,就是一次提交的合规得分:

食堂被找上门之后,老板把验菜台从一道升级成三道。开源项目也一样,合规不是一次性动作,而是伴随项目一生的日常习惯。只有把「拦截、审计、溯源」变成默认流程,才能在风险降临那天从容应对。

C(PR)=Dsign×Lagree×RcleanC(PR) = D_{\text{sign}} \times L_{\text{agree}} \times R_{\text{clean}}
这个公式表示:一个 PR 的综合合规得分 C(PR),等于 DCO 签名、CLA 授权、版权清洁三项指标的乘积。其中任何一项为 0,最终得分就是 0——整个提交会被一票否决。
  1. C(PR)该提交的整体合规得分,1 为安全,0 为存在硬伤。
    C(PR)C(PR)
  2. D_sign是否完成 DCO 签名,完成记 1,缺失记 0。
    DsignD_{sign}
  3. L_agree是否完成 CLA 授权,已签记 1,未签记 0。
    LagreeL_{agree}
  4. R_clean版权来源是否干净,无纠纷记 1,有疑点记 0。
    RcleanR_{clean}
  5. 三因子乘积任何一个因子为 0,合规得分即为 0,不可通过加权补偿。
    C=d×l×rC = d \times l \times r

AI 应用场景

开源项目维护者的合规流水线

阶段:工程交付与社区运营

解决的问题:人工逐个检查 PR 是否携带签名、是否签署授权,效率极低且容易漏检。传统方式靠维护者肉眼翻提交记录,PR 一多便漏洞百出。AI 辅助的自动化流水线(DCO Bot + CLA Assistant + CI 检查)可以把合规判断沉淀为代码,任何一次推送都自动跑完「验菜台」三道关。

具体案例:一个开源模型推理库每周收到上百个 PR。维护者在 CI 中加入合规检查脚本:先扫描 Signed-off-by,再查询 CLA 数据库,全部通过才允许合并。三个月后,仓库的合规率从 82% 提升到 99.6%,历史贡献者的授权状态也全部补齐。

企业开源办公室的授权管理

阶段:组织治理与知识管理

解决的问题:员工各自对外贡献,授权范围不可控,公司知识产权可能被无意出让。传统方式是发邮件层层审批,周期长、体验差。企业 OSPO 借助统一授权平台,把 CLA 签署、审批、台账记录整合到一个流程里,敏感项目自动触发法务复核。

具体案例:某 AI 公司要求员工向外部开源项目贡献前,先在内网平台提交申请。平台根据项目名自动匹配 CLA 模板,识别代码中是否含专利关键词,高风险请求转法务人工审核,低风险请求秒批通过。半年后,对外贡献量翻倍,法务介入率却下降了 60%。

法律纠纷中的证据链还原

阶段:风险审计与溯源

解决的问题:当项目被指控抄袭时,需要快速证明某段代码的合法来源。传统方式是人工翻 Git 历史,费时费力。利用 DCO 签名与 CLA 记录建立索引,再结合代码相似度分析,可以自动圈定可疑提交区间,大幅缩短纠纷应对时间。

具体案例:一家创业公司被竞争对手起诉,称其模型代码抄袭。技术团队从提交记录中提取全部 Signed-off-by 签名,对照 CLA 台账,在两天内还原出所有外部贡献的完整授权链路,最终以证据充分为由促成和解。

Python 演示

python49 行
class ContributionChecker:    """模拟开源项目的 PR 合规检查器"""     def __init__(self):        self.records = {}   # PR 编号 -> 授权状态字典     def check_dco(self, commit_msg):        """检查提交信息中是否包含 DCO 签名"""        return "Signed-off-by:" in commit_msg     def check_cla(self, pr_id):        """查询该 PR 的 CLA 签署状态"""        return self.records.get(pr_id, {}).get("cla_signed", False)     def evaluate(self, pr_id, commit_msg):        """综合判定一个 PR 是否可以合并"""        dco_ok = self.check_dco(commit_msg)        cla_ok = self.check_cla(pr_id)        mergeable = dco_ok and cla_ok        return {            "pr_id": pr_id,            "dco": dco_ok,            "cla": cla_ok,            "mergeable": mergeable        }  def main():    checker = ContributionChecker()    pr_list = [        {            "pr_id": 101,            "msg": "feat: add model API\n\nSigned-off-by: Alice <alice@corp.com>",            "cla": True        },        {            "pr_id": 102,            "msg": "fix: typo in README",            "cla": False        }    ]    for item in pr_list:        checker.records[item["pr_id"]] = {"cla_signed": item["cla"]}        result = checker.evaluate(item["pr_id"], item["msg"])        print(result)  if __name__ == "__main__":    main()
目的:实现一个极简合规检查器,模拟维护者判定 PR 是否同时满足 DCO 与 CLA 两项要求,对应正文中「合规贡献 = 原创声明 ∧ 使用授权」的核心公式。
  1. return "Signed-off-by:" in commit_msg这一行是 DCO 检查的本质:在提交信息里查找签名标记,找到即通过。
  2. self.records.get(pr_id, {}).get("cla_signed", False)从授权台账中取状态,查不到就默认为未签署,保证判定偏保守。
  3. mergeable = dco_ok and cla_ok与合规公式一一对应:两个条件同时为真,合并资格才为真。
  4. checker.records[item["pr_id"]] = {"cla_signed": item["cla"]}模拟贡献者在平台上的签署动作,把授权状态登记入账。
  5. if __name__ == "__main__":Python 标准入口写法,确保脚本被直接运行时才执行测试数据。

常见误区

误区「反正都是签字,签哪个不都一样?挑个简单的不就行了?」

正解DCO 与 CLA 解决的是两个不同的问题。DCO 是「来源声明」,证明代码是你写的或你有权提交;CLA 是「权利授权」,决定项目能不能用、能用多少。只签 DCO,项目方没有合法的使用权利;只签 CLA,来源不明同样埋雷。它们的关系就像「房产证」与「出租协议」——一个证明房子是你的,一个允许别人住进去,缺了任何一张,交易都做不成。

为何常见:因为表面看起来都是「提交时签个字」,初学者很容易把两个流程混为一谈,忽视了它们背后的法律性质完全不同。

误区「我是做 AI 应用的,又不是搞内核的,DCO 离我太远了。」

正解DCO 早已被大量项目采用,如今很多知名 AI 与云原生项目都要求提交信息包含 Signed-off-by。更重要的是,DCO 背后的「来源可追溯」思想是所有开源项目的通用需求,哪怕项目没有强制 DCO,养成为提交签名、保留沟通记录的习惯,对个人和公司都是保护。

为何常见:因为 DCO 最早从 Linux 内核社区出圈,各种文章都拿内核举例,让新人误以为它是「上古项目专属」的古老规矩。

误区「我用个人 GitHub 账号提交,代码是我写的,不需要公司批准。」

正解如果代码是工作时间写的、用公司的设备或数据完成的,版权可能依法归属公司。个人账号提交并不能切断这层关系,反而可能让公司在不知情的情况下被「代表」签署了 CLA。稳妥的做法是经公司内部审批后以组织身份提交,或至少让法务知晓。

为何常见:人们习惯把「账号归属」等同于「权利归属」,忽略了职务作品、公司资源等实际因素对版权的影响。

误区「平台上弹出 CLA 协议,我点一下同意、机器人就自动签好了,这不算一回事吧?」

正解点「同意」本身就是法律意义上的签署行为,平台记录就是授权证据。所谓「自动」只是流程自动化,不代表免责。签署前必须真正读一遍条款,弄清楚授权范围、期限和撤回方式。特别是企业员工,点击同意前应当确认这在自己被授权的范围内。

为何常见:自动化工具让签署过程变得极其顺滑,几秒钟的点击消解了仪式感,让人误以为它「无关紧要」。

面试题

Q1. DCO 的核心含义是什么?

单选题 · easy

  • A.开发者信用排序
  • B.开发者原创声明← 正确答案
  • C.数字版权办公室
  • D.域名控制源文件

答案:B。DCO 是 Developer Certificate of Origin 的缩写,本质是开发者对代码来源的原创声明。它像「原创保证书」,证明代码是自己写的或有权提交;而「信用排序」「版权办公室」等说法只是相似词语的干扰项。

Q2. CLA 主要解决什么问题?

单选题 · easy

  • A.防止代码抄袭
  • B.授予项目使用许可← 正确答案
  • C.保证代码质量优秀
  • D.管理 Git 分支冲突

答案:B。CLA(贡献者许可协议)的核心是「授权」,解决的是项目能不能用、能用多少的问题。防止抄袭是 DCO 的职责,保证代码质量是评审的职责,管理分支是 Git 工具自身的职责。

Q3. DCO 的签署方式是什么?

单选题 · mid

  • A.提交信息加 Signed-off-by← 正确答案
  • B.GitHub 后台点击同意
  • C.向维护者发送邮件
  • D.代码头部加注释

答案:A。DCO 的签署方式是在每次提交的说明信息末尾加上一行 Signed-off-by: 姓名 <邮箱>。在平台后台点击同意是 CLA 的签署方式;发邮件和加注释都不是社区约定的签名形式。

Q4. 大企业偏好 CLA 的主要原因是什么?

单选题 · mid

  • A.审批流程执行更快
  • B.覆盖专利授权更广← 正确答案
  • C.不需要法务参与
  • D.仅适用商业项目

答案:B。CLA 通常包含更完整的授权条款,除了代码授权还覆盖专利许可。企业为了获得明确的权利边界、避免被下游追责,往往愿意走更重的 CLA 流程。它并不会更快,反而通常需要法务参与,也并非只适用于商业项目。

Q5. 维护者最合规的贡献接受流程是什么?

单选题 · mid

  • A.只看代码质量直接合并
  • B.自动化校验两项签署← 正确答案
  • C.私信确认即可合并
  • D.无需记录授权关系

答案:B。合规流程要求先检查 DCO 签名、再确认 CLA 授权,最好用 DCO Bot 和 CLA Assistant 自动化完成。只看代码质量会忽略授权风险,私信确认没有证据效力,不记录授权关系则纠纷时无从溯源。

Q6. CLA 版本更新后,项目方最需要警惕什么?

单选题 · hard

  • A.旧授权永久自动有效
  • B.覆盖不足导致边界模糊← 正确答案
  • C.旧授权立即全部废止
  • D.新旧版本完全等同

答案:B。新功能可能需要更宽的授权范围,而旧版本 CLA 覆盖不足会导致「用了却没授权」的灰色地带。旧授权不会自动永久有效,通常也不会立即废止,新旧版本更不是简单等同,而是需要在版本切换时重新梳理。

Q7. 以下哪些工具用于开源合规检查?

多选题 · easy

  • A.DCO 检查机器人← 正确答案
  • B.CLA 签署助手← 正确答案
  • C.VSCode 编辑器
  • D.Docker 容器平台

答案:AB。DCO Bot(DCO 检查机器人)自动扫描提交签名,CLA Assistant(CLA 签署助手)引导贡献者完成授权,二者是合规检查的常用工具。VSCode 是编辑器,Docker 是容器平台,它们与版权授权流程无关。

Q8. 企业参与开源时,哪些属于合规管理策略?

多选题 · mid

  • A.建立贡献审批流程← 正确答案
  • B.法务统一审查授权← 正确答案
  • C.员工各自随意签署
  • D.记录统一授权台账← 正确答案

答案:ABD。规范的策略是「审批 + 法务 + 台账」三件套:贡献前审批、法务把关授权范围、签署记录统一归档。员工各自随意签署恰恰是风险来源,会让企业知识产权在无人知晓的情况下被授权出去。

Q9. 员工以个人身份提交公司代码的主要风险是什么?

单选题 · hard

  • A.代码更容易通过审查
  • B.公司知识产权被擅自授权← 正确答案
  • C.代码质量获得自动提升
  • D.无需进行任何风险防范

答案:B。职务作品的版权可能归公司所有,员工以个人账号提交并签署 CLA,等于在未经授权的情况下把公司知识产权许可给了外部项目。这与代码质量无关,更不是「更容易过审」的理由,反而需要更严格的风险防范。

Q10. 以下哪些行为可能导致授权链条断裂?

多选题 · hard

  • A.忘记添加签署签名← 正确答案
  • B.未签署 CLA 就合并← 正确答案
  • C.定期审计契约记录
  • D.员工离职未做交接← 正确答案

答案:ABD。缺少 DCO 签名会让来源无法追溯,未签 CLA 就合并意味着项目使用了没有授权的代码,员工离职未交接则会让企业无法掌握既有授权情况——这三种都会切断授权链条。定期审计契约记录恰恰是修复链条的正向动作。