rpm-ostree/ci/ci-commitmessage-submodules.sh
Jonathan Lebon 46ab7d1ae8 ci: Add Jenkins pipeline
This is an experiment in using Jenkins pipelines for our CI. See similar
initiatives in coreos-assembler[1] and fedora-coreos-config[2].

For now, this only does the following testing:
- checks commit for unintended submodule bumps
- checks the minimum Rust version
- builds RPMs
- builds FCOS (with the new RPMs both for executing the build
  itself, as well as included in the built OS)

There are dummy placeholders for where we'd actually run the vmcheck
and the compose testsuites. Let's address those trickier parts as
follow-ups.

[1] https://github.com/coreos/coreos-assembler/pull/667
[2] https://github.com/coreos/fedora-coreos-config/pull/131

Closes: #1899
Approved by: cgwalters
2019-09-18 15:15:28 +00:00

64 lines
2.2 KiB
Bash
Executable File

#!/bin/bash
set -xeuo pipefail
dn=$(dirname $0)
. ${dn}/libbuild.sh
# Copyright 2017 Colin Walters <walters@verbum.org>
# Licensed under the new-BSD license (http://www.opensource.org/licenses/bsd-license.php)
# This script is intended to be used as a CI gating check
# that if a submodule is changed, the commit message contains
# the text:
#
# Update submodule: submodulepath
#
# It's very common for people to accidentally change submodules, and having this
# requirement is a small hurdle to pass.
# If passed the commit, use that. Otherwise, if running under PAPR, use the
# branch/PR HEAD actually being tested rather than the merge sha
HEAD=${1:-${PAPR_COMMIT:-HEAD}}
tmpd=$(mktemp -d)
touch ${tmpd}/.tmpdir
cleanup_tmp() {
# This sanity check ensures we don't delete something else
if test -f ${tmpd}/.tmpdir; then
rm -rf ${tmpd}
fi
}
trap cleanup_tmp EXIT
if ! [ -x /usr/bin/git ]; then
pkg_upgrade
pkg_install git
fi
gitdir=$(realpath $(pwd))
# Create a temporary copy of this (using cp not git clone) so git doesn't
# try to read the submodules from the Internet again. If we wanted to
# require a newer git, we could use `git worktree`.
cp -a ${gitdir} ${tmpd}/workdir
cd ${tmpd}/workdir
git log --pretty=oneline origin/master..$HEAD | while read logline; do
commit=$(echo ${logline} | cut -f 1 -d ' ')
git diff --name-only ${commit}^..${commit} > ${tmpd}/diff.txt
git log -1 ${commit} > ${tmpd}/log.txt
echo "Validating commit for submodules: $commit"
sed -e 's,^,# ,' < ${tmpd}/log.txt
git checkout -q "${commit}"
git submodule update --init
git submodule foreach --quiet 'echo $path'| while read submodule; do
if grep -q -e '^'${submodule} ${tmpd}/diff.txt; then
echo "Commit $commit modifies submodule: $submodule"
expected_match="Update submodule: $submodule"
if ! grep -q -e "$expected_match" ${tmpd}/log.txt; then
echo "error: Commit message for ${commit} changes a submodule, but does not match regex ${expected_match}"
exit 1
fi
echo "Verified commit $commit matches regexp ${expected_match}"
fi
done
done