人们也可从这里下载 1.0 版本指南的 PDF。
TODO 社区对通过这个仓库收到用于改进的修正和建议表示感谢,它包含有 TODO 指南的最新版本的文档。
简介
目标与受众
本指南旨在指导公司如何为开源项目做出贡献或者发起一个开源项目(也叫做“对外开源”)。它旨在描述一个完整且精简的流程,该流程能够被任何规模(包括大型、小型或者中型)实施。公司可以根据自己的需求调整所提议的程序。例如,根据公司的规模和情况,并非所有的步骤都需要实施。
成熟度级别
开源软件(OSS)的企业采纳情况通常可以根据成熟度模型进行分类。这些层级描述了 OSS 是如何以一种越来越有效地方式创造价值和满足业务需求。区分不同成熟度层级的一个显著因素是组织如何处理外向型开源软件。一个关键的认知是,对开源生态系统的影响主要是通过参与和贡献开源项目来实现的。
公司开源采纳的一个典型的成熟度模型如下(例如,参见 Haddad:开源项目办公室):
- 拒绝-没有或者没有使用开源软件的意识
- 消费-被动的使用开源软件
- 参与-加入开源社区
- 贡献-务实的为开源项目做贡献
- 领导层-战略性参与开源以推动业务价值
要想从一个级别提升到另一个级别,需要采取一定的措施,并具备相应的结构和组织要素。
从单纯的使用转变为积极参与的过程需要循序渐进。初期可以从非正式的、投入较少的活动开始,例如报告上游项目的漏洞。这类活动往往出于解决技术需求的考虑。在这个阶段,有关开源软件贡献的决策通常是临时性的,仅针对个别情况做出。
确立专门的决策流程和正式的贡献政策将引领开源迈向下一个层级。这一级别的一个典型的步骤是建立开源项目办公室 (Open Source Program Office),以支持开源参与并维护开源战略和流程。
在领导层级别,开源贡献的流程已经成熟且具备可扩展性。相应的工具链也已经到位。如果有必要且合适,将启动旨在创建新的开源社区的自有项目。这通常会伴随着利用开源基金会来推动跨公司协作,并战略性地利用开源来加速创造商业价值。
公司可能决定不升级到基于更多贡献的级别,当然,即使不贡献,也可以建立成熟的流程来使用开源软件。然而,大多数情况下,公司都会感受到一些回馈压力。这种压力可能来源于实际的技术需求(例如,缺少功能或者需要漏洞修复是向开源项目贡献的典型原因),或来自于在开源生态系统中承担责任的期望,或来自于从开原模型中获益的渴望。
公司如何管理开源:开源项目办公室
随着参与开源软件的程度加深,越来越多的组织意识到企业内部开源管理以及开源生态系统固有复杂关系带来的挑战。因此,有许多组织开始成立开源项目办公室(Open Source Program Offices,OSPOs),或者叫一些其他名称,例如开源技术中心,开源社区发展团队等。OSPOs 是组织内部专门负责支持、培育、分享、解释和推动开源发展的地方。有了这样的办公室,企业可以以明确地条款和职责来制定和执行其开源战略,为领导者、开发人员、营销人员和其他员工提供所需的流程和工具,帮助他们在运营中成功运用开源。
针对如何启动开源项目办公室(OSPO),TODO Group 提供了一系列指南。对于刚接触该主题的公司而言,可以优先查看如何创建一个开源项目指南。
开源贡献的动机
投身开源项目或者发起新项目的动机多种多样。这里,我们仅列举部分示例.
高效和高质量的构建软件
使用开源软件通常可以加快开发的速度并降低开发的成本,因为您可以利用现有的经过功能测试的代码进行构建。然而,一个存在的风险是社区可能无法迅速地提供所需的功能或者漏洞修复。为了缓解这一风险,培养必要的技能并自行创建这些漏洞修复和/或功能可能是有意义的。将它们回馈给上游项目具有重要的好处:
- 可以直接在自己的产品和服务中直接使用上游版本
- 在更短的时间周期内使用更多的功能
- 在更短的时间周期内实现更高的质量
- 获得核心专家支持
实施战略影响
除了上面提到的开源软件在开发速度和质量的优势外,为开源项目做贡献在战略层面也很重要。在开源世界中,声誉和影响力通常是通过参与社区和贡献来建立的。因此,对开源项目的贡献有助于…
- 影响上游开源项目的发展方向
- 获得开源软件包(共同)的版权
- 获取所有对软件感兴趣的人的创造力
有时,公司倾向于使用金钱来施加影响。但在开源项目中这并不是最有效的方法。影响力的“货币”是贡献,因为开源项目通常更多地由个人的工作驱动,而不是委员会的决策。因此,与单纯成为某个组织的成员或者支付支持费或其他服务相比,贡献代码更加直接、更有效。
开源社区(尤其是那些由大的开源基金会运营的)为公司和其他组织之间的合作提供了一个中立的场所。因此,开源方式可以为公司提供与供应商、客户、合作伙伴甚至竞争对手合作的新途径,仅举一些行业或领域特定的项目为例,如 Linux Foundation Energy 或 Eclipse Tractus-X。建立开源社区也是创建和维护生态系统以及建立事实标准的有力手段。
吸引,培养并留住人才
软件(因此也包括开源软件)在许多的产品和领域变得越来越普遍。因此,对于许多公司来说,拥有一个技术成熟且积极进取的软件开发团队至关重要。这不仅适用于软件或者云计算公司,也适用于其他行业的公司,例如将软件越来越多地集成到产品中的传统硬件制造商,或者因数字化转型而越来越依赖软件的其他公司。一项包含开源贡献和社区参与的开源战略可以起到一下支持作用:
- 提高开发者的满意度
- 通过核心专家对每项贡献进行同行评审,提高软件质量和提升开发者的技能
- 将公司塑造成有吸引力的主顾
- 提高公司声誉,从而提高开发者在其社区中的地位。
回馈并维持开源的可持续性
开源软件的发展依赖于其社区。如上所述,开源软件的使用有助于降低成本并且加速开发,但这唯一的可能是因为项目背后拥有维护软件的社区。为了保持开源软件开发模式的可持续性,每个开源软件的使用者都有责任思考如何支持这些项目。以下是一些参与和支持的方式:
- 在代码,文档,时间(例如通过软件测试)方面的贡献
- 资金支持(一些重要项目是由开发者在业余时间维护的,因此只能为项目投入有限的时间)
- 举办并支持编程马拉松活动
需要理解的是,虽然使用开源软件无需支付许可费用,但它并非免费可用。为保持这些项目对用户的吸引力,需要稳定的参与和支持。因此,制定适宜的开源贡献战略至关重要。
如何为开源软件(OSS)做贡献
与开源软件生态系统构建良好的关系具有其自身的一系列挑战,但是如果你有一个清晰地计划可供遵循,这会变得更容易。这里给出一些组织可以采纳的多种实践指南。
明确你的开源目标和战略
你的开源战略将管理、参与和创建开源软件的计划与这些计划服务的业务目标相结合。这可以带来许多机会并促进创新。TODO Group 提供了一份关于制定开源战略 的专门指南。
建立开源指导原则与流程
指导原则
以下描述的流程旨在确保公司利益及其员工得到保护。我们还需要确保所做的贡献符合版权法、出口规定、数据保护规定和开源开发的最佳实践。另一方面,对于所有涉及的利益相关者来说,流程负担应尽可能低,审批流程也不应该花费太多时间。
责任:决策权在于部门
- 审批流程由资助相关代码开发的组织负责
- 如果受影响的代码/知识产权(IP)由其他部门使用、共同开发或共同资助,则应将其作为发布决策的利益相关者参与进来
流程的一般结构和范围
精简流程
- 开发者需要执行的任务应清晰、简单,并尽可能减少工作量
- “后端任务”潜在的复杂性不应该让开发者看到。要求的当前状态应该对开发者可见
边界条件
- 保护我们的员工和商业利益
- 遵守法律以及内部和外部的规定。
- 向决策者提供提供透明度,说明公司的那些代码和知识产权将受到发布的影响,以及影响程度
- 所有贡献应该使用“公司”邮箱进行( GitHub 活动也类似),以便轻松识别公司的所有贡献
- 尊重开源生态系统和目标开源项目的规则和惯例
公司审批贡献流程
为何需要审批流程?
为何需要遵循特定的程序?
首先,版权发有明确规定。
例如,《德国版权法》第 69b 条规定:受雇于某人或为某人服务的作者(1)若计算机程序是雇员在其职责范围内或按照雇主的指示创作的,则雇主应独家享有对该计算机程序的所有经济权利,另有约定的除外。
来源:《德国版权法》
这意味着,在此背景下开发的所有软件均属于雇主的财产,即开发人员工作的公司所有。《德国版权法》至少没有将所有权限定于工作时间或公司IT基础设施内开发的代码,它只界定了背景范围。
其次,需要遵循一定的程序来确保公司的商业利益以及保护员工。最后,公开代码既是公司的商业名片,也是编写该代码的开发者的名片。
对外贡献者许可协议(CLA)
一些开源软件项目以及开源软件基金会,在接受贡献之前,会要求签署贡献者许可协议(CLA)。我们至少知道两种不同类型的 CLA:
- 企业贡献者许可协议(CCLA)
- 个人贡献者许可协议(ICLA)
项目是否不需要,或者需要其中一种或两种 CLA,通常会在项目仓库中的 CONTRIBUTING.md 等文件中说明。APache 基金会制定的 CCLA 和 ICLA 是 CLA 的实际标准,许多开源软件项目已经采用其中的一种或者两种。
贡献者协议(CLA)的目的是给开源软件(OSS)项目提供信心,即贡献者有权提交其贡献。开发者原创证书(DCO)是一种替代方法,与CLA相比更加轻量级。
一些贡献者协议(CLA)还会要求将额外的权利转移给项目,例如以额外的、通常是专有许可证发布代码的权利。这是一种不对等的设置,不利于贡献者。因此大多数公司将不会向此类项目贡献代码。
开源软件项目提升信心的代价是贡献者所在的组织需要承担更多的额外工作。尤其是在拥有多家附属公司的大型企业中,评估、签署和维护企业贡献者许可协议(CCLA)所需的工作量不容小觑。
为什么大型组织使用企业贡献者协议(CCLA)会带来额外的工作量?让我们以 Apache 基金会的 CCLA 为例来简单的看一下为什么造成这种情况:
- CCLA 是一个合同——在许多组织中,都实行“四眼原则”——合同必须由两名有权代表组织签署合同的人员签署——可能需要另外两名利益相关者的参与,这需要在像他们进行情况介绍方面付出额外的努力。
- 通常 CCLA 不仅覆盖贡献者所工作的特定法律实体,还覆盖其所有附属公司:
- 对于法律实体而言,做出贡献的实体以及控制的实体、被该实体控制或与该实体处于共同控制之下的所有其他实体都被视为单个贡献者。在本定义中,“控制”是指 (i) 直接或间接拥有导致该实体方向或管理发生变化的权力,无论是通过合同还是其他方式。(ii) 拥有该实体已发行股份的百分之五十(50%)或更多,或 (iii) 对该实体享有受益所有权。
- CCLA 除了包括版权授权外,还包括专利授予。这没什么问题,不过,组织内部的“知识产权部门”需要参与 CCLA 的评估过程,并针对具体的贡献,“知识产权部门”还需要与所有附属公司进行同步。
- CCLA 需要被组织的“法律部门”分析。
一些 CCLA 要求将贡献的版权转让给 OSS 项目/基金会。版权转让是一个需要付出更多努力的话题,并且可能根本不会被接受。
除了上面提及的额外工作,CCLA 还给组织增加了额外的“维护工作”,因为它要求组织提名所有有资格的贡献者的姓名给 CCLA 要求方。
您有责任在需要变更代表公司提交贡献的指定员工名单或公司与基金会之间的联系人时,及时通知基金会。
签署的 CCLA 必须在公司内部公开——这可以通过在 OSPOs 网站上易于员工发现的位置上发布 CCLA 实现(例如,设立一个名为 CCLAs 的“顶层页面”可能很有用,该页面包含“已签署 CCLAs”列表,“正在评估的 CCLAs”列表,以及“已经拒绝的 CCLAs”列表。
所有附属公司都需要得到通知,并需要确定一个流程,以明确附属公司如何提名或取消提名为他们工作的贡献者。如果附属公司无法访问签署实体的内部网络,情况将变得更加复杂。在这种情况下,需要将已签署的 CCLA 或关于已签署 CCLA 的信息发送给所有附属公司的 OSPO。如果附属公司没有设立 OSPO,则必须将信息转发给负责软件开发的相关部门。所有附属公司需要提供已提名贡献者或前贡献者的姓名,这些贡献者将不再有权向签署实体的 OSPO 做出贡献,然后 OSPO 必须向基金会/项目通报贡献者名单的变更情况。
在组织内部公布贡献者名单并向基金会/项目披露名单,可能还需要相关实体的数据保护官的批准。
这些额外的努力可能阻止组织向上游的开源软件(OSS)贡献小的漏洞修复、补丁甚至是新的功能,从而使他们面临私有分叉的风险,最终在长远来看带来大量额外的开发工作。因此,关于是否进行贡献的决策需要非常谨慎地做出。
与 CLA 相比,DCO 是一个更轻量级的过程。它被引入是为了增强人们对 Linux 内核贡献者所做贡献是“合法正确”的信心。许多开源项目都使用 DCO 1.1 版本。
DCO 与 CLA 相比主要的区别在于,DCA 不是一份合同,而是一种来自特定贡献者的证明,表明他们有权提交具体的贡献代码。因此,签署和维护 CLA 所花费的精力在 DCO 中是不需要的。需要执行的任务仅有:
- “法务部门”对 DCO 进行评估
- “知识产权部门”进行评估。
- 特定贡献者进行评估,判断其是否可接受。
因为 DCO 1.1 版本是“标准”,因此“法务部门”和“知识产权部门”仅需要花费很少的精力。
向现有项目贡献的流程
发布已开发的代码所处的业务环境越复杂,涉及的利益相关者就越多。下图展示了一个涉及所有职能的程序,即使在复杂的情况下也能适用。
使用的缩写
- CLA = 贡献者许可协议
- DCO = 开发者起源证书
- ECC = 出口管制与海关
- IP = 知识产权
上述过程不适合频繁贡献者和/或在日常工作中“上游”工作的贡献者。对于这些开发者,需要建立不同的流程,以避免给他们承担“非生产性”工作负担。组织中可以建立不同的共享模型,以满足不同的需求。
贡献模式
以下方法适合这类开发者:
- 小型贡献模式
- 主要版本到主要版本的发布模式
- 完全信任模式
小型贡献模式或者微贡献模式
小型或者微型贡献是指对现有开源软件进行一些较小且简单的改动。这类贡献的典型例子包括漏洞修复,但这些漏洞的知识产权价值通常较低或者没有。
以下情况不属于微型更改:
- 功能的添加或改动
- 开源软件组件的接口更改
- 显著提升性能的优化
- 包含对软件工程师而言并非显而易见的设计或算法
该程序适用于小贡献。在首次向特定开源开源软件项目或组件贡献代码后,可以对小贡献或微型贡献采用该程序。首次贡献必须经过完整流程(如上所述),因为该项目可能需要检查并签署贡献者协议(CLA)/开发者证书(DCO)等文件。在首次贡献代码后,所有后续的小型贡献都可以直接提交给该开源软件项目,无需再遵循既定程序,也不管该项目处于哪个版本。
主要版本到主要版本的发布模式
该过程规定了向开源软件项目提交贡献的发布周期。它与其他任何贡献具有相同的“起点”——首次贡献必须遵循完整流程,以便确认贡献者协议(CLA)/开发者证书(DCO)等事宜,并获得对特定项目的贡献许可。在首次贡献之后,在新主要版本的开发期间,所有后续贡献都可以直接贡献给开源软件项目,而无需经过审批流程。对贡献的大小没有限制。贡献可以是从简单的错误修复到添加新功能、更改接口、重构等。在项目主要版本发布后,针对主要版本发布后的首次贡献,必须启动新的审批程序。
完全信任模式
完全信任模式适用于已经成功遵循主要版本到主要版本发布模式的开发者。这是一种对员工的激励以及雇主对员工信任的表现。基本上,它是允许开发者在没有任何审批程序的情况下“上游”工作的许可。由于该模式仅在开发人员已经成功遵循主要版本到主要版本发布的模式后才会应用,因此无需再进行包含完整审批程序的“初始”贡献,尽管处于文档记录的目的进行初始贡献仍然是合理的。
主要版本到主要版本的发布模式以及完全信任模式应当只能由高级开发者来实施,他们应当接受过专门的版权原则培训,对他们所工作的公司的商业利益有深入的了解,践行“主人翁文化”,并在开源生态系统中拥有丰富经验。
为了追踪所有贡献,开发者们应当使用其官方电子邮件地址进行贡献。
批准项目贡献
另一种模式是为具体的项目提供审批。这些项目已经被例如 OSPO 进行检查,如果一切就绪,允许员工贡献代码,则项目会被批准接受贡献。然后,对于每个具体的贡献就不再需要进行单独审批。但是,如果项目的总体条件发生改变,例如许可证或者引入 CLA 等,项目需要由 OSPO 重新进行批准。
这种模式的前提条件是贡献者们具备自主进行贡献的资格。这可以通过确保贡献者们已经受到培训和/或追踪和批准哪些人可以向哪些仓库贡献代码来实现。
业余时间贡献——也称为“兼职”
当员工们想要在业余时间为不属于公司范畴的开源软件(OSS)项目做贡献时,应该怎么做?
在这种情况下,版权所有权将归开发人员所有(假设他们不是为其他实体开发软件)。为了清楚起见,可以实施以下程序:
开发者告知他或她的经理打算为某个项目(不属于德国版权法的第 69b 中的范围)做出贡献的意向。如果经理没有异议,他/她可以起草一份简短的说明,至少包括以下内容:
- 会议日期
- 员工希望参与贡献的项目
- 预计每周投入的时间
- 经理的批准
- 开发者的签名
- 经理的签名
可以将这份说明发送给人力资源(HR)部门,并将其保存在员工的人事档案中。
该程序提供了透明性,尤其是在那些涉及多个软件技术领域的大型企业情况下。
下面的例子将阐述为什么这样的程序是有意义的:
例如,根据职责,开发者可能是实现 Linux 内核驱动。开发者另一个感兴趣的领域比如是人工智能(AI),其想要在业余时间为 AI 项目做贡献。由于 AI 项目与 Linux 内核驱动开发没有关系,因此开发者对自己贡献的代码拥有版权以及版权所有权不用转移给雇主。开发者在贡献代码时不需要经过雇主批准。
但是,当开发者决定转到公司内部另一个开发 AI 的部门时会怎么样?突然之间,以前被视为“兼职”的工作现在就属于著作拳法第 69b 条的规定,著作权的所有者也变成了雇主。
上述程序在整个过程中提供了关于版权所有权及其变更的透明度。
培训
开源项目贡献者需要一定程度的自主性才能发挥作用。对一些公司软件开发者来说,参与开源社区也是一个新兴事物。出于这些原因,支持企业贡献者并为他们提供培训或其他类似手段,帮助他们发展理解和技能,以代表公司成为开源世界的好公民,这一点至关重要。
这些可以通过指导,良好的实践指南,或者培训来实现,其包括以下主题:
- 开源的法律问题的基础知识,例如版权,许可证,CLAs,DCOs,商标等。
- 了解公司对于开源贡献的规则和政策。
- 开源社区文化
- 典型的开源开发流程
- 开源治理的不同形式,例如基金会或者单一供应商项目
- 公开工作
- 处理开源项目和公司之间的利益冲突
- 在遇到疑问和问题时,从哪里获取内部支持?
启动开源项目
动机
有许多好的理由启动自己的开源项目。请查看介绍中描述的如此做的动机。
启动一个新的开源项目与产品发布类似,它首先是一个软件开发项目——在规划、预算、人员配备和测试等方面,它与内部软件项目开发没有区别——唯一的区别是,所有工作都在公共领域进行。请注意,公开可用的源代码是组织在软件生态系统中的“名片”,也是其维护者的“名片”。
当考虑启动自己的开源项目时,这里有几个阶段你应当考虑:
项目生命周期
开源项目的生命周期描述了项目从构思到退役或者生命周期结束阶段的演变过程。通常,一个项目是为了解决某个特定的问题而产生的。它可能会因为问题不在存在或因为其他项目更适合解决该问题而变得过时。下面的图展示了开源软件项目可能经历的不同阶段。
规划或者构思阶段
这是每个开源项目的开始。它也可以被称为“初始化阶段”。通常,在该阶段,只有一个想法存在或者一个特定的已经明确的问题需要解决方案。在这个阶段,开源项目具有以下的典型特征。
- 项目打算解决的问题已经被明确的定义。
- 目前还没有源代码可用,或者源代码只能内部使用。在第一种情况下,项目仅作为想法存在;在第二种情况下,项目可能已经作为一个内部项目开始,并且还没有被公开。
- 可能这个想法已经与社区分享来获得反馈。然而,要注意的是,分享这样仅在公司内部讨论过的想法,需要事先获得批准。
在启动一个项目之前,合理的做法是获得以下关键问题的答案:
- 是否有可能与现在的开源项目合作?
- 我们能使用开源软件(OSS)模式发起和维护项目吗?
- 成功的要素是什么?我们怎么衡量它?
- 我们能否从财务上资助这个项目?我们是否有一个内部的执行推动者?
- 这个项目是否能够吸引外部企业参与(从一开始)?
- 是否有足够的外在兴趣来形成和壮大开发者社区?
(来源:Linux 基金会)
另外,在规划阶段还应考虑以下几个方面:
项目的目标是什么?它能解决问题吗?
是否有足够的资源来启动项目,并在长期内支持该项目的发展?(你还需要获得并确保赞助)
必须选择一个合适的许可证。许可证应当支持项目目标。
必须确定贡献的法律要求(例如,贡献者是否必须签署CLA或DCO)。也许你的公司对此有一个标准的做法。
执行额外的检查。例如:
- 确保所有许可义务都被履行
- 出口管制:在某些环境下,可能要求该项目必须要有一个出口管制分类编号(ECCN)
- 检查公开发布是否与现存的商标有冲突。
Linux基金会的清单包含了一系列您可能需要考虑的全面主题:
将代码捐赠给中立的,非营利性组织(即开源基金会)是否有意义,或者由贵公司拥有和运行项目并保留一定控制权?请注意,这个决定取决于项目,也可能在项目生命周期的后期再做决定。通常,项目需要先发布并引起社区的兴趣,然后才能移交给第三方组织。
设立开源项目治理结构。它规定了如何贡献或维护项目。
确定项目成员们将使用的工具和基础设施。
进行技术审查。
在公开发布之前,确保删除所有关键内容。例如:
- 对非公开组件的依赖
- 内部评论,对其他内部代码的引用等。
- 访问令牌等。
确保编码风格的一致性
代码将在哪里发布?通常情况下,代码会发布在公司拥有的组织内,并使用诸如 GitHub.com 或 GitLab.com 的代码托管平台进行托管。但是,根据具体的技术类型,也存在其他潜在的发布渠道(例如 NPM、Maven 中央仓库、PyPI)。
发布二进制文件是否有意义?如果有,发布在哪里?
确定你的网站地址和沟通方式:您如何使你的项目广为人知?为项目创建一个网站是否意义?是否有工作组?
规划你的项目生命周期。
活跃或开发阶段
项目一旦获得开源批准,并且代码已经发布可用,项目就进入了活跃开发阶段。在这个阶段,开源项目通常具有以下特点:
- 源代码公开可见
- 项目社区积极管理
- 项目能够收到来自社区的贡献。
- 基于新收到的需求,进一步的开发在进行中。
- 一个专门团队正在负责这个项目,并提供支持。
- 为使得项目有更好的知名度以及吸引更多的用户和贡献者,项目正在通过开园活动、会议讲座进行推广。
在活跃阶段,应当考虑以下方面:
- 进行市场营销:提高项目知名度(例如通过博客文章、接触潜在感兴趣的团体/公司、参加会议演讲等方式)
- 投资于社区的建设和管理
- 秉持完全透明的原则,即使目前没有外部社区,每个决策也应该公开进行。这样做非常重要,因为感兴趣的组织能够追踪所有决策,并逐步建立对项目的信任。
- 执行项目及社区的健康检查(即审查已定义的 KPI 和目标)
- 检查第三方贡献
- 规划进一步发展
- 通过修复漏洞和安全问题提供支持
成熟或者维护阶段
在某个时间点,开源项目变得成熟。这也可以称为“维护阶段”,意味着只进行错误修正,通常不再开发新功能。以下是这个阶段的特点:
- 该项目正在被活跃使用,但是从功能角度看,它可以被认为是完整的,或者至少不再需要重大的功能增强。
- 贡献主要专注于漏洞修复。功能增强只是次要,而且很少进行。
- 一个专门的团队仍然为项目提供支持,但投入的精力相对较少。
- 团队仍然需要照顾社区,但与活跃开发阶段相比,通常需要更少的精力。
- 明确告知项目进入维护阶段,且不再进行或仅进行有限的进一步开发,是一种好的做法。
- 团队应当定期对开源项目和外部社区进行定期检查。
- 漏洞修复和安全修复仍然是必需的。
废弃或者生命周期结束阶段
开源项目处在这个阶段具备以下特征:
- 对项目没有或仅有很小的兴趣
- 不再接受任何贡献
- 不再进行任何开发和新的需求
- 没有提供任何支持。
- 可能已经不再有项目团队可用。
当选择许可证时,以下的问题需要考虑:
- 开源项目的目标是什么? 当广泛采用是首要任务时,宽松的许可证是一个不错的选择;而当重点在于建立贡献者社区时,更护会的许可证可能更有优势。
- 项目所处的生态系统是否有建议或者要求的许可证? 如果项目旨在成为某个基金会或者项目的一部分,那么可能会强烈倾向于选择某种特定的许可证,例如 Apache 项目采用 Apache 许可证,Linux 内核驱动程序采用 GPL。
- 许可证如何与您的商业模式相互作用? 当您打算开源的软件支撑您业务的其他部分时,宽松许可证可能会加速其被采纳。如果您还在销售软件的专有版本,那么 copyleft 许可证可能会成为更强大的差异化因素。
- 是否存在限制许可证选择的依赖项或其他合并的代码? 例如,当合并GPL代码时,目标项目也必须采用GPL许可证。
回答这些问题可能具有挑战,并且观点会因人而异。一个简单的起点可以是使用choosealicense.com这个网站。此外,从各种来源都可以找到大量综合材料,例如Open source licenses: What, which, and why(开源许可证:是什么、选哪种以及为什么)。
建议制定许可证选择策略,以便在启动新项目时简化决策过程。
贡献者许可证协议(CLA),开发者原创证书 (DCO)
当运营一个开源向目时,你需要决定如何检查代码的来源,以及是否需要从贡献者那里获取许可证未授予的额外权利。主要有三种方式来处理这些问题:
“Inbound=Outbound”——项目接受贡献时,采用与项目发布代码相同的许可证。这意味着不需要额外的文书工作。这是一种对称的设置,其中贡献者、维护者和用户在所选许可证下享有相同的权利。对贡献者来说,门槛最低。然而,有些事情(比如更改项目的许可证)会变得困难,因为这需要得到每位贡献者的批准。
开发者原创证书(DCO)—— DCO 最早用于 Linux 内核开发,现已被许多其他项目采用。它是一种开发者通过在提交信息中包含“Signed-off-by”声明来提供的声明。通过这个声明,开发者明确表示他们拥有进行贡献所需的权利,并同意项目使用其贡献。这种方式的门槛仍然较低,但它使项目对代码的合法贡献更加放心。然而,在需要更改代码许可证的情况下,它并不起作用。
贡献者许可协议(CLA)—— CLA 是一份贡献者与项目之间的附加协议,它为项目提供了除许可则所授权之外的额外权利。如果人员代表公司贡献代码,而公司享有贡献者的工作成果的权利,那么该公司必须签署 CLA。目前存在多种不同的 CLA,有些主要确认许可证已经赋予的权利,有些提供额外的权利,例如能够以不同的许可证发布代码,例如当代码作为商业产品的一部分也以专有许可证发布时。通过 CLA,权利被集中到中心位置,因此可以更改许可证,或者将代码作为具有不同许可证产品的一部分重新发布。该协议的不对称性赋予项目方比其贡献者更多的权利,这可能会对贡献造成更大的障碍。要求公司签署 CLA 也可能成为一个不可逾越的障碍,尤其是对大型公司而言,因为检查和签署 CLA 所需的工作量和法律影响可能超过贡献的收益。
你应当制定一个策略,明确在何种情况下使用哪种方式。“Inbound=Outbound”是一种务实的方法,适用于大多数项目。DCO 是一种使贡献过程更加明确的好方法,尤其适用于具有众多贡献者的较大项目。CLA 使得贡献变得更加困难,并且需要额外的管理工作和工具。要了解大型企业面临的额外工作量和困难的详细信息,您可以查看关于向现有项目贡献的部分。
项目治理
开源项目成功的关键因素之一是其治理结构。这包含了协作的规则、策略、习惯和文化。 它决定了诸如如何做出决策、谁控制项目以及谁可以加入项目等因素。
在现有项目中,治理通常随着时间的推移而逐渐形成,从由项目创始人的实践所驱动的非正式程序,发展为在贡献指南中更为正式定义的治理结构,或者最终通过一个托管项目的正式组织基金会来制定。
当启动一个新的开源项目时,你应当决定治理结构是什么样的。这不仅仅是选择许可证的问题。你还需要决定商标或域名等资产的所有权,以及它们的使用规则。此外,您还需要决定人员如何成为提交者或维护者、版本发布和路线图的制定方式,以及决策过程的透明度等方面的政策。
对于旨在吸引大量贡献者的项目,重要的是建立一个能够提供中立平台、对不同参与者开放参与并且决策过程透明的治理结构。这可以称为开放治理。实现这一目标的一种方法是加入现有的开源基金会之一。杰出的例子包括由 CNCF(云原生计算基金会)托管的 Kubernetes 项目,以及隶属于 Eclipse 基金会的 Eclipse IDE 项目。
在其他情况下,公司可能想要保留对项目更多的控制权。这将限制其他人的贡献,但也给了公司更多的自由引导项目发展的方向。这要求分配足够多的资源来维护项目。尽管如此,实施开放治理的某些元素仍然是有帮助的,例如提高项目规划的透明度或实施宽容的商标政策以增加项目的采用率。这方面的例子包括由 Google 运营的 TensorFlow 和由 Microsoft 运营的 Visual Studio Code。
对于规模较小的项目,例如从其他项目工作中衍生出来的技术工具,也可以采用简单且不太正式的治理方式。在这种情况下,主要目标不是广泛采用或建立大型社区,而是保持透明度和与感兴趣的个人进行临时写作。这类项目往往更多地有技术需要和开发者动力驱动,而不是有总体业务需求驱动。如果这样的项目不断发展壮大,其治理方式也可以逐步演进。例如,项目可能会转移到某个基金会。在 GitHub 上可以找到无数这样的例子。
您可以从最小可行治理框架或面向开源和自由软件项目的法律问题入门找到有关开源项目治理的更详细信息和可能的入门指南。
不同的项目级别
对新开源项目设置不同的级别(“沙箱”,“孵化器”,“毕业”)是有意义的。 例如CNCF 的项目级别就是这样划分的。这是一种根据采纳度、成熟度和质量标准对项目进行分类的方法。基本思路是,新项目在一个专用空间内开始(CNCF 称之为“沙箱”,在 Meta 则为“孵化器”项目,如 “Incubator”)。在这个空间里,项目可以不断发展,并检查是否达到了在采纳和质量方面设定的目标。如果达到了,项目就可以晋升到下一个级别;如果没有,则可能会决定停止项目。这种分级制度有助于确保项目的质量和可持续性,同时也为项目提供了成长和发展的空间。
社区管理
对于大部分开源项目,围绕项目建立社区并接收贡献是一个重要目标,甚至可以说是首要目标(不过也有一些项目开源的主要目的并不是建立活跃的社区,例如通过公开源代码来建立信任,在这种情况下,获得贡献的优先级可能会较低)。这样的社区并不是自然而然形成的。启动和维持它需要计划、预算和资源。初始和持续的活动包括:
宣传项目
这包括在会议上发言,主办或赞助关键活动,以及在您的社区中建立新的倡议和计划。
创建一个温馨的环境
这包括创建开源项目政策,指南(面向维护者的基本指南,安装流程,最终用户使用指南)或改善主要的项目交流渠道(论坛、聊天讨论等)
促进协作
建立指导程序,增加项目文档(例如如何贡献、如何编写和运行测试、如何选举管理委员会等)
建议为项目分配一名社区经理,负责这些任务。TODO Group 指南启动开源项目中“构建社区”的章节包含更多信息。如需进一步阅读,我们推荐 TODO Group 指南中的“构建包容性开源社区”和“在开源社区中培养领导力”。
行为准则
营造一个安全友好的环境,让人员免受他人有害行为的侵害,是维护健康社区的重要组成部分。尤其重要的是支持多元化的社区,避免对少数群体的歧视,解决显性和隐性的偏见问题。
维护健康社区环境的一个常见要素是行为准则,它明确规定了可接受和不可接受的行为规则,并定义如何处理不可接受的行为。有许多示例和模板可以作为您行为准则的基础。一个广受欢迎的、可重复使用的行为准则是贡献者公约 (Contributor Covenant),它被诸如 Kubernetes、git、Node.js 等许多项目所采用。
作为一家公司,你需要提供一个用于举报违反行为准则情况的电子邮件地址。您需要确保该地址由能够及时响应、具备处理此类问题的能力的人员负责控制。
技术考量、工具与最佳实践
合适的工具能够节约大量时间,并显著帮助自动化流程。开源项目管理工具精选列表包含了经过验证和推荐的工具的综合列表。
用户管理
通常,Git 提供商(GitHub、GitLab、Bitbucket 等)提供定义由单个用户组成的团队以及设置团队和个人级别(访问)权限的方法。为了使用 Git 提供商的服务,工程师需创建相应的账户。此账号与工程师在公司的内部账户无关。这会带来一些挑战,因为工程师对外部仓库的访问权限可能依赖于他们在公司内的角色或者他们是否仍然在公司工作(假设工程师在为贵公司工作期间获得外部仓库的全面权限,而现在他们已经离职——您可能想要调整访问权限)。但是如何做到这一点,因为工程师在 Git 提供商的外部账户独立于其公司内部用户账户?需要某种方式在两个账号之间建立映射。对于 GitHub,可以使用开源工具 opensource-portal 来帮助创建这样的映射。它还可用于实现加入 GitHub 组织的自助服务。作为该过程的一部分,该工具会建立了 GitHub.com 账号与其对应公司内部用户账号之间的映射。映射存储在数据库中。在此基础上,可以轻松创建一些工具,定期检查数据库中包含的所有用户是否仍在贵公司任职,并在情况不成立时出发某些活动。
设置仓库
在代码仓库包含一定的文件集合(健康文件)是一个良好的做法。这些文件包含仓库的基本信息,例如描述、行为规范、许可证、贡献指南等。这些文件通常以 markdown 格式,但根据Git提供商的不同,也可以采用其他格式,例如 AsciiDoc。在这里,我们假设默认格式为 markdown,因此使用文件后缀名.md
.
README.md
此文件作为仓库的“主页”展示。它通常包含关于仓库的描述、依赖项以及下载、安装和配置说明等信息。
LICENSE 或 LICENSE.txt 包含仓库的许可证文本。
CONTRIBUTING.md 包含关于如何做出贡献的信息和说明。
CODE-OF-CONDUCT.md 包含仓库的行为准则。
GOVERNANCE.md
包含关于项目治理的信息。
SECURITY.md
包含关于如何报告仓库安全漏洞的说明。
SUPPORT.md
包含关于在出现问题时如何获得支持的信息。
对所有仓库来说,都应当包含 README.md 和许可证的文本文件。其余的文件可以被视为可选的,只在需要时才创建(例如,如果不接受任何贡献,则可以将此信息放入 README.md 中,这样就不用需要创建 CONTRIBUTING.md 文件)
为了确保始终创建某个特定健康文件集,我们可以采用以下几种方法:
- 一种方法是利用模版仓库。这些仓库包含了所需的一系列初始健康文件。您可以通过从模版仓库/复制一个新的仓库,从而使其包含所需的健康文件集。一些 Git 提供商(例如 Github)提供了特定手段 (sepecific means)来帮助您默认创建必须的健康文件。
- 另一种可能的方法是采用工具创建仓库。这类工具通过 Git 提供商(如 GitHub.com、GitLab.com、Bitbucket.org 等)的 API,基于一些输入数据来创建仓库。因此,它们可以帮助仓库符合公司指南(例如,包含所需健康文件和团队结构)。基于此类工具,可以提供自助服务来创建仓库,使开发团队能够自己创建仓库。通常,公司会根据自己的特定需求开发此类工具。我们(文档的作者们)不了解通用的仓库创建工具。
提供许可证和版权信息
开源软件项目的许可证和版权信息必须正确的声明。这对于项目的使用者和贡献者都是非常重要的。此外,源代码经常从一个项目复制到另一个项目,因此,强制所有文件都必须携带许可证和版权信息是必不可少的。
- 对于项目中由您和您公司开发的部分
- 以及作为您仓库一部分的外部组件(即外部方开发的代码)。
请注意,像有关许可条件,请查看 LICENSE.txt 这样的声明是不合适的。
来自欧洲自由软件基金会 (Free Software Foundation Europe)的 REUSE 工具支持您项目的许可和版权信息的正确声明:
- 它为许可证和版权信息提供了一个机器可读的文件格式,从而使其他人(例如扫描工具)可以轻松地提取这些信息。
- 它提供了工具用于:
- 在源代码文件中添加许可和版权信息
- 下载和存储许可文本
- 对您的仓库进行代码审查,以确保所有文件都包含了许可和版权信息。
CLA/DCO 管理
如果贡献者在可以提交贡献代码之前,必须要接受 CLA 或者 DCO,那么尽可能的自动化该过程是有益的。TODO Group 提供了一份工具列表,支持 DCOs 或 CLA 文档的管理和签署。作为例子,我们将更详细地描述 CLA Assistant。
CLA 助手 (CLA Assistant)实现了一个工作流程,要求贡献者在向 GitHub.com 上的特定仓库提交首个拉取请求时接受/签署一份文档。尽管该工具的名称为 “CLA 助手”,但它可以用于公司要求贡献者在提交拉取之前接受的任何类型的文档,包括 CLA 和 DCO。文档文本必须作为 GitHub.com 上的 gist 提供。要使用的文档/gist 可以在组织和仓库级别进行配置。CLA 助手使用默认逻辑:如果某个代码仓库没有配置特定文档,则会使用组织级别配置的文档。当贡献者首次向仓库提交拉取请求时,CLA 助手会显示文档文本,并且只有贡献者接受该文档内容后才能提交请求。接下来,当统一为贡献者提交拉取请求,他们可以直接提交,无需再次接受该文档。贡献者接受仓库文档的信息会存储在 CLA 助手的数据库中,以后可以检索。CLA 助手可以在https://cla-assistant.io/上作为托管服务提供,也可以自行托管。
凭据扫描
尽管开源政策和指南明确的要求,在公开代码之前必须移除密码、访问令牌或者其他敏感信息,但有时还是会无意中将此类重要和敏感数据推送到公共仓库。为了尽快发现此类情况(从而能够撤销已发布的敏感信息并从公共仓库中删除该数据),建议定期对此类仓库进行凭据扫描。幸运的是,所有知名的代码托管平台(如 GitHub.com、GitLab.com 等)都提供此类扫描服务作为其服务的一部分。我们强烈建议使用这些服务。
质量标准/CII最佳实践徽章计划
核心基础设施倡议(CII)创立了CII 最佳实践徽章计划,该计划现在由开源安全基金会继续推进。作为该计划的一部分,它定义了开源软件的最佳实践,并实施了徽章系统。项目可以通过网络应用程序自我认证是否符合标准,并在其网站上展示相应的徽章。截至今天(2022 年 5 月),已有超过 4724 个项目完成了评估。
CII 系统分为三个等级(通过、银级 和 金级 )。这些等级是层层递进的(即 银级包含了通过等级的所有标准以及额外的标准)。这些标准被划分为不同的类别,包括基础、变更控制、报告、质量、安全和分析。
CII 最佳实践徽章社区开放贡献(例如,提出额外的标准)。
总体而言,CII 最佳实践徽章计划是验证项目是否遵循公认最佳实践的一种好方法。通过徽章,项目可以证明其符合这些标准。
代码仓库审查
代码仓库审查器是一种自动化工具,用来检查代码仓库是否遵循公司为其公开开源仓库定义的指南。TODO Group 提供了可用于此目的工具列表。代码仓库审查器通常会检查以下方面的标准:
- 仓库中是否存在必需的文件(例如 许可证文件README.md,CONTRIBUTING.md)?
- 这些文件是否包含必需的部分?
- 代码仓库是否具有符合公司指南的许可证?
- 代码仓库是否具有符合公司指南的许可证?
- 代码仓库是否包含必须的徽章(例如 REUSE 徽章或 CII 徽章)?
- 代码仓库团队结构(可能需要特定的团队结构,例如至少两个管理员)
- 代码仓库配置(例如,是否启用了漏洞警报?)
然而,它们检查的标准因公司而异,因此,它们通常提供配置规则的可能性(例如,作为 JSON 文件,正如 TODO Group 的 repolinter所做的那样)。为了获取执行这些检查所需的数据,会使用 Git 提供商(如 GitHub.com、GitLab.com、Bitbucket.org 等)的 API。检查结果通常会在用户界面上提供。如果检查失败,另一种选择是在相应的仓库中自动创建问题。此类审查器的典型使用场景包括:
- 在代码仓库公开前,检查是否符合指南要求
- 公开后的常规检查
在发布开源项目时构建开源指标策略
一旦为公司对外开源计划制定了目标,流程和工具,随着公司参与的开源项目不断发展和成熟,持续监测和追踪这些项目的整体健康状况变得非常重要。
在考虑使用哪些巩工具来追踪项目的健康状况之前,一个更好地替代方案是遵循目标——问题——指标(goal-question-metrics)方法来建立完整的指标策略。这种方法常用于关注社区健康分析指标标准和软件的社区,例如 Linux 基金会旗下的 CHAOSS 项目。
定义社区健康目标
有时候,最好从小处着手,先定义两个或三个主要目标,避免被指标淹没。如果你不知道从哪里开始,CHAOSS 提供了一套基于不同关注领域和目标的项目健康衡量指标,可以帮助您开始衡量对您组织至关重要的开源项目的健康状况:
- 常用指标
- 多样性和包容性
- 演进
- 风险
- 价值
- 应用生态系统
创建问题和构建相关指标
指标应当回答与先前设定的目标相一致的具体问题。
例如,如果你的公司的目标之一是了解项目内的社区足迹,那么一个很好的问题可以是:“在开源生态系统中,组织的存在和影响力如何?”为了解答这个问题,一个有用的指标是“大象因子”,即员工贡献了总贡献量 50% 所需的最少组织数。
有很多优秀的工具可以帮助你度量不同的社区健康分析指标,例如 GrimoireLab、LFX 或 Augur。
如需更多关于跟踪项目健康状况的工具的信息,请查阅 TODO Guides 中的专门部分。
参考文献与缩写
缩写
- API = 应用程序编程接口
- CII = 核心基础设施倡议
- CLA = 贡献者许可协议
- CCLA = 企业贡献者许可协议
- CHAOSS = 社区健康分析开源软件
- CNCF = 云原生计算基金会
- DCO = 开发者原创证书
- ECC = 出口管制与海关
- ECCN = 出口管制分类编号
- GPL = GNU 通用公共许可证
- ICLA = 个人贡献者许可协议
- IDE = 集成开发环境
- IP = 知识产权
- JSON = Java 脚本对象表示法
- KPI = 关键绩效指标
- LFX = Linux基金会协作指标
- MIT = 麻省理工学院
- NPM = Node 包管理器
- OSI = 开源促进会
- OSPO = 开源项目办公室
- OSS = 开源软件
- PyPI = Python 包索引
参考文献
- 开源原型:有目的性开源的框架(Mozilla)
- 如何启动一个开源项目(Linux 基金会 TODO 组)
- 如何关闭一个开源项目(Linux 基金会 TODO 组)
- 开源项目的市场营销(Linux 基金会 TODO 组)
- 在开源社区中建立领导力(Linux基金会 TODO 组)
- 社区健康分析开源软件(Linux 基金会 CHAOSS)
- 如何衡量开源社区的健康状况
- 社区健康文件(GitHub.com)
- CII最佳实践徽章(Linux 基金会核心基础设施倡议)
- DCO 版本 1.1
- 个人贡献者许可协议(ICLA)
- 企业贡献者许可协议(CCLA)
- 德国版权法
附录
在 git 中管理工作与个人电子邮件
在开源领域,人们可能拥有一个早于其加入我们当前组织的线上身份。同时,组织可能希望代表他们进行的贡献使用公司电子邮件进行。
解决这一问题的一种方法是,在每个仓库的基础上对其提交电子邮件进行编码,例如:
git config user.email "simba@special-email.example.com"
如果你管理多个仓库,这将会变得难以管理且容易忘记。相反,我们可以利用 git 的一个功能,该功能允许我们根据不同的目录结构进行不同的配置。
我们的 ~/.gitconfig
文件可能类似于:
[user]
name = Simba Lion
email = simba@personal-email.example.org
[includeIf "gitdir:~/my-company/"]
path = ~/my-company/.gitconfig
这设置了我们的默认电子邮件(在这种情况下,是个人账户的电子邮件)。如果我们在 ~/my-company
目录下有仓库,我们将会加载一个额外的 git 配置文件,该文件位于 ~/my-company/.gitconfig
。该文件可能看起来像这样:
[user]
email = simba@very-corporate-email.example.com
现在,当用户提交更改时,它将默认使用期个人电子邮件,或者对于 ~/my-company
文件夹内的任何仓库,它将使用其公司电子邮件。请注意,name 属性是从基础配置中继承的,因此我们不需要重复指定它。