From 36d1cba2a9145c7fe695d78139886947b32bc9ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20=E2=80=9Cpep=E2=80=9D=20Buquet?= Date: Mon, 16 Dec 2024 17:04:44 +0100 Subject: [PATCH] CI: Force changelog updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changelog updates are now required in MRs by default. If there is a match for "\" in the commit message, this will be ignored. $CI_COMMIT_MESSAGE mangles newlines so it's not possible to require the string to be on its own line, that means it would also trigger within a wall of text, which makes it less obvious. Also, I wasn't able to find a CI variable which has the ref of the branch the MR is set against, to build a tree-ish than spans over the whole MR and not just HEAD. Signed-off-by: Maxime “pep” Buquet --- .gitlab-ci.yml | 39 +++++++++++++++++++++++++++++++++++++++ xmpp/ChangeLog | 2 ++ 2 files changed, 41 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bbfa389b..bf3a9c3e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -68,6 +68,45 @@ rustfmt: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_REF_NAME == 'main' +changelog-update: + stage: lint + image: alpine:latest + # Check in the commit message for "skip.?changelog", if not present + # then check for changes in changelogs. + # XXX: It looks like $CI_COMMIT_MESSAGE mangles newlines so it's not + # possible to require the "skip.?changelog" string to be on its own line, + # that means it would also trigger within a wall of text. Not so obvious. + # TODO: Check the whole MR for updates in changelogs, not just the last + # commit. + script: + - apk add --no-cache git python3 + - git log --online "${CI_MERGE_REQUEST_DIFF_BASE_SHA}~.." -- + - | + /usr/bin/env python3 -c " + import os, re, subprocess, sys + # Skip this check if instructed + if re.search(r'skip.?changelog', os.environ['CI_COMMIT_MESSAGE'], flags=re.I) is not None: + print('Changelog skipped.') + sys.exit(0) + subprocess.run(['git', '--version']) + treeish = 'main..' + if os.environ['CI_PIPELINE_SOURCE'] == 'merge_request_event': + treeish = '{}~..'.format(os.environ['CI_MERGE_REQUEST_DIFF_BASE_SHA']) + subprocess.run(['git', 'log', '--oneline', treeish, '--']) + diff=subprocess.run( + ['git', 'diff-tree', '--no-commit-id', '-r', treeish, '--'], + capture_output=True, + ) + print(f'FOO: {diff.stdout}\n\n{diff.stderr}') + # Verify if at least a single changelog file has been added or edited + if re.search(rb'[AM]\s+\S*changelog', diff.stdout, flags=re.I) is None: + print('Please update the Changelog. Use \"skip-changelog\" in the commit message to skip this check.') + sys.exit(1) + print('Changelog has been updated as expected.')" + rules: + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_REF_NAME == 'main' + stable-test: extends: - .test diff --git a/xmpp/ChangeLog b/xmpp/ChangeLog index 586fbf84..25be585d 100644 --- a/xmpp/ChangeLog +++ b/xmpp/ChangeLog @@ -21,6 +21,8 @@ XXXX-YY-ZZ [ RELEASER ] - Agent::wait_for_events now return Vec and sets inner tokio_xmpp Client auto-reconnect to true... It is still aware of Event::Disconnected but should no longer have weird hanging state or panic (!436) + * CI: + - Enforce changelog updates in Gitlab CI. Version 0.6.0: 2024-07-27 [ Maxime “pep” Buquet ]