gitlab CI: use ci-fairy to check commits and merge requests
authorPeter Hutterer <peter.hutterer@who-t.net>
Mon, 15 Jun 2020 23:58:40 +0000 (09:58 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Mon, 15 Jun 2020 23:58:56 +0000 (09:58 +1000)
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
.gitlab-ci.yml
.gitlab-ci/check-commit.py [deleted file]
.gitlab-ci/ci.template

index 875a7be..a612d72 100644 (file)
@@ -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 (executable)
index ed2d897..0000000
+++ /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__])
index 45baa63..d7e173f 100644 (file)
@@ -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: