GitLab CI, Bitbucket and Azure Pipelines¶
On GitHub, the Action and the App do
this work for you. Everywhere else Commit Check runs as one job in the
pipeline: it is a Python package with no runtime dependencies, so any runner
that can pip install can run it, and it reads the same cchk.toml as the
hook and the Action.
Two things are different from running it on your own machine, and each example below handles both:
- The checkout is a detached HEAD. git has no branch to report, so
commit-check --branchwould judgeHEAD, which is always allowed, and pass whatever the branch is called. Pipe the branch name in from the CI's own variable instead: a value piped into--branchon its own is the name it checks. - A merge request has more than one commit.
--revchecks one commit, so the job loops over the commits the merge request adds, as in Checking a range of commits. The loop needs the history those commits sit on, so each example turns shallow cloning off. If the range cannot be read, the job fails rather than passing with nothing checked.
Each job runs on merge or pull requests only, because the variables it reads
exist only there. Add --author-name --author-email to the commit-check
call in the loop to check each commit's author as well.
GitLab CI¶
.gitlab-ci.yml
commit-check:
image: python:3.13
variables:
GIT_DEPTH: "0"
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- pip install commit-check
- echo "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" | commit-check --branch
- |
head="${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA:-$CI_COMMIT_SHA}"
shas=$(git rev-list "$CI_MERGE_REQUEST_DIFF_BASE_SHA..$head") || exit 1
status=0
for sha in $shas; do
commit-check --message --rev "$sha" --compact || status=1
done
exit $status
GIT_DEPTH: "0"turns shallow cloning off.- In a merged results pipeline,
HEADis a merge commit GitLab made, andCI_MERGE_REQUEST_SOURCE_BRANCH_SHAnames the merge request's own last commit. In a plain merge request pipeline that variable is empty andCI_COMMIT_SHAis that commit. - The
pythonimage ships with git. A-slimimage does not, and needs it installed first.
Bitbucket Pipelines¶
bitbucket-pipelines.yml
image: python:3.13
pipelines:
pull-requests:
'**':
- step:
name: Commit Check
clone:
depth: full
script:
- pip install commit-check
- echo "$BITBUCKET_BRANCH" | commit-check --branch
- |
shas=$(git rev-list "$BITBUCKET_PR_DESTINATION_COMMIT..$BITBUCKET_COMMIT") || exit 1
status=0
for sha in $shas; do
commit-check --message --rev "$sha" --compact || status=1
done
exit $status
depth: fullturns off the default clone depth of 50 commits.- Bitbucket merges the destination branch into the pull request before the
step runs. The range stops at
BITBUCKET_COMMIT, the pull request's own last commit, so commits that only came in with that merge are not checked.
Azure Pipelines¶
azure-pipelines.yml
trigger: none
pr:
branches:
include: ["*"]
pool:
vmImage: ubuntu-latest
steps:
- checkout: self
fetchDepth: 0
- task: UsePythonVersion@0
inputs:
versionSpec: "3.13"
- script: pip install commit-check
displayName: Install Commit Check
- script: echo "${SYSTEM_PULLREQUEST_SOURCEBRANCH#refs/heads/}" | commit-check --branch
displayName: Check the branch name
- script: |
shas=$(git rev-list HEAD^1..HEAD^2) || exit 1
status=0
for sha in $shas; do
commit-check --message --rev "$sha" --compact || status=1
done
exit $status
displayName: Check the commit messages
trigger: nonekeeps the pipeline to pull requests; on a plain push there is no source branch to check and no merge commit to read the range from.fetchDepth: 0turns off shallow fetch, which new pipelines have on by default.- A pull request build checks out a merge commit whose first parent is the
target branch and second the pull request, so
HEAD^1..HEAD^2is exactly the commits the pull request adds. System.PullRequest.SourceBranchisrefs/heads/feature/xin Azure Repos andfeature/xfor a GitHub repository;#refs/heads/strips the prefix where there is one.- In Azure Repos the
pr:section is ignored. Pull request builds come from a build validation branch policy on the target branch, andSystem.PullRequest.SourceBranchis only set for builds a branch policy started.