适用于任何CI的简单DCO检查脚本。
项目描述
dco-check
适用于任何CI的简单DCO检查脚本。
动机
许多开源项目要求在每次提交消息中使用“Signed-off-by:”行。这是为了证明贡献者有权根据开发者证书起源(DCO)提交其代码。然而,据我所知,没有自动检查可以在任何CI平台(或大多数平台)上运行。某些平台根本不具备这种功能。
这受到了DCO GitHub App的启发。
如何获取和使用
有几个选项
- 使用来自PyPI的软件包
$ pip install dco-check $ dco-check
- 使用与您的CI一起的Docker镜像(
christophebedard/dco-check
)(请参阅示例)$ dco-check
- 下载脚本并运行它(您可以将
master
替换为特定版本)
这是由dco-check
是一个没有任何第三方依赖项的单个Python文件所实现的。$ wget https://raw.githubusercontent.com/christophebedard/dco-check/master/dco_check/dco_check.py $ python3 dco_check.py
如果所有已检查的提交都已签出,则它将以0退出。否则,它将以非零数字退出。
运行--help
以获取更多信息,包括
- 忽略合并提交
- 默认分支
- 默认远程仓库
- 要排除的提交作者电子邮件列表
- 用于排除匹配通用电子邮件的正则表达式模式
- 静默模式
- 详细模式
- 排除某些作者电子邮件(例如,用于机器人)
这些选项也可以通过环境变量设置(请参阅--help
),但命令行参数的优先级高于环境变量。
工作原理
dco-check
关注两个用例
- 功能分支的一部分,即一个提议的更改(拉取请求或合并请求)
- 默认分支上的提交,例如
master
,或者更具体地说,推送到默认分支的新提交
第一个用例在普通的git仓库中很容易处理。我们可以简单地使用git merge-base --fork-point $DEFAULT_BRANCH
来获取默认分支上特定功能分支的提交列表。一些CI提供了更多信息,例如更改的目标分支,这对于我们不期望总是针对默认分支的情况很有用。然后我们可以使用git log
检查每个提交,并确保它已被作者签出。
第二个用例在简单的git仓库中实际上是不可能的,因为它们不包含必要的信息(据我所知)。幸运的是,一些CI提供了这些信息。
此外,默认情况下,一些CI平台仅克隆git仓库到特定的深度,即你只能得到部分提交历史。这个深度有时对于某些CI来说可能为1,即浅克隆。对于这些情况,通常可以在作业配置中设置正确的参数来防止浅克隆。然而,由于dco-check
的一个目标是尽可能简单易用,因此它尽量不依赖于这一点。
这就是为什么dco-check
会检测当前的CI平台并使用该平台可以提供的信息。否则,它将回退到默认的通用实现,该实现使用简单的git命令。在这种情况下,CLI选项允许用户提供大量缺失的信息。
CI支持
以下是支持的CIs及其已知行为的摘要。
CI | 在推送到默认分支时检测新更改 | 检测PRs/MRs | 使用以下方式获取基础分支 | 使用以下方式获取默认分支 | 注意 |
---|---|---|---|---|---|
GitHub | ✓ | ✓ | CI | (未使用) | 使用GitHub API检索提交数据,因为GitHub默认进行浅克隆 |
GitLab | ✓ | ✓ | CI | CI | 检测正常的GitLab MRs和外部(GitHub)MRs |
Azure Pipelines | ✓ | CI | CLI参数 | ||
AppVeyor | ✓ | CI | CLI参数 | ||
CircleCI | ✓ | CI*(或CLI参数) | CLI参数 | *如果提供,可以使用基础修订信息(请参阅示例) | |
Travis CI | CLI参数 | CLI参数 | 默认支持作为正常git仓库 | ||
默认(git) | CLI参数 | CLI参数 | 在本地使用;在不支持CI的平台中使用可能存在问题,该平台仅进行浅克隆 |
示例CI配置
以下是一些示例CI配置。
GitHub
# .github/workflows/dco.yml
name: DCO
on:
pull_request:
push:
branches:
- master
jobs:
check_dco:
runs-on: ubuntu-latest
name: Check DCO
steps:
- name: Run dco-check
uses: christophebedard/dco-check@0.5.0
with:
python-version: '3.12'
args: '--verbose'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
请注意,with:
属性是可选的,默认Python版本是3.12,默认不传递任何额外参数。
GitLab
# .gitlab-ci.yml
variables:
DOCKER_DRIVER: overlay2
dco:
image: christophebedard/dco-check:latest
rules:
- if: $CI_MERGE_REQUEST_ID
- if: $CI_EXTERNAL_PULL_REQUEST_IID
- if: $CI_COMMIT_BRANCH == 'master'
script:
- pip3 install -U dco-check # optional
- dco-check
Python版本支持
由于使用了f-strings,需要Python 3.6+。然而,如果需要或如果此类更改被贡献给dco-check
,则应该不难将其移除以支持较旧的Python 3版本。
贡献
请参阅CONTRIBUTING.md
。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。