From: Colin Walters Date: Thu, 8 Jun 2017 17:47:20 +0000 (-0400) Subject: ci: Update to match current rpm-ostree X-Git-Tag: archive/raspbian/2022.1-3+rpi1~1^2~4^2~36^2~26 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=a98faa911343378781114d458ba3936c282b90ec;p=ostree.git ci: Update to match current rpm-ostree This copies the `ci/` directory from rpm-ostree, with much the same rationale; among other things we don't want to depend on the Docker hub. The specific reason I'm doing this is that I want to add a CentOS7 build, but that means we can't use `projectatomic/ostree-tester`, and at that point we might as well unwind it all. Closes: #917 Approved by: jlebon --- diff --git a/.papr.Dockerfile b/.papr.Dockerfile deleted file mode 100644 index 0081998c..00000000 --- a/.papr.Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM fedora:25 - -RUN dnf install -y \ - gcc \ - git \ - sudo \ - which \ - attr \ - fuse \ - gjs \ - parallel \ - coccinelle \ - clang \ - libubsan \ - libasan \ - libtsan \ - PyYAML \ - gnome-desktop-testing \ - redhat-rpm-config \ - elfutils \ - 'dnf-command(builddep)' \ - && dnf builddep -y \ - ostree \ - && dnf clean all - -# create an unprivileged user for testing -RUN adduser testuser diff --git a/.papr.yml b/.papr.yml index cc02f75e..67a01683 100644 --- a/.papr.yml +++ b/.papr.yml @@ -4,102 +4,51 @@ branches: - try required: true -context: f25-sanitizer +context: f25-primary container: - image: projectatomic/ostree-tester - + image: registry.fedoraproject.org/fedora:25 packages: - - libasan - git - - coccinelle env: CFLAGS: '-fsanitize=undefined -fsanitize-undefined-trap-on-error -fsanitize=address -O2 -Wp,-D_FORTIFY_SOURCE=2' ASAN_OPTIONS: 'detect_leaks=0' # Right now we're not fully clean, but this gets us use-after-free etc # TODO when we're doing leak checks: G_SLICE: "always-malloc" -build: - config-opts: > - --prefix=/usr - --libdir=/usr/lib64 - --enable-installed-tests=exclusive - --enable-gtk-doc - -# The g-d-t-r timeout is for test-pull-many.sh; if tweaking this, -# also be sure to change the other cases below tests: - - make syntax-check - - ./tests/ci-commitmessage-submodules.sh - - make check - - /bin/sh -c 'gnome-desktop-testing-runner -p 0 --timeout $((10 * 60)) libostree/' + - ci/ci-commitmessage-submodules.sh + - ci/build-check.sh timeout: 30m artifacts: - - test-suite.log - ---- - -inherit: true -required: true - -context: f25-clang - -env: - CC: 'clang' - CFLAGS: '-Werror=unused-variable' - -tests: -artifacts: - - + - test-suite.log --- inherit: true context: f25-rust - packages: - cargo - -build: - config-opts: > - --prefix=/usr - --libdir=/usr/lib64 - --enable-gtk-doc - --enable-rust - env: - CC: 'gcc' + CONFIGOPTS: '--enable-rust' tests: + - ci/build.sh - make check TESTS=tests/test-rollsum -artifacts: - - test-suite.log --- inherit: true context: f25-experimental-api - -build: - config-opts: > - --prefix=/usr - --libdir=/usr/lib64 - --enable-gtk-doc - --enable-experimental-api - env: - CC: 'gcc' + CONFIGOPTS: '--enable-experimental-api' tests: - - make check - - /bin/sh -c 'gnome-desktop-testing-runner -p 0 --timeout $((10 * 60)) libostree/' + - ci/build-check.sh -artifacts: - - test-suite.log --- inherit: true @@ -111,21 +60,11 @@ packages: - pkgconfig(libcurl) - pkgconfig(openssl) -build: - config-opts: > - --prefix=/usr - --libdir=/usr/lib64 - --enable-installed-tests=exclusive - --enable-gtk-doc - --with-curl - --with-openssl +env: + CONFIGOPTS: "--with-curl --with-openssl" tests: - - make check - - /bin/sh -c 'gnome-desktop-testing-runner -p 0 --timeout $((10 * 60)) libostree/' - -artifacts: - - test-suite.log + - ci/build-check.sh --- @@ -143,24 +82,16 @@ cluster: - name: vmcheck distro: fedora/25/atomic container: - image: projectatomic/ostree-tester - -build: - config-opts: > - --prefix=/usr - --libdir=/usr/lib64 - --enable-gtk-doc + image: registry.fedoraproject.org/fedora:25 # Copy the build from the container to the host; ideally down the line # this is installing an RPM via https://github.com/jlebon/redhat-ci/issues/10 tests: + - ci/build.sh - make install DESTDIR=$(pwd)/insttree - rsync -rl -e 'ssh -o User=root' . vmcheck:ostree/ - ssh root@vmcheck './ostree/tests/installed/fah-prep.sh && ostree admin unlock && rsync -rlv ./ostree/insttree/usr/ /usr/ && ./ostree/tests/installed/run.sh' -artifacts: - - test-suite.log - --- inherit: false diff --git a/ci/build-check.sh b/ci/build-check.sh new file mode 100755 index 00000000..6123440e --- /dev/null +++ b/ci/build-check.sh @@ -0,0 +1,20 @@ +#!/usr/bin/bash +# Install build dependencies, run unit tests and installed tests. + +set -xeuo pipefail + +dn=$(dirname $0) +. ${dn}/libbuild.sh +${dn}/build.sh +make check +make syntax-check # TODO: do syntax-check under check +# And now run the installed tests +make install +gnome-desktop-testing-runner -p 0 ostree + +git clean -dfx && git submodule foreach git clean -dfx +# And now a clang build to find unused variables; perhaps +# in the future these could parallelize +export CC=clang +export CFLAGS='-Werror=unused-variable' +build diff --git a/ci/build.sh b/ci/build.sh new file mode 100755 index 00000000..d5bacd38 --- /dev/null +++ b/ci/build.sh @@ -0,0 +1,15 @@ +#!/usr/bin/bash +# Install build dependencies, run unit tests and installed tests. + +set -xeuo pipefail + +dn=$(dirname $0) +. ${dn}/libbuild.sh + +install_builddeps ostree + +dnf install -y sudo which attr fuse gjs parallel coccinelle clang \ + libubsan libasan libtsan PyYAML gnome-desktop-testing redhat-rpm-config \ + elfutils + +build --enable-gtk-doc --enable-installed-tests=exclusive ${CONFIGOPTS:-} diff --git a/ci/ci-commitmessage-submodules.sh b/ci/ci-commitmessage-submodules.sh new file mode 100755 index 00000000..aeccc24d --- /dev/null +++ b/ci/ci-commitmessage-submodules.sh @@ -0,0 +1,55 @@ +#!/bin/bash +set -euo pipefail + +# Copyright 2017 Colin Walters +# 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 running under PAPR, use the branch/PR HEAD actually +# being tested rather than the merge sha +HEAD=${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 + +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" + 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 + sed -e 's,^,# ,' < ${tmpd}/log.txt + 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 diff --git a/ci/libbuild.sh b/ci/libbuild.sh new file mode 100644 index 00000000..b061a486 --- /dev/null +++ b/ci/libbuild.sh @@ -0,0 +1,23 @@ +#!/usr/bin/bash + +make() { + /usr/bin/make -j $(getconf _NPROCESSORS_ONLN) "$@" +} + +build() { + env NOCONFIGURE=1 ./autogen.sh + ./configure --prefix=/usr --libdir=/usr/lib64 "$@" + make V=1 +} + +install_builddeps() { + pkg=$1 + dnf -y install dnf-plugins-core + dnf install -y @buildsys-build + dnf install -y 'dnf-command(builddep)' + + # builddeps+runtime deps + dnf builddep -y $pkg + dnf install -y $pkg + rpm -e $pkg +} diff --git a/tests/ci-commitmessage-submodules.sh b/tests/ci-commitmessage-submodules.sh deleted file mode 100755 index aeccc24d..00000000 --- a/tests/ci-commitmessage-submodules.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash -set -euo pipefail - -# Copyright 2017 Colin Walters -# 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 running under PAPR, use the branch/PR HEAD actually -# being tested rather than the merge sha -HEAD=${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 - -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" - 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 - sed -e 's,^,# ,' < ${tmpd}/log.txt - 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