Hi, On 2022-10-01 18:36:41 -0700, Andres Freund wrote: > I am wondering if we should instead introduce a new "quickcheck" task that > just compiles and runs maybe one test and have *all* other tests depend on > that. Wasting a precious available windows instance to just fail to build or > immediately fail during tests doesn't really make sense.
Attached is an implementation of that idea. I fairly randomly chose two quick tests to execute as part of the sanity check, cube/regress pg_ctl/001_start_stop. I wanted to have coverage for initdb, a pg_regress style test, a tap test, some other client binary. With a primed cache this takes ~32s, not too bad imo. 12s of that is cloning the repo. What do you think? We could bake a bare repo into the images to make the clone step in faster, but that'd be for later anyway. set -e rm -rf /tmp/pg-clone-better mkdir /tmp/pg-clone-better cd /tmp/pg-clone-better git init --bare git remote add origin https://github.com/postgres/postgres.git --no-tags -t 'REL_*' -t master git fetch -v git repack -ad -f du -sh results in a 227MB repo. git clone https://github.com/anarazel/postgres.git -v --depth 1000 -b ci-sanitycheck --reference /tmp/pg-clone-better /tmp/pg-clone-better-clone clones an example branch in ~1.35s. Greetings, Andres Freund
>From fb7f8413a9efa136e73911e56f9970d8289ee178 Mon Sep 17 00:00:00 2001 From: Andres Freund <and...@anarazel.de> Date: Sun, 2 Oct 2022 11:26:19 -0700 Subject: [PATCH v1] ci: Introduce a SanityCheck task that other tasks depend on --- .cirrus.yml | 94 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 87 insertions(+), 7 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 531cfe96f65..87dc7025eaf 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -55,6 +55,83 @@ on_failure_meson: &on_failure_meson type: text/plain +# To avoid unnecessarily spinning up a lot of VMs / containers for entirely +# broken commits, have a very minimal test that all others depend on. +task: + name: SanityCheck + + # If a specific OS is requested, don't run the sanity check. This shortens + # push-wait-for-ci cycles a bit when debugging operating system specific + # failures. + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' + + env: + CPUS: 4 + BUILD_JOBS: 8 + TEST_JOBS: 8 + CCACHE_DIR: ${CIRRUS_WORKING_DIR}/ccache_dir + # no options enabled, should be small + CCACHE_MAXSIZE: "150M" + + container: + image: $CONTAINER_REPO/linux_debian_bullseye_ci:latest + cpu: $CPUS + + ccache_cache: + folder: $CCACHE_DIR + + create_user_script: | + useradd -m postgres + chown -R postgres:postgres . + mkdir -p ${CCACHE_DIR} + chown -R postgres:postgres ${CCACHE_DIR} + echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf + su postgres -c "ulimit -l -H && ulimit -l -S" + # Can't change container's kernel.core_pattern. Postgres user can't write + # to / normally. Change that. + chown root:postgres / + chmod g+rwx / + + configure_script: | + su postgres <<-EOF + meson setup \ + --buildtype=debug \ + --auto-features=disabled \ + -Dtap_tests=enabled \ + build + EOF + build_script: | + su postgres <<-EOF + set -e + ccache -s + ccache -z + ninja -C build -j${BUILD_JOBS} + ccache -s + EOF + upload_caches: ccache + + # Run a minimal set of tests. The main regression tests take too long for + # this purpose. I chose a random pg_regress style test, and a tap test that + # exercises both a frontend binary and the backend. + test_minimal_script: | + su postgres <<-EOF + ulimit -c unlimited + meson test $MTEST_ARGS --num-processes ${TEST_JOBS} \ + tmp_install cube/regress pg_ctl/001_start_stop + EOF + + on_failure: + <<: *on_failure_meson + cores_script: | + shopt -s nullglob + mkdir -m 770 /tmp/cores + ls -l / + if [ -n "$(echo /core*)" ] ; then + mv /core* /tmp/cores/ + src/tools/ci/cores_backtrace.sh linux /tmp/cores + fi + + task: name: FreeBSD - 13 - Meson @@ -69,6 +146,7 @@ task: CPPFLAGS: -DRELCACHE_FORCE_RELEASE -DCOPY_PARSE_PLAN_TREES -DWRITE_READ_PARSE_PLAN_TREES -DRAW_EXPRESSION_COVERAGE_TEST CFLAGS: -Og -ggdb + depends_on: SanityCheck only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*' compute_engine_instance: @@ -170,6 +248,7 @@ task: LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES LINUX_MESON_FEATURES: *LINUX_MESON_FEATURES + depends_on: SanityCheck only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*' compute_engine_instance: @@ -311,6 +390,7 @@ task: CFLAGS: -Og -ggdb CXXFLAGS: -Og -ggdb + depends_on: SanityCheck only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*' osx_instance: @@ -428,6 +508,7 @@ task: # 0x8001 is SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX CIRRUS_WINDOWS_ERROR_MODE: 0x8001 + depends_on: SanityCheck only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*' windows_container: @@ -467,9 +548,12 @@ task: task: name: CompilerWarnings - # To limit unnecessary work only run this once the normal linux test succeeds - depends_on: - - Linux - Debian Bullseye - Meson + # To limit unnecessary work only run this once the SanityCheck + # succeeds. This is particularly important for this task as we intentionally + # use always: to continue after failures. Task that did not run count as a + # success, so we need to recheck SanityChecks's condition here ... + depends_on: SanityCheck + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' env: CPUS: 4 @@ -483,10 +567,6 @@ task: LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES LINUX_MESON_FEATURES: *LINUX_MESON_FEATURES - # task that did not run, count as a success, so we need to recheck Linux' - # condition here ... - only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*' - container: image: $CONTAINER_REPO/linux_debian_bullseye_ci:latest cpu: $CPUS -- 2.37.3.542.gdd3f6c4cae