From 2698867311db78a7190bba1a20f0f27cfa04ffad Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 16 Jun 2020 09:58:40 +1000 Subject: [PATCH] gitlab CI: use ci-fairy to check commits and merge requests Signed-off-by: Peter Hutterer --- .gitlab-ci.yml | 36 +++++++++----- .gitlab-ci/check-commit.py | 114 --------------------------------------------- .gitlab-ci/ci.template | 36 +++++++++----- 3 files changed, 50 insertions(+), 136 deletions(-) delete mode 100755 .gitlab-ci/check-commit.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 875a7be..a612d72 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -160,30 +160,44 @@ check-ci-script: - echo "Committed gitlab-ci.yml differs from generated gitlab-ci.yml. Please verify" - exit 1 +# +# Verify that commit messages are as expected, signed-off, etc. +# + check-commit: image: golang:alpine stage: prep before_script: - apk add python3 py-pip git - - pip3 install GitPython - - pip3 install pytest + - pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates script: - - | - pytest --junitxml=results.xml \ - --tb=line \ - --assert=plain \ - ./.gitlab-ci/check-commit.py + - ci-fairy check-commits --signed-off-by --junit-xml=results.xml except: - - master@libevdev/libevdev + - master@libinput/libinput variables: GIT_DEPTH: 100 artifacts: - expire_in: 1 week + reports: + junit: results.xml + +# +# Verify that the merge request has the allow-collaboration checkbox ticked +# + +check-merge-request: + image: golang:alpine + stage: prep + before_script: + - apk add python3 py-pip git + - pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates + script: + - ci-fairy check-merge-request --require-allow-collaboration --junit-xml=results.xml + artifacts: when: on_failure - paths: - - results.xml reports: junit: results.xml + allow_failure: true + .fedora.packages: variables: diff --git a/.gitlab-ci/check-commit.py b/.gitlab-ci/check-commit.py deleted file mode 100755 index ed2d897..0000000 --- a/.gitlab-ci/check-commit.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python3 -# -# This script tests a few things against the commit messages, search for -# `def test_` to see the actual tests run. - -import git -import os -import pytest - -if os.environ.get('CI'): - # Environment variables set by gitlab - CI_COMMIT_SHA = os.environ['CI_COMMIT_SHA'] - # This is intentionally hardcoded to master. CI_MERGE_REQUEST_TARGET_BRANCH_NAME - # is only available when run with only: [merge_requests] - # but that generates a detached pipeline with only this job in it. - # Since merging into a non-master branch is not a thing in libevdev - # anyway, we can hardcode this here. - CI_MERGE_REQUEST_TARGET_BRANCH_NAME = 'master' - CI_SERVER_HOST = os.environ['CI_SERVER_HOST'] - UPSTREAM = 'upstream' -else: - # Local emulation mode when called directly - import argparse - - parser = argparse.ArgumentParser(description='Commit message checker - local emulation mode') - parser.add_argument('--sha', help='The commit message to start at (default: HEAD}', - default='HEAD') - parser.add_argument('--branch', help='The branch name to merge to (default: master)', - default='master') - parser.add_argument('--remote', help='The remote name (default: origin)', - default='origin') - args = parser.parse_args() - - CI_COMMIT_SHA = args.sha - CI_MERGE_REQUEST_TARGET_BRANCH_NAME = args.branch - CI_SERVER_HOST = None - UPSTREAM = 'origin' - print(f'Running in local testing mode.') - -print(f'Merging {CI_COMMIT_SHA} into {CI_MERGE_REQUEST_TARGET_BRANCH_NAME}') - -# We need to add the real libevdev as remote, our origin here is the user's -# fork. -repo = git.Repo('.') -if UPSTREAM not in repo.remotes: - upstream = repo.create_remote('upstream', f'https://{CI_SERVER_HOST}/libevdev/libevdev.git') - upstream.fetch() - -sha = CI_COMMIT_SHA -branch = CI_MERGE_REQUEST_TARGET_BRANCH_NAME - -commits = list(repo.iter_commits(f'{UPSTREAM}/{branch}..{sha}')) - - -def error(commit, message, long_message=''): - info = ('After correcting the above issue(s), force-push to the same branch.\n' - 'This will re-trigger the CI.\n\n' - 'A list of requirements for commit messages is available at\n' - 'https://gitlab.freedesktop.org/libevdev/libevdev/blob/master/CODING_STYLE.md') - - msg = (f'\n' - f'Commit message check failed: {message}\n\n' - f' commit: {str(commit)}\n' - f' author: {commit.author.name} <{commit.author.email}>\n' - f'\n' - f' {commit.summary}\n' - f'\n' - f'\n' - f'{long_message}\n\n' - f'{info}\n\n') - return msg - - -@pytest.mark.parametrize('commit', commits) -class TestCommits: - def test_author_email(self, commit): - assert '@users.noreply.gitlab.freedesktop.org' not in commit.author.email, \ - error(commit, 'git author email invalid', - ('Please set your name and email with the commands\n', - ' git config --global user.name Your Name\n' - ' git config --global user.email your.email@provider.com\n')) - - def test_signed_off_by(self, commit): - if not commit.message.startswith('Revert "'): - assert 'Signed-off-by:' in commit.message, \ - error(commit, 'missing Signed-off-by tag', - 'Please add the required "Signed-off-by: author information" line\n' - 'to the commit message') - - def test_fixup(self, commit): - assert not commit.message.startswith('fixup!'), \ - error(commit, 'Remove fixup! tag', - 'Leftover "fixup!" commit message detected, please squash') - assert not commit.message.startswith('squash!'), \ - error(commit, 'Remove squash! tag', - 'Leftover "squash!" commit message detected, please squash') - - def test_line_length(self, commit): - lines = commit.message.split('\n') - first_line = lines[0] - - assert len(first_line) < 85, \ - error(commit, 'Commit message subject line too long') - - try: - second_line = lines[1] - assert second_line == '', \ - error(commit, 'Second line in commit message must be emtpy') - except IndexError: - pass - - -if __name__ == '__main__': - pytest.main([__file__]) diff --git a/.gitlab-ci/ci.template b/.gitlab-ci/ci.template index 45baa63..d7e173f 100644 --- a/.gitlab-ci/ci.template +++ b/.gitlab-ci/ci.template @@ -97,30 +97,44 @@ check-ci-script: - echo "Committed gitlab-ci.yml differs from generated gitlab-ci.yml. Please verify" - exit 1 +# +# Verify that commit messages are as expected, signed-off, etc. +# + check-commit: image: golang:alpine stage: prep before_script: - apk add python3 py-pip git - - pip3 install GitPython - - pip3 install pytest + - pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates script: - - | - pytest --junitxml=results.xml \ - --tb=line \ - --assert=plain \ - ./.gitlab-ci/check-commit.py + - ci-fairy check-commits --signed-off-by --junit-xml=results.xml except: - - master@libevdev/libevdev + - master@libinput/libinput variables: GIT_DEPTH: 100 artifacts: - expire_in: 1 week + reports: + junit: results.xml + +# +# Verify that the merge request has the allow-collaboration checkbox ticked +# + +check-merge-request: + image: golang:alpine + stage: prep + before_script: + - apk add python3 py-pip git + - pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates + script: + - ci-fairy check-merge-request --require-allow-collaboration --junit-xml=results.xml + artifacts: when: on_failure - paths: - - results.xml reports: junit: results.xml + allow_failure: true + {% for distro in distributions %} .{{ distro.name }}.packages: -- 2.7.4