DCO.yml 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. name: DCO
  2. on:
  3. push:
  4. branches: [ "main" ]
  5. pull_request:
  6. branches: [ "main" ]
  7. workflow_dispatch:
  8. env:
  9. CARGO_UNSTABLE_SPARSE_REGISTRY: true
  10. CARGO_TERM_COLOR: always
  11. jobs:
  12. check-commit-signatures:
  13. name: Check all commit signatures
  14. runs-on: ubuntu-latest
  15. steps:
  16. - uses: actions/checkout@v4
  17. with:
  18. fetch-depth: 0 # 获取完整提交历史以访问所有PR提交
  19. - name: Verify all commits are signed
  20. run: |
  21. if [ -n "$GITHUB_BASE_REF" ]; then
  22. echo "Pull Request detected. Using base ref: $GITHUB_BASE_REF"
  23. # 拉取目标分支的最新状态
  24. git fetch origin $GITHUB_BASE_REF
  25. RANGE="origin/$GITHUB_BASE_REF..HEAD"
  26. else
  27. echo "Not Pull Request, checking one latest commit"
  28. # 如果不是 PR,则只检查最近一次提交(可根据实际情况调整)
  29. RANGE="HEAD~1..HEAD"
  30. fi
  31. commits=$(git rev-list $RANGE)
  32. if [ -z "$commits" ]; then
  33. echo "Error: No commits found in the pull request range."
  34. exit 1
  35. fi
  36. PASS=1
  37. for COMMIT in $commits; do
  38. echo "Checking commit $COMMIT"
  39. PARENTS=$(git log -1 --format='%P' "$COMMIT")
  40. NUM_PARENTS=$(echo "$PARENTS" | wc -w)
  41. if [ "$NUM_PARENTS" -gt 1 ]; then
  42. echo "Commit $COMMIT is a merge commit, skipping signature check."
  43. continue
  44. fi
  45. COMMIT_MSG=$(git log -1 --format=%B $COMMIT)
  46. if echo "$COMMIT_MSG" | grep -q "Signed-off-by:"; then
  47. echo ":) Commit $COMMIT is signed."
  48. else
  49. echo ":( Commit $COMMIT is NOT signed."
  50. echo "Commit information: "
  51. git log -1 $COMMIT
  52. PASS=0
  53. fi
  54. done
  55. if [ "$PASS" -eq 1 ]; then
  56. echo "✔ All commits are properly signed!"
  57. else
  58. echo "❌ At least one commit is not properly signed (using Signed-off-by)."
  59. exit 1
  60. fi
  61. - name: Print authors' information
  62. run: |
  63. if [ -n "$GITHUB_BASE_REF" ]; then
  64. git fetch origin $GITHUB_BASE_REF
  65. RANGE="origin/$GITHUB_BASE_REF..HEAD"
  66. else
  67. RANGE="HEAD~1..HEAD"
  68. fi
  69. git log --pretty="format:%h - %an <%ae> [%G?]" $RANGE