Hi, Attached is an updated version of the CI patches.
Changes: - more optional features are enabled on various platforms, including building with openssl on windows - added somewhat minimal, README explaining how CI can enabled in a repository - some cleanup to the windows crash reporting support. I also moved the code main.c code changes to after the CI stuff themselves, as it might be a bit harder to get into a committable shape (at least for me) Greetings, Andres Freund
>From 48e921a1838762554780357aacd8a092ed6460f2 Mon Sep 17 00:00:00 2001 From: Andres Freund <and...@anarazel.de> Date: Mon, 15 Mar 2021 09:25:15 -0700 Subject: [PATCH v2 1/2] ci: Add CI for FreeBSD, Linux, MacOS and Windows, utilizing cirrus-ci. --- .cirrus.yml | 388 ++++++++++++++++++++++++++++++++ .dockerignore | 3 + ci/README | 36 +++ ci/docker/linux_debian_bullseye | 13 ++ ci/docker/windows_vs_2019 | 111 +++++++++ ci/freebsd_gcp_repartition.sh | 28 +++ ci/pg_ci_base.conf | 12 + ci/windows_build_config.pl | 13 ++ 8 files changed, 604 insertions(+) create mode 100644 .cirrus.yml create mode 100644 .dockerignore create mode 100644 ci/README create mode 100644 ci/docker/linux_debian_bullseye create mode 100644 ci/docker/windows_vs_2019 create mode 100755 ci/freebsd_gcp_repartition.sh create mode 100644 ci/pg_ci_base.conf create mode 100644 ci/windows_build_config.pl diff --git a/.cirrus.yml b/.cirrus.yml new file mode 100644 index 00000000000..b3321a91ae6 --- /dev/null +++ b/.cirrus.yml @@ -0,0 +1,388 @@ +env: + # accelerate initial clone, but a bit of depth so that concurrent tasks work + CIRRUS_CLONE_DEPTH: 100 + # Useful to be able to analyse what in a script takes long + CIRRUS_LOG_TIMESTAMP: true + # target to test, for all but windows + CHECK: check-world + CHECKFLAGS: -Otarget + PGCTLTIMEOUT: 120 + CCACHE_MAXSIZE: "500M" + TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf + PG_TEST_EXTRA: kerberos ldap ssl + + +task: + name: FreeBSD + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*' + compute_engine_instance: + image_project: pg-vm-images-aio + image: family/pg-aio-freebsd-13-0 + platform: freebsd + cpu: 2 + memory: 2G + disk: 50 + env: + CCACHE_DIR: "/tmp/ccache_dir" + + ccache_cache: + folder: "/tmp/ccache_dir" + sysinfo_script: + - export || true + sysconfig_script: + - sudo sysctl kern.corefile='/tmp/%N.%P.core' + repartition_script: + - ci/freebsd_gcp_repartition.sh + create_user_script: + - pw useradd postgres + - chown -R postgres:postgres . + - mkdir -p /tmp/ccache_dir + - chown -R postgres:postgres /tmp/ccache_dir + + configure_script: | + su postgres -c './configure \ + --enable-cassert --enable-debug --enable-tap-tests \ + --enable-nls \ + \ + --with-icu \ + --with-ldap \ + --with-libxml \ + --with-libxslt \ + \ + --with-lz4 \ + --with-pam \ + --with-perl \ + --with-python \ + --with-ssl=openssl \ + --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6/ \ + --with-uuid=bsd \ + \ + --with-includes=/usr/local/include --with-libs=/usr/local/lib \ + CC="ccache cc"' + build_script: + - su postgres -c 'gmake -s -j3 && gmake -s -j3 -C contrib' + upload_caches: + - ccache + + tests_script: + - su postgres -c 'time gmake -s -j2 ${CHECK} ${CHECKFLAGS}' + + on_failure: + cores_script: | + for corefile in $(find /tmp -name '*.core' 2>/dev/null) ; do + binary=$(gdb -quiet -core $corefile -batch -ex 'info auxv' | grep AT_EXECPATH | perl -pe "s/^.*\"(.*)\"\$/\$1/g") ; + echo dumping $corefile for $binary ; + gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" $binary $corefile; + done + log_artifacts: + path: "**/**.log" + type: text/plain + regress_diffs_artifacts: + path: "**/**.diffs" + type: text/plain + tap_artifacts: + path: "**/regress_log_*" + type: text/plain + + +task: + name: Linux + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*' + compute_engine_instance: + image_project: pg-vm-images-aio + image: family/pg-aio-bullseye + platform: linux + cpu: 4 + memory: 2G + nested_virtualization: false + env: + CCACHE_DIR: "/tmp/ccache_dir" + DEBUGINFOD_URLS: "https://debuginfod.debian.net" + + ccache_cache: + folder: "/tmp/ccache_dir" + + sysinfo_script: + - id + - uname -a + - cat /proc/cmdline + - lsblk + - ulimit -a -H + - ulimit -a -S + - export + sysconfig_script: + - useradd -m postgres + - chown -R postgres:postgres . + - mkdir -p /tmp/ccache_dir + - chown -R postgres:postgres /tmp/ccache_dir + - echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf + - su postgres -c 'ulimit -l -H' + - su postgres -c 'ulimit -l -S' + - echo '/tmp/%e-%s-%p.core' > /proc/sys/kernel/core_pattern + + configure_script: | + su postgres -c './configure \ + --enable-cassert --enable-debug --enable-tap-tests \ + --enable-nls \ + \ + --with-gssapi \ + --with-icu \ + --with-ldap \ + --with-libxml \ + --with-libxslt \ + --with-llvm \ + --with-lz4 \ + --with-pam \ + --with-perl \ + --with-python \ + --with-ssl=openssl \ + --with-systemd \ + --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ \ + --with-uuid=e2fs \ + \ + CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" CFLAGS="-O0 -ggdb"' + build_script: + - su postgres -c 'make -s -j4 && make -s -j4 -C contrib' + upload_caches: + - ccache + + tests_script: | + su postgres -c '\ + ulimit -c unlimited; \ + make -s ${CHECK} ${CHECKFLAGS} -j8 \ + ' + + on_failure: + cores_script: | + for corefile in $(find /tmp -name '*.core' 2>/dev/null) ; do + binary=$(gdb -quiet -core $corefile -batch -ex 'info auxv' | grep AT_EXECFN | perl -pe "s/^.*\"(.*)\"\$/\$1/g") ; + echo dumping $corefile for $binary ; + gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" $binary $corefile ; + done + log_artifacts: + path: "**/**.log" + type: text/plain + regress_diffs_artifacts: + path: "**/**.diffs" + type: text/plain + tap_artifacts: + path: "**/regress_log_*" + type: text/plain + + +task: + name: macOS + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*' + osx_instance: + image: big-sur-base + env: + CIRRUS_WORKING_DIR: ${HOME}/pgsql/ + TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf + CCACHE_DIR: ${HOME}/ccache + HOMEBREW_CACHE: ${HOME}/homebrew-cache + PERL5LIB: ${HOME}/perl5/lib/perl5 + + sysinfo_script: + - id + - export + ccache_cache: + folder: ${CCACHE_DIR} + homebrew_cache: + folder: ${HOMEBREW_CACHE} + perl_cache: + folder: ~/perl5 + + cpan_install_script: + - perl -mIPC::Run -e 1 || cpan -T IPC::Run + - perl -mIO::Pty -e 1 || cpan -T IO::Pty + upload_caches: + - perl + core_install_script: + - sudo chmod 777 /cores + homebrew_install_script: + - brew install make coreutils ccache icu4c lz4 tcl-tk openldap + upload_caches: + - homebrew + + configure_script: | + LIBS="/usr/local/lib:$LIBS" + INCLUDES="/usr/local/include:$INCLUDES" + + INCLUDES="/usr/local/opt/openssl/include:$INCLUDES" + LIBS="/usr/local/opt/openssl/lib:$LIBS" + + PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH" + INCLUDES="/usr/local/opt/icu4c/include:$INCLUDES" + LIBS="/usr/local/opt/icu4c/lib:$LIBS" + + LIBS="/usr/local/opt/openldap/lib:$LIBS" + INCLUDES="/usr/local/opt/openldap/include:$INCLUDES" + + export PKG_CONFIG_PATH + + ./configure \ + --prefix=$HOME/install \ + --with-includes="$INCLUDES" \ + --with-libs="$LIBS" \ + \ + --enable-cassert --enable-debug --enable-tap-tests \ + --enable-nls \ + \ + --with-icu \ + --with-ldap \ + --with-libxml \ + --with-libxslt \ + \ + --with-lz4 \ + --with-perl \ + --with-python \ + --with-ssl=openssl \ + --with-tcl --with-tclconfig=/usr/local/opt/tcl-tk/lib/ \ + --with-uuid=e2fs \ + \ + CC="ccache gcc" CFLAGS="-O0 -ggdb" + build_script: + - gmake -s -j12 && gmake -s -j12 -C contrib + upload_caches: + - ccache + + tests_script: + - ulimit -c unlimited + - ulimit -n 1024 + - gmake -s -j12 ${CHECK} ${CHECKFLAGS} + + on_failure: + cores_script: | + for corefile in $(find /cores/ -name 'core.*' 2>/dev/null) ; do + lldb -c $corefile --batch -o 'thread backtrace all' -o 'quit' ; + done + log_artifacts: + path: "**/**.log" + type: text/plain + regress_diffs_artifacts: + path: "**/**.diffs" + type: text/plain + tap_artifacts: + path: "**/regress_log_*" + type: text/plain + + +task: + name: Windows + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*' + windows_container: + dockerfile: ci/docker/windows_vs_2019 + cpu: 4 + memory: 4G + env: + PROVE_FLAGS: -j10 + # The default working dir is in a directory msbuild complains about + CIRRUS_WORKING_DIR: "c:/cirrus" + TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf + # Avoid re-installing over and over + NO_TEMP_INSTALL: 1 + + sysinfo_script: + - chcp + - systeminfo + - powershell -Command get-psdrive -psprovider filesystem + - ps: Get-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' + - set + + configure_script: + - copy ci\windows_build_config.pl src\tools\msvc\config.pl + - vcvarsall x64 + - perl src/tools/msvc/mkvcbuild.pl + build_script: + - vcvarsall x64 + # Disable file tracker, we're never going to rebuild... + - msbuild -m /p:TrackFileAccess=false pgsql.sln + tempinstall_script: + # Installation on windows currently only completely works from src\tools\msvc + - cd src\tools\msvc && perl .\install.pl %CIRRUS_WORKING_DIR%\tmp_install + + check_test_script: + - perl src/tools/msvc/vcregress.pl check parallel + startcreate_test_script: + - tmp_install\bin\pg_ctl.exe initdb -D tmp_check\db -l tmp_check\initdb.log + - echo include '%TEMP_CONFIG%' >> tmp_check\db\postgresql.conf + - tmp_install\bin\pg_ctl.exe start -D tmp_check\db -l tmp_check\postmaster.log + plcheck_test_script: + - perl src/tools/msvc/vcregress.pl plcheck + isolationcheck_test_script: + - perl src/tools/msvc/vcregress.pl isolationcheck + modulescheck_test_script: + - perl src/tools/msvc/vcregress.pl modulescheck + contribcheck_test_script: + - perl src/tools/msvc/vcregress.pl contribcheck + stop_test_script: + - tmp_install\bin\pg_ctl.exe stop -D tmp_check\db -l tmp_check\postmaster.log + ssl_test_script: + - set with_ssl=openssl + - perl src/tools/msvc/vcregress.pl taptest .\src\test\ssl\ + subscriptioncheck_test_script: + - perl src/tools/msvc/vcregress.pl taptest .\src\test\subscription\ + authentication_test_script: + - perl src/tools/msvc/vcregress.pl taptest .\src\test\authentication\ + recoverycheck_test_script: + - perl src/tools/msvc/vcregress.pl recoverycheck + bincheck_test_script: + - perl src/tools/msvc/vcregress.pl bincheck + upgradecheck_test_script: + - perl src/tools/msvc/vcregress.pl upgradecheck + ecpgcheck_test_script: + # tries to build additional stuff + - vcvarsall x64 + # References ecpg_regression.proj in the current dir + - cd src\tools\msvc + - perl vcregress.pl ecpgcheck + + on_failure: + log_artifacts: + path: "**/**.log" + type: text/plain + regress_diffs_artifacts: + path: "**/**.diffs" + type: text/plain + tap_artifacts: + path: "**/regress_log_*" + type: text/plain + + +task: + name: CompilerWarnings + depends_on: + - Linux + # 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: + dockerfile: ci/docker/linux_debian_bullseye + env: + CCACHE_SIZE: "4GB" + CCACHE_DIR: "/tmp/ccache_dir" + ccache_cache: + folder: "/tmp/ccache_dir" + setup_script: + - echo "COPT=-Werror" > src/Makefile.custom + - gcc -v + - clang -v + # gcc with asserts disabled + always: + gcc_warning_script: + - ./configure --cache gcc.cache CC="ccache gcc" + - time make -s -j4 clean && time make -s -j4 + # gcc with asserts enabled + always: + gcc_a_warning_script: + - ./configure --cache gcc.cache --enable-cassert CC="ccache gcc" + - time make -s -j4 clean && time make -s -j4 + # clang with asserts disabled + always: + clang_warning_script: + - ./configure --cache clang.cache CC="ccache clang" + - time make -s -j4 clean && time make -s -j4 + # clang with asserts enabled + always: + clang_a_warning_script: + - ./configure --cache clang.cache --enable-cassert CC="ccache clang" + - time make -s -j4 clean && time make -s -j4 diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000000..3fceab2e97b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +# Ignore everything, except ci/ +* +!ci/* diff --git a/ci/README b/ci/README new file mode 100644 index 00000000000..566fd9fbd78 --- /dev/null +++ b/ci/README @@ -0,0 +1,36 @@ +Postgres Continuous Integration (CI) +==================================== + +Postgres has two forms of CI: + +1) All supported branches in the main postgres repository are continuously + tested via the the the buildfarm. As this covers only the main repository, + it cannot be used during development of features. + + For details see https://buildfarm.postgresql.org/ + +2) For not yet merged development work, CI can be enabled for some git hosting + providers. This allows to test patches on a number of platforms before they + are merged (or even submitted). + + +Configuring CI on personal repositories +======================================= + +Currently postgres contains CI support utilizing cirrus-ci. cirrus-ci +currently is only available for github. + + +Enabling cirrus-ci in a github repository +========================================= + +To enable cirrus-ci on a repository, go to +https://github.com/marketplace/cirrus-ci and select "Public +Repositories". Then "Install it for free" and "Complete order". The next page +allows to configure which repositories cirrus-ci has access too. Choose the +relevant repository and "Install". + +Once enabled on a repository, future commits and pull-requests in that +repository will automatically trigger CI builds. These are visible from the +commit history / PRs, and can also be viewed in the cirrus-ci UI at +https://cirrus-ci.com/github/<username>/<reponame>/ diff --git a/ci/docker/linux_debian_bullseye b/ci/docker/linux_debian_bullseye new file mode 100644 index 00000000000..f6c1782f16b --- /dev/null +++ b/ci/docker/linux_debian_bullseye @@ -0,0 +1,13 @@ +FROM debian:bullseye +RUN \ + apt-get -y update && \ + apt-get -y upgrade && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + git build-essential gcc g++ libreadline-dev flex bison make perl libipc-run-perl \ + libio-pty-perl clang llvm-dev libperl-dev libpython3-dev tcl-dev libldap2-dev \ + libicu-dev docbook-xml docbook-xsl fop libxml2-utils xsltproc krb5-admin-server \ + krb5-kdc krb5-user slapd ldap-utils libssl-dev pkg-config locales-all liblz4-dev \ + libsystemd-dev libxml2-dev libxslt1-dev python3-dev libkrb5-dev libpam-dev \ + libkrb5-*-heimdal uuid-dev gettext \ + liburing-dev python3-distutils ccache && \ + apt-get clean diff --git a/ci/docker/windows_vs_2019 b/ci/docker/windows_vs_2019 new file mode 100644 index 00000000000..a4fcaceae96 --- /dev/null +++ b/ci/docker/windows_vs_2019 @@ -0,0 +1,111 @@ +# escape=` + +# We used to use the visual studio container, but it's too outdated now +FROM cirrusci/windowsservercore:2019 + +SHELL ["powershell", "-NoLogo", "-NoProfile", "-Command"] + + +# Install commandline debugger and log all crashes to c:\cirrus\crashlog.txt +# +# Done manually as doing this via chocolatey / the installer directly, ends up +# with a lot of unnecessary chaff, making the layer unnecessarily large. +RUN ` + mkdir c:\t ; ` + cd c:\t ; ` + ` + setx PATH \"C:\Windows Kits\10\Debuggers\x64;$Env:PATH\" /m ; ` + ` + curl.exe -sSL -o 'windsdksetup.exe' https://download.microsoft.com/download/9/7/9/97982c1d-d687-41be-9dd3-6d01e52ceb68/windowssdk/winsdksetup.exe ; ` + echo 'starting sdk installation (for debugger)' ; ` + Start-Process -Wait -FilePath ".\windsdksetup.exe" ` + -ArgumentList '/Features OptionId.WindowsDesktopDebuggers /layout c:\t\sdk /quiet /norestart /log c:\t\sdk.log' ` + ; ` + ` + Start-Process -Wait -FilePath msiexec.exe ` + -ArgumentList '/a \"C:\t\sdk\Installers\X64 Debuggers And Tools-x64_en-us.msi\" /qb /log install2.log' ` + ; ` + C:\Windows` Kits\10\Debuggers\x64\cdb.exe -version ; ` + ` + Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name 'Debugger' -Value '\"C:\Windows Kits\10\Debuggers\x64\cdb.exe\" -p %ld -e %ld -g -kqm -c \".lines -e; .symfix+ ;.logappend c:\cirrus\crashlog.txt ; !peb; ~*kP ; .logclose ; q \"' ; ` + New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name 'Auto' -Value 1 -PropertyType DWord ; ` + Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name Debugger ; ` + ` + cd c:\ ; ` + Remove-Item C:\t -Force -Recurse + + +# Install perl, python, flex and bison. +# +# Done manually as choco takes a lot longer. I think it's download issues with +# powershell's download stuff? That's wy curl.exe is directly used here at least... +# +# Using perl 5.26.3.1 for now, as newer versions don't currently work correctly +RUN ` + mkdir c:\t ; ` + cd c:\t ; ` + ` + echo 'adding to path, before setup below, so changes are not overwritten' ; ` + setx PATH \"C:\strawberry\perl\bin;C:\winflexbison;C:\Program Files\Git\usr\bin;$Env:PATH\" /m ; ` + ` + curl.exe -sSL -o perl.zip ` + https://strawberryperl.com/download/5.26.3.1/strawberry-perl-5.26.3.1-64bit-portable.zip ; ` + echo 'installing perl' ; ` + 7z.exe x .\perl.zip -xr!c -oc:\strawberry ; ` + ` + curl.exe -sSL -o python.exe https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe ; ` + echo 'installing python' ; ` + Start-Process -Wait -FilePath ".\python.exe" ` + -ArgumentList ` + '/quiet', 'SimpleInstall=1', 'PrependPath=1', 'CompileAll=1', ` + 'TargetDir=c:\python\', 'InstallAllUsers=1', 'Shortcuts=0', ` + 'Include_docs=0', 'Include_tcltk=0', 'Include_tests=0' ` + ; ` + ` + curl.exe -sSL -o winflexbison.zip ` + https://github.com/lexxmark/winflexbison/releases/download/v2.5.24/win_flex_bison-2.5.24.zip ; ` + echo 'installing winflexbison' ; ` + 7z.exe x .\winflexbison.zip -oc:\winflexbison ; ` + Rename-Item -Path c:\winflexbison\win_flex.exe c:\winflexbison\flex.exe ; ` + Rename-Item -Path c:\winflexbison\win_bison.exe c:\winflexbison\bison.exe ; ` + ` + cd c:\ ; ` + Remove-Item C:\t -Force -Recurse + + +# Install openssl +RUN ` + mkdir c:\t ; ` + cd c:\t ; ` + ` + curl.exe -o openssl-setup.exe -sSL https://slproweb.com/download/Win64OpenSSL-1_1_1L.exe ; ` + echo 'staring openssl installation' ; ` + Start-Process -Wait -FilePath ".\openssl-setup.exe" ` + -ArgumentList '/DIR=c:\openssl\1.1.1l\ /VERYSILENT /SP- /SUPPRESSMSGBOXES' ; ` + ` + cd c:\ ; ` + Remove-Item C:\t -Force -Recurse + + +# Install visual studio +# +# Adding VS path to vcvarsall.bat so user of container doesn't need to know the full path +RUN ` + mkdir c:\t ; ` + cd c:\t ; ` + setx PATH \"c:\BuildTools\VC\Auxiliary\Build;$Env:PATH\" /m ; ` + ` + curl.exe -sSL -o c:\t\vs_buildtools.exe https://aka.ms/vs/16/release/vs_buildtools.exe ; ` + echo 'starting visual studio installation' ; ` + Start-Process -Wait ` + -FilePath c:\t\vs_buildtools.exe ` + -ArgumentList ` + '--quiet', '--wait', '--norestart', '--nocache', ` + '--installPath', 'c:\BuildTools', ` + '--add', 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64', ` + '--add', 'Microsoft.VisualStudio.Component.Windows10SDK.20348' ; ` + ` + cd c:\ ; ` + Remove-Item C:\t -Force -Recurse ; ` + Remove-Item -Force -Recurse ${Env:TEMP}\*; ` + Remove-Item -Force -Recurse \"${Env:ProgramData}\Package Cache\" diff --git a/ci/freebsd_gcp_repartition.sh b/ci/freebsd_gcp_repartition.sh new file mode 100755 index 00000000000..2d5e1738998 --- /dev/null +++ b/ci/freebsd_gcp_repartition.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +set -e +set -x + +# The default filesystem on freebsd gcp images is very slow to run tests on, +# due to its 32KB block size +# +# XXX: It'd probably better to fix this in the image, using something like +# https://people.freebsd.org/~lidl/blog/re-root.html + +# fix backup partition table after resize +gpart recover da0 +gpart show da0 +# kill swap, so we can delete a partition +swapoff -a || true +# (apparently we can only have 4!?) +gpart delete -i 3 da0 +gpart add -t freebsd-ufs -l data8k -a 4096 da0 +gpart show da0 +newfs -U -b 8192 /dev/da0p3 + +# Migrate working directory +du -hs $CIRRUS_WORKING_DIR +mv $CIRRUS_WORKING_DIR $CIRRUS_WORKING_DIR.orig +mkdir $CIRRUS_WORKING_DIR +mount -o noatime /dev/da0p3 $CIRRUS_WORKING_DIR +cp -r $CIRRUS_WORKING_DIR.orig/* $CIRRUS_WORKING_DIR/ diff --git a/ci/pg_ci_base.conf b/ci/pg_ci_base.conf new file mode 100644 index 00000000000..637e3cfb343 --- /dev/null +++ b/ci/pg_ci_base.conf @@ -0,0 +1,12 @@ +# Tends to produce too many core files, taking a long time +restart_after_crash = false + +# So that tests using the "manually" started postgres on windows can use +# prepared statements +max_prepared_transactions=10 + +# Settings that make logs more useful +log_line_prefix='%m [%p][%b][%v:%x] ' +log_checkpoints = true +log_connections = true +log_disconnections = true diff --git a/ci/windows_build_config.pl b/ci/windows_build_config.pl new file mode 100644 index 00000000000..ba82b13d69a --- /dev/null +++ b/ci/windows_build_config.pl @@ -0,0 +1,13 @@ +use strict; +use warnings; + +our $config; + +$config->{"tap_tests"} = 1; +$config->{"asserts"} = 1; + +$config->{"openssl"} = "c:/openssl/1.1.1l/"; +$config->{"perl"} = "c:/strawberry/perl/"; +$config->{"python"} = "c:/python/"; + +1; -- 2.23.0.385.gbc12974a89
>From a2ad3d58e43a5982b89a7aea2722b98395cae1fe Mon Sep 17 00:00:00 2001 From: Andres Freund <and...@anarazel.de> Date: Thu, 9 Sep 2021 17:49:39 -0700 Subject: [PATCH v2 2/2] windows: Improve crash / assert / exception handling. --- .cirrus.yml | 7 +++++++ src/backend/main/main.c | 45 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index b3321a91ae6..f75bdce6dec 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -337,6 +337,13 @@ task: - cd src\tools\msvc - perl vcregress.pl ecpgcheck + always: + cores_script: + - cat crashlog.txt || true + dump_artifacts: + path: "crashlog.txt" + type: text/plain + on_failure: log_artifacts: path: "**/**.log" diff --git a/src/backend/main/main.c b/src/backend/main/main.c index ad84a45e28c..5115ad91898 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -26,6 +26,10 @@ #include <sys/param.h> #endif +#if defined(WIN32) +#include <crtdbg.h> +#endif + #if defined(_M_AMD64) && _MSC_VER == 1800 #include <math.h> #include <versionhelpers.h> @@ -237,8 +241,45 @@ startup_hacks(const char *progname) exit(1); } - /* In case of general protection fault, don't show GUI popup box */ - SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); + /* + * SEM_FAILCRITICALERRORS causes more errors to be reported to + * callers. + * + * We used to also specify SEM_NOGPFAULTERRORBOX, but that prevents + * windows crash reporting from working. Which includes registered + * just-in-time debuggers. Now we try to disable sources of popups + * separately below (note that SEM_NOGPFAULTERRORBOX didn't actually + * prevent several sources of popups). + */ + SetErrorMode(SEM_FAILCRITICALERRORS); + + /* + * Show errors on stderr instead of popup box (note this doesn't + * affect errors originating in the C runtime, see below). + */ + _set_error_mode(_OUT_TO_STDERR); + + + /* + * By default abort() only generates a crash-dump in *non* debug + * builds. As our Assert() / ExceptionalCondition() uses abort(), + * leaving the default in place would make debugging harder. + */ +#ifndef __MINGW64__ + _set_abort_behavior(_CALL_REPORTFAULT | _WRITE_ABORT_MSG, + _CALL_REPORTFAULT | _WRITE_ABORT_MSG); +#endif + + /* + * In case of errors (including assertions) on the C runtime level, + * report them to stderr (and the debugger) instead of displaying a + * popup. This is C runtime specific and thus the above incantations + * aren't sufficient to suppress these popups. + */ + _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); + _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); #if defined(_M_AMD64) && _MSC_VER == 1800 -- 2.23.0.385.gbc12974a89