Skip to content

Add iceberg patch for filter refactor #297

Add iceberg patch for filter refactor

Add iceberg patch for filter refactor #297

Workflow file for this run

name: Main
on:
workflow_dispatch:
inputs:
override_git_describe:
type: string
git_ref:
type: string
skip_tests:
type: boolean
default: false
run_all:
type: boolean
default: true
repository_dispatch:
push:
branches-ignore:
- 'main'
- 'feature'
- 'v*.*-*'
- 'gh-readonly-queue/**'
paths-ignore:
- '**.md'
- 'tools/**'
- '!tools/shell/**'
- '!tools/juliapkg/**'
- '.github/patches/duckdb-wasm/**'
- '.github/workflows/**'
- '!.github/workflows/Main.yml'
- '!.github/workflows/Swift.yml'
- '!.github/workflows/Windows.yml'
- '!.github/workflows/Regression.yml'
- '!.github/workflows/Extensions.yml'
merge_group:
pull_request:
types: [opened, reopened, ready_for_review, converted_to_draft, synchronize]
paths-ignore:
- '**.md'
- 'tools/**'
- '!tools/shell/**'
- '!tools/juliapkg/**'
- '.github/patches/duckdb-wasm/**'
- '.github/workflows/**'
- '!.github/workflows/Main.yml'
- '!.github/workflows/Swift.yml'
- '!.github/workflows/Windows.yml'
- '!.github/workflows/Regression.yml'
- '!.github/workflows/Extensions.yml'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.head_ref || '' }}-${{ github.base_ref || '' }}-${{ github.ref != 'refs/heads/main' || github.sha }}
cancel-in-progress: true
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
# Run only specific jobs in CI (separated by whitespace) and skip the rest.
#
# Add the CI job's `needs:` list here as well. Otherwise, those are skipped
# and the dependent job is also skipped.
#
# For example, to run only "extensions", use:
# OVERRIDE_JOBS: linux-relassert linux-release extensions
jobs:
prepare:
# We run all other jobs on PRs only if they are not draft PR
if: |
(github.event_name != 'pull_request' || github.event.pull_request.draft == false) &&
(github.event.action != 'synchronize' || contains(fromJSON('["OWNER","MEMBER","COLLABORATOR"]'), github.event.pull_request.author_association))
runs-on: ${{ github.repository == 'duckdb/duckdb' && 'namespace-profile-linux-x64' || 'ubuntu-latest' }}
outputs:
git_sha: ${{ steps.resolve_git_sha.outputs.git_sha }}
runner_linux_small: ${{ steps.config.outputs.runner_linux_small }}
runner_linux_x64: ${{ steps.config.outputs.runner_linux_x64 }}
runner_linux_22_x64: ${{ steps.config.outputs.runner_linux_22_x64 }}
runner_linux_arm64: ${{ steps.config.outputs.runner_linux_arm64 }}
runner_windows_2022_x64: ${{ steps.config.outputs.runner_windows_2022_x64 }}
runner_macos_arm64: ${{ steps.config.outputs.runner_macos_arm64 }}
runner_macos_14_arm64: ${{ steps.config.outputs.runner_macos_14_arm64 }}
runners: ${{ steps.config.outputs.runners }}
linux_cli_matrix: ${{ steps.config.outputs.linux_cli_matrix }}
linux_musl_cli_matrix: ${{ steps.config.outputs.linux_musl_cli_matrix }}
static_libs_linux_matrix: ${{ steps.config.outputs.static_libs_linux_matrix }}
extensions_changed: ${{ steps.changed.outputs.extensions_any_changed }}
changed_tests_files: ${{ steps.changed.outputs.tests_all_changed_files }}
changed_slow_tests_files: ${{ steps.changed.outputs.tests_slow_all_changed_files }}
run_slow_tests: ${{ steps.config.outputs.run_slow_tests }}
extensions_extra_exclude_archs: ${{ steps.config.outputs.extra_exclude_archs }}
enabled_jobs: ${{ steps.config.outputs.enabled_jobs }}
save_cache: ${{ steps.config.outputs.save_cache }}
runner_provider: ${{ steps.config.outputs.runner_provider }}
skip_tests: ${{ steps.config.outputs.skip_tests }}
env:
GEN: ninja
steps:
- name: Resolve git sha
id: resolve_git_sha
shell: bash
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" && -n "${{ inputs.git_ref }}" ]]; then
resolved_sha="$(gh api -X GET "/repos/${{ github.repository }}/commits" -f sha="${{ inputs.git_ref }}" -f per_page=1 --jq '.[0].sha')"
else
resolved_sha="${{ github.sha }}"
fi
echo "git_sha=$resolved_sha" >> "$GITHUB_OUTPUT"
echo "Using git_sha=$resolved_sha"
- name: "Checkout"
uses: duckdb/duckdb-ci/.github/actions/checkout@main
with:
runner_provider: ${{ github.repository == 'duckdb/duckdb' && 'namespace' || 'github' }}
fetch_depth: 0
ref: ${{ steps.resolve_git_sha.outputs.git_sha }}
- name: Detect changes
id: changed
uses: tj-actions/changed-files@v47
with:
files_yaml: |
github:
- .github/**
extensions:
- .github/config/**
- .github/patches/**
- extensions/**
tests:
- test/**/*.test
tests_slow:
- test/**/*.cpp
- test/**/*.test_slow
capi:
- src/include/duckdb.h
- src/common/types.cpp
- src/include/duckdb/common/types.hpp
- src/function/table/system/test_all_types.cpp
julia:
- tools/juliapkg/**
- name: Check CI
timeout-minutes: 10
if: steps.changed.outputs.github_any_changed == 'true'
run: |
echo "::add-matcher::.github/actionlint-matcher.json"
echo "::group::ShellCheck version"
shellcheck --version
echo "::endgroup::"
echo "::group::Install actionlint"
python3 scripts/ci/retry.py -- bash -c 'bash <(curl --fail --retry 5 --retry-all-errors https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)'
echo "::endgroup::"
./actionlint -color
make test_ci
shell: bash
- name: Configure CI
id: config
run: |
if [[ "${{ github.event_name }}" != "pull_request" || "${{ steps.changed.outputs.extensions_any_changed }}" == "true" ]]; then
extra_exclude_archs=
else
extra_exclude_archs=windows_amd64\;wasm_eh
fi
echo "extra_exclude_archs=$extra_exclude_archs" >> "$GITHUB_OUTPUT"
if [[ "${{ steps.changed.outputs.tests_slow_any_changed }}" == "true" || "${{ github.ref_name }}" == "main" ]]; then
run_slow_tests=true
else
run_slow_tests=false
fi
echo "run_slow_tests=$run_slow_tests" >> "$GITHUB_OUTPUT"
skip_tests="${{ github.event_name == 'workflow_dispatch' && github.event.inputs.skip_tests || 'false' }}"
echo "skip_tests=$skip_tests" >> "$GITHUB_OUTPUT"
# Fall back to GitHub-native runners for forks.
if [[ "${{ github.repository }}" == "duckdb/duckdb" ]]; then
runner_provider=namespace
runner_linux_small=namespace-profile-linux-small
runner_linux_x64=namespace-profile-linux-x64
runner_linux_22_x64=namespace-profile-linux-22-x64
runner_linux_arm64=namespace-profile-linux-arm64
runner_windows_2022_x64=namespace-profile-windows-x64
runner_macos_arm64=namespace-profile-macos-arm64
runner_macos_14_arm64=namespace-profile-macos-14-arm64
else
runner_provider=github
runner_linux_small=ubuntu-latest
runner_linux_x64=ubuntu-latest
runner_linux_22_x64=ubuntu-22.04
runner_linux_arm64=ubuntu-24.04-arm
runner_windows_2022_x64=windows-2022
runner_macos_arm64=macos-14
runner_macos_14_arm64=macos-14
fi
{
echo "runner_provider=$runner_provider"
echo "runner_linux_small=$runner_linux_small"
echo "runner_linux_x64=$runner_linux_x64"
echo "runner_linux_22_x64=$runner_linux_22_x64"
echo "runner_linux_arm64=$runner_linux_arm64"
echo "runner_windows_2022_x64=$runner_windows_2022_x64"
echo "runner_macos_arm64=$runner_macos_arm64"
echo "runner_macos_14_arm64=$runner_macos_14_arm64"
} >> "$GITHUB_OUTPUT"
{
echo "runners<<EOF"
cat <<EOF
{
"linux_x64": "$runner_linux_x64",
"linux_22_x64": "$runner_linux_22_x64",
"linux_arm64": "$runner_linux_arm64",
"windows_2022_x64": "$runner_windows_2022_x64",
"windows_x64": "$runner_windows_2022_x64",
"macos_arm64": "$runner_macos_arm64",
"macos_14_arm64": "$runner_macos_14_arm64"
}
EOF
echo "EOF"
} >> "$GITHUB_OUTPUT"
linux_cli_matrix=$(
jq -nc --arg runner "$runner_linux_x64" \
'[{runner: $runner, arch: "amd64", image: "x86_64"}]'
)
linux_musl_cli_matrix=$(
jq -nc --arg runner "$runner_linux_arm64" \
'[{runner: $runner, arch: "arm64"}]'
)
static_libs_linux_matrix=$(
jq -nc --arg runner "$runner_linux_x64" \
'[{runner: $runner, arch: "amd64", image: "quay.io/pypa/manylinux_2_28_x86_64"}]'
)
if [[ "${{ github.event_name }}" != "pull_request" ]]; then
linux_cli_matrix=$(
jq -c --arg runner "$runner_linux_arm64" \
'. += [{runner: $runner, arch: "arm64", image: "aarch64"}]' <<<"$linux_cli_matrix"
)
linux_musl_cli_matrix=$(
jq -c --arg runner "$runner_linux_x64" \
'. |= [{runner: $runner, arch: "amd64"}] + .' <<<"$linux_musl_cli_matrix"
)
fi
if [[ "${{ github.ref_name }}" == "main" ]]; then
static_libs_linux_matrix=$(
jq -c --arg runner "$runner_linux_arm64" \
'. += [{runner: $runner, arch: "arm64", image: "quay.io/pypa/manylinux_2_28_aarch64"}]' <<<"$static_libs_linux_matrix"
)
fi
python3 scripts/ci/job_stages.py \
--event "${{ github.event_name }}" \
--ref_name "${{ github.ref_name }}" \
--repository "${{ github.repository }}" \
--skip-tests "$skip_tests" \
--changed-keys "${{ steps.changed.outputs.changed_keys }}"
grep -E '^(extra_exclude_archs|runner_)' "$GITHUB_OUTPUT"
{
echo "linux_cli_matrix=$linux_cli_matrix"
echo "linux_musl_cli_matrix=$linux_musl_cli_matrix"
echo "static_libs_linux_matrix=$static_libs_linux_matrix"
} >> "$GITHUB_OUTPUT"
- name: Install tools
timeout-minutes: 10
run: python3 scripts/ci/retry.py -- make -j4 format_tools
- name: Check format
run: |
make format-check-silent enum-integrity-check -j -Otarget
echo "::group::Check generated files"
make generate-files
git diff --exit-code
echo "::endgroup::"
linux-relassert:
name: Linux Relassert
# This tests release build while enabling slow verifiers (masked by #ifdef DEBUG) and sanitizers
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'linux-relassert') }}
needs: prepare
runs-on: ${{ needs.prepare.outputs.runner_linux_x64 }}
env:
CC: clang-20
CXX: clang++-20
TREAT_WARNINGS_AS_ERRORS: 1
GEN: ninja
CRASH_ON_ASSERT: 1
FORCE_DEBUG: 1
FORCE_ASSERT: 1
EXPORT_DYNAMIC_SYMBOLS: 1
REDUCE_SYMBOLS: 1
EXTENSION_STATIC_BUILD: 0
steps:
- name: "Checkout"
uses: duckdb/duckdb-ci/.github/actions/checkout@main
with:
runner_provider: ${{ needs.prepare.outputs.runner_provider }}
fetch_depth: 0
ref: ${{ needs.prepare.outputs.git_sha }}
- id: describe_step
run: echo "git_describe=$(git describe --tags --long)" >> "$GITHUB_OUTPUT"
- name: Install tools
timeout-minutes: 10
run: python3 scripts/ci/retry.py -- make toolsci
- name: Fix ASan runtime
shell: bash
run: |
# libclang_rt.asan_static.a is missing in ubuntu 24.04.
asan_static_dir="/usr/lib/llvm-20/lib/clang/20/lib/x86_64-pc-linux-gnu"
asan_static_target="/usr/lib/llvm-20/lib/clang/20/lib/linux/libclang_rt.asan_static-x86_64.a"
if [[ ! -e "${asan_static_dir}/libclang_rt.asan_static.a" && -e "${asan_static_target}" ]]; then
sudo mkdir -p "${asan_static_dir}"
sudo ln -sf "${asan_static_target}" "${asan_static_dir}/libclang_rt.asan_static.a"
fi
- uses: ./.github/actions/ccache-action
with:
save: ${{ fromJson(needs.prepare.outputs.save_cache) }}
- name: Write changed tests file
shell: bash
run: printf '%s\n' "${{ needs.prepare.outputs.changed_tests_files }}" | tr ' ' '\n' | sed '/^$/d' > "${{ runner.temp }}/changed_tests.txt"
- name: Build DuckDB
uses: duckdb/duckdb-ci/build-duckdb@main
with:
build-type: relassert
build: python3 scripts/ci/retry.py -- make relassert
test: make smoke T="--changed-tests=${{ runner.temp }}/changed_tests.txt"
bundle: make relassert-artifact
upload-name: linux-relassert-build
upload-path: build/relassert-artifact.tar.gz
save-cache: ${{ fromJson(needs.prepare.outputs.save_cache) }}
- name: Output version info
run: ./build/relassert/duckdb -c "PRAGMA version;"
linux-relassert-tests:
name: Linux Relassert Tests
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'linux-relassert-tests') }}
needs:
- prepare
- linux-relassert
runs-on: ${{ needs.prepare.outputs.runner_linux_x64 }}
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.prepare.outputs.git_sha }}
- name: Install tools
timeout-minutes: 10
run: python3 scripts/ci/retry.py -- make toolsci
- name: Download relassert build artifact
uses: actions/download-artifact@v8
with:
name: linux-relassert-build
path: build
- name: Extract relassert build artifact
run: |
rm -rf build/relassert
tar -xzf build/relassert-artifact.tar.gz -C build
ls -lh build/relassert/test/unittest
- name: Set DUCKDB_INSTALL_LIB for ADBC tests
run: echo "DUCKDB_INSTALL_LIB=$(find "$PWD" -name 'libduck*.so' | head -n 1)" >> "$GITHUB_ENV"
- name: Test DUCKDB_INSTALL_LIB variable
run: echo "$DUCKDB_INSTALL_LIB"
- name: Test
run: make unittest_relassert
regression:
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'regression') }}
uses: ./.github/workflows/Regression.yml
secrets: inherit
needs:
- prepare
- linux-relassert
- linux-release
with:
git_ref: ${{ needs.prepare.outputs.git_sha }}
build_current_release: false
run_slow_tests: ${{ needs.prepare.outputs.run_slow_tests == 'true' }}
runner_linux_x64: ${{ needs.prepare.outputs.runner_linux_x64 }}
runner_linux_small: ${{ needs.prepare.outputs.runner_linux_small }}
save_cache: ${{ fromJson(needs.prepare.outputs.save_cache) }}
tidy-check:
name: Tidy Check
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'tidy-check') }}
needs: prepare
runs-on: ${{ needs.prepare.outputs.runner_linux_x64 }}
env:
CC: gcc
CXX: g++
GEN: ninja
CLANGD_BINARY: clangd-20
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ needs.prepare.outputs.git_sha }}
- name: Install
timeout-minutes: 10
run: |
python3 scripts/ci/retry.py -- make toolsci
python3 scripts/ci/retry.py -- sudo apt-get update -y -qq
python3 scripts/ci/retry.py -- sudo apt-get install -y -qq clang-tidy
python3 scripts/ci/retry.py -- sudo pip3 install 'pybind11[global]' --break-system-packages
- name: Tidy Check Diff
if: ${{ github.event_name == 'pull_request' || github.event_name == 'merge_group' }}
run: DUCKDB_GIT_BASE_BRANCH=${{ github.base_ref }} make tidy-check-diff
- name: Clean
run: make clean
- name: Install clangd-tidy
run: python3 scripts/ci/retry.py -- make install-clangd-tidy
- name: Tidy Check (clangd)
run: |
mkdir -p ~/.config/clangd
cat > ~/.config/clangd/config.yaml <<'EOF'
Diagnostics:
UnusedIncludes: None
EOF
make tidy-check-clangd CLANGD_TIDY_QUERY_DRIVER=/usr/bin/**/g++*,/usr/bin/**/gcc*
extensions:
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'extensions') }}
uses: ./.github/workflows/Extensions.yml
secrets: inherit
needs:
- prepare
- linux-relassert
- linux-release
with:
override_git_describe: ${{ github.event_name == 'workflow_dispatch' && inputs.override_git_describe || '' }}
git_ref: ${{ needs.prepare.outputs.git_sha }}
extra_exclude_archs: ${{ needs.prepare.outputs.extensions_extra_exclude_archs }}
skip_tests: ${{ fromJson(needs.prepare.outputs.skip_tests) }}
run_all: ${{ github.event_name != 'workflow_dispatch' || inputs.run_all }}
opt_in_archs: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'repository_dispatch') && 'windows_arm64;linux_amd64_musl;linux_arm64_musl' || '' }}
runners: ${{ needs.prepare.outputs.runners }}
save_cache: ${{ fromJson(needs.prepare.outputs.save_cache) }}
wasm-eh:
name: Wasm EH
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'wasm-eh') }}
needs:
- prepare
- linux-relassert
runs-on: ${{ needs.prepare.outputs.runner_linux_x64 }}
env:
GEN: make
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.prepare.outputs.git_sha }}
- uses: mymindstorm/setup-emsdk@v16
with:
version: latest
- name: Install tools
timeout-minutes: 10
run: python3 scripts/ci/retry.py -- make toolsci
- uses: ./.github/actions/ccache-action
with:
save: ${{ fromJson(needs.prepare.outputs.save_cache) }}
- name: Build
run: make wasm_ci
linux-release:
name: Linux Release
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'linux-release') }}
needs: prepare
runs-on: ${{ needs.prepare.outputs.runner_linux_x64 }}
env:
GEN: ninja
steps:
- name: "Checkout"
uses: duckdb/duckdb-ci/.github/actions/checkout@main
with:
runner_provider: ${{ needs.prepare.outputs.runner_provider }}
fetch_depth: 0
ref: ${{ needs.prepare.outputs.git_sha }}
- name: Install tools
timeout-minutes: 10
run: python3 scripts/ci/retry.py -- make toolsci
- uses: ./.github/actions/ccache-action
with:
save: ${{ fromJson(needs.prepare.outputs.save_cache) }}
- name: Write changed tests file
shell: bash
run: printf '%s\n' "${{ needs.prepare.outputs.changed_tests_files }}" | tr ' ' '\n' | sed '/^$/d' > "${{ runner.temp }}/changed_tests.txt"
- name: Build DuckDB
uses: duckdb/duckdb-ci/build-duckdb@main
env:
BUILD_BENCHMARK: 1
BUILD_JEMALLOC: 1
CORE_EXTENSIONS: "icu;tpch;tpcds;fts;json;inet;parquet;autocomplete;httpfs"
DISABLE_SANITIZER: 1
SMOKE_UNITTEST: build/release/test/unittest
with:
build: python3 scripts/ci/retry.py -- make release
test: ${{ fromJson(needs.prepare.outputs.skip_tests) && 'true' || 'make smoke T="--changed-tests=$RUNNER_TEMP/changed_tests.txt"' }}
bundle: make release-artifact
upload-name: linux-release-build
vcpkg-commit: 84bab45d415d22042bd0b9081aea57f362da3f35
save-cache: ${{ fromJson(needs.prepare.outputs.save_cache) }}
- name: Clean
run: make clean
- name: Build linux default release
uses: duckdb/duckdb-ci/build-duckdb@main
with:
build: python3 scripts/ci/retry.py -- make release
- name: Symbol Checks
run: make -j4 --output-sync=target symbol-checks
- name: Deploy
shell: bash
env:
AWS_ENDPOINT_URL: ${{ secrets.S3_DUCKDB_STAGING_ENDPOINT }}
AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
run: |
zip -j libduckdb-src.zip src/include/duckdb.h src/include/duckdb_extension.h
./scripts/upload-assets-to-staging.sh github_release libduckdb-src.zip
linux-release-tests:
name: Linux Release Tests
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'linux-release-tests') }}
needs:
- prepare
- linux-release
runs-on: ${{ needs.prepare.outputs.runner_linux_x64 }}
steps:
- name: "Checkout"
uses: duckdb/duckdb-ci/.github/actions/checkout@main
with:
runner_provider: ${{ needs.prepare.outputs.runner_provider }}
fetch_depth: 0
ref: ${{ needs.prepare.outputs.git_sha }}
- name: Install tools
timeout-minutes: 10
run: python3 scripts/ci/retry.py -- make toolsci
- name: Download linux release artifact
uses: actions/download-artifact@v8
with:
name: linux-release-build
path: build
- name: Extract linux release artifact
run: |
rm -rf build/release
tar -xzf build/release-artifact.tar.gz -C build
- name: Run all release unit tests
run: make allunit
linux-release-cli:
name: Linux CLI (${{ matrix.config.arch }})
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'linux-release-cli') }}
needs:
- prepare
- linux-release
strategy:
fail-fast: false
matrix:
config: ${{ fromJson(needs.prepare.outputs.linux_cli_matrix) }}
runs-on: ${{ matrix.config.runner }}
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.prepare.outputs.git_sha }}
- name: Install tools
timeout-minutes: 10
run: python3 scripts/ci/retry.py -- make toolsci
- name: Install pytest
timeout-minutes: 10
if: ${{ !fromJson(needs.prepare.outputs.skip_tests) }}
run: |
python3 scripts/ci/retry.py -- pip install --break-system-packages pytest
- uses: ./.github/actions/cleanup_runner
- uses: ./.github/actions/ccache-action
with:
save: ${{ fromJson(needs.prepare.outputs.save_cache) }}
key: linux-cli-${{ matrix.config.arch }}-glibc
- name: Build
run: |
docker run \
-v"$PWD:$PWD" \
-e GEN=ninja \
-e CC='ccache gcc' \
-e CXX='ccache g++' \
-e CCACHE_DIR="$PWD/.ccache" \
-e EXTENSION_CONFIGS="$PWD/.github/config/bundled_extensions.cmake" \
-e ENABLE_EXTENSION_AUTOLOADING=1 \
-e ENABLE_EXTENSION_AUTOINSTALL=1 \
-e BUILD_BENCHMARK=1 \
-e FORCE_WARN_UNUSED=1 \
quay.io/pypa/manylinux_2_28_${{ matrix.config.image }} \
bash -c "
set -e
cat /etc/os-release
dnf install -y \
ccache \
ninja-build \
python3.12 \
perl-IPC-Cmd
git config --global --add safe.directory \"$PWD\"
make -C \"$PWD\"
"
- name: Print platform
run: ./build/release/duckdb -c "PRAGMA platform;"
- name: Deploy
env:
AWS_ENDPOINT_URL: ${{ secrets.S3_DUCKDB_STAGING_ENDPOINT }}
AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
run: |
zip -j duckdb_cli-linux-${{ matrix.config.arch }}.zip build/release/duckdb
gzip -9 -k -n -c build/release/duckdb > duckdb_cli-linux-${{ matrix.config.arch }}.gz
zip -j libduckdb-linux-${{ matrix.config.arch }}.zip build/release/src/libduckdb*.* src/include/duckdb.h
./scripts/upload-assets-to-staging.sh github_release libduckdb-linux-${{ matrix.config.arch }}.zip duckdb_cli-linux-${{ matrix.config.arch }}.zip duckdb_cli-linux-${{ matrix.config.arch }}.gz
- uses: actions/upload-artifact@v7
with:
name: duckdb-binaries-linux-${{ matrix.config.arch }}
path: |
libduckdb-linux-${{ matrix.config.arch }}.zip
duckdb_cli-linux-${{ matrix.config.arch }}.zip
duckdb_cli-linux-${{ matrix.config.arch }}.gz
- name: Release tests
if: ${{ !fromJson(needs.prepare.outputs.skip_tests) }}
shell: bash
run: |
if [[ "${{ needs.prepare.outputs.run_slow_tests }}" == "true" ]]; then
make alltest_release_tag
else
make test_release_tag
fi
- name: Tools Tests
if: ${{ !fromJson(needs.prepare.outputs.skip_tests) }}
run: python3 -m pytest tools/shell/tests --shell-binary build/release/duckdb
- name: Examples
if: ${{ !fromJson(needs.prepare.outputs.skip_tests) }}
run: |
build/release/benchmark/benchmark_runner benchmark/micro/update/update_with_join.benchmark
build/release/duckdb -c "COPY (SELECT 42) TO '/dev/stdout' (FORMAT PARQUET)" | cat
linux-musl-release-cli:
name: Linux CLI (${{ matrix.config.arch }}-musl)
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'linux-musl-release-cli') }}
needs:
- prepare
- linux-release
strategy:
fail-fast: false
matrix:
config: ${{ fromJson(needs.prepare.outputs.linux_musl_cli_matrix) }}
runs-on: ${{ matrix.config.runner }}
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.prepare.outputs.git_sha }}
- name: Install tools
timeout-minutes: 10
run: python3 scripts/ci/retry.py -- make toolsci
- uses: ./.github/actions/cleanup_runner
- uses: ./.github/actions/ccache-action
with:
save: ${{ fromJson(needs.prepare.outputs.save_cache) }}
key: linux-cli-${{ matrix.config.arch }}-musl
- name: Build
shell: bash
run: |
docker run \
-v"$PWD:$PWD" \
-e GEN=ninja \
-e CC='ccache gcc' \
-e CXX='ccache g++' \
-e CCACHE_DIR="$PWD/.ccache" \
-e EXTENSION_CONFIGS="$PWD/.github/config/bundled_extensions.cmake" \
-e ENABLE_EXTENSION_AUTOLOADING=1 \
-e ENABLE_EXTENSION_AUTOINSTALL=1 \
-e BUILD_BENCHMARK=1 \
-e FORCE_WARN_UNUSED=1 \
alpine:3.22 \
sh -c "
set -e
cat /etc/os-release
apk add \
ccache \
cmake \
g++ \
git \
make \
python3 \
samurai
git config --global --add safe.directory \"$PWD\"
make -C \"$PWD\"
"
- name: Deploy
shell: bash
env:
AWS_ENDPOINT_URL: ${{ secrets.S3_DUCKDB_STAGING_ENDPOINT }}
AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
run: |
zip -j duckdb_cli-linux-${{ matrix.config.arch }}-musl.zip build/release/duckdb
gzip -9 -k -n -c build/release/duckdb > duckdb_cli-linux-${{ matrix.config.arch }}-musl.gz
zip -j libduckdb-linux-${{ matrix.config.arch }}-musl.zip build/release/src/libduckdb*.* src/include/duckdb.h
./scripts/upload-assets-to-staging.sh github_release libduckdb-linux-${{ matrix.config.arch }}-musl.zip duckdb_cli-linux-${{ matrix.config.arch }}-musl.zip duckdb_cli-linux-${{ matrix.config.arch }}-musl.gz
- uses: actions/upload-artifact@v7
with:
name: duckdb-binaries-linux-${{ matrix.config.arch }}-musl
path: |
libduckdb-linux-${{ matrix.config.arch }}-musl.zip
duckdb_cli-linux-${{ matrix.config.arch }}-musl.zip
duckdb_cli-linux-${{ matrix.config.arch }}-musl.gz
- name: Test
if: ${{ !fromJson(needs.prepare.outputs.skip_tests) }}
shell: bash
env:
RUN_SLOW_TESTS: ${{ needs.prepare.outputs.run_slow_tests }}
run: |
docker run \
-v"$PWD:$PWD" \
-e CI=1 \
-e RUN_SLOW_TESTS="$RUN_SLOW_TESTS" \
alpine:3.22 \
sh -c "
set -e
cat /etc/os-release
apk add \
make \
python3 \
py3-pytest
cd \"$PWD\"
echo Release tests
if [ \"\$RUN_SLOW_TESTS\" = \"true\" ]; then
make alltest_release_tag
else
make test_release_tag
fi
echo Tools Tests
python3 -m pytest tools/shell/tests --shell-binary build/release/duckdb
echo Examples
build/release/benchmark/benchmark_runner benchmark/micro/update/update_with_join.benchmark
build/release/duckdb -c \"COPY (SELECT 42) TO '/dev/stdout' (FORMAT PARQUET)\" | cat
"
main_julia:
name: Julia ${{ matrix.version }}
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'main_julia') }}
needs:
- prepare
- linux-release-cli
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
version:
- '1.10'
- '1'
arch:
- x64
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ needs.prepare.outputs.git_sha }}
- uses: julia-actions/setup-julia@v2
with:
version: ${{ matrix.version }}
arch: ${{ matrix.arch }}
- uses: actions/download-artifact@v8
with:
name: duckdb-binaries-linux-amd64
path: linux-release-artifacts
- name: Extract DuckDB Linux release artifacts
shell: bash
run: |
mkdir -p build/release/src
unzip -j linux-release-artifacts/duckdb_cli-linux-amd64.zip "duckdb" -d build/release
chmod +x build/release/duckdb
unzip -j linux-release-artifacts/libduckdb-linux-amd64.zip "libduckdb.so*" -d build/release/src
ls -lah build/release/duckdb
ls -lah build/release/src/libduckdb.so*
- name: Run Tests
if: ${{ !fromJson(needs.prepare.outputs.skip_tests) }}
shell: bash
run: |
JULIA_DUCKDB_LIBRARY="$(pwd)/build/release/src/libduckdb.so"
export JULIA_DUCKDB_LIBRARY
export JULIA_NUM_THREADS=2
export LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libstdc++.so.6"
ls "$JULIA_DUCKDB_LIBRARY"
cd tools/juliapkg
julia --project -e "import Pkg; Pkg.test()"
- name: Format Check
if: ${{ always() && matrix.version == '1.10' }}
shell: bash
run: |
cd tools/juliapkg
julia -e "import Pkg; Pkg.add(\"JuliaFormatter\")"
./format_check.sh
swift:
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'swift') }}
uses: ./.github/workflows/Swift.yml
secrets: inherit
needs:
- prepare
- linux-relassert
with:
git_ref: ${{ needs.prepare.outputs.git_sha }}
runner_macos_arm64: ${{ needs.prepare.outputs.runner_macos_14_arm64 }}
windows:
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'windows') }}
uses: ./.github/workflows/Windows.yml
secrets: inherit
needs:
- prepare
- linux-relassert
with:
override_git_describe: ${{ github.event_name == 'workflow_dispatch' && inputs.override_git_describe || '' }}
git_ref: ${{ needs.prepare.outputs.git_sha }}
runner_windows_2022_x64: ${{ needs.prepare.outputs.runner_windows_2022_x64 }}
skip_tests: ${{ fromJson(needs.prepare.outputs.skip_tests) }}
run_all: ${{ github.event_name != 'workflow_dispatch' || inputs.run_all }}
osx:
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'osx') }}
uses: ./.github/workflows/OSX.yml
secrets: inherit
needs: prepare
with:
override_git_describe: ${{ github.event_name == 'workflow_dispatch' && inputs.override_git_describe || '' }}
git_ref: ${{ needs.prepare.outputs.git_sha }}
skip_tests: ${{ fromJson(needs.prepare.outputs.skip_tests) }}
run_all: ${{ github.event_name != 'workflow_dispatch' || inputs.run_all }}
static-libs-linux:
name: Static Libs Linux (${{ matrix.config.arch }})
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'static-libs-linux') }}
needs:
- prepare
- linux-release
strategy:
fail-fast: false
matrix:
config: ${{ fromJson(needs.prepare.outputs.static_libs_linux_matrix) }}
runs-on: ${{ matrix.config.runner }}
container:
image: ${{ matrix.config.image }}
env:
EXTENSION_CONFIGS: '${{ github.workspace }}/.github/config/bundled_extensions.cmake'
ENABLE_EXTENSION_AUTOLOADING: 1
ENABLE_EXTENSION_AUTOINSTALL: 1
OVERRIDE_GIT_DESCRIBE: ${{ github.event_name == 'workflow_dispatch' && inputs.override_git_describe || '' }}
GEN: ninja
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ needs.prepare.outputs.git_sha }}
- name: Install dependencies
timeout-minutes: 10
shell: bash
run: |
yum install -y perl-IPC-Cmd gcc-toolset-12 gcc-toolset-12-gcc-c++ ccache python3.12 ninja-build zip python3-pip
- uses: ./.github/actions/ccache-action
with:
key: static-libs-linux-${{ matrix.config.arch }}
save: ${{ fromJson(needs.prepare.outputs.save_cache) }}
- name: Build
shell: bash
run: |
source /opt/rh/gcc-toolset-12/enable
export CC='ccache gcc'
export CXX='ccache g++'
git config --global --add safe.directory "$PWD"
make gather-libs
- name: Print platform
shell: bash
run: ./build/release/duckdb -c "PRAGMA platform;"
- name: Deploy
shell: bash
env:
AWS_ENDPOINT_URL: ${{ secrets.S3_DUCKDB_STAGING_ENDPOINT }}
AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
run: |
zip -r -j static-libs-linux-${{ matrix.config.arch }}.zip src/include/duckdb.h build/release/libs/
./scripts/upload-assets-to-staging.sh github_release static-libs-linux-${{ matrix.config.arch }}.zip
- uses: actions/upload-artifact@v7
with:
name: duckdb-static-libs-linux-${{ matrix.config.arch }}
path: |
static-libs-linux-${{ matrix.config.arch }}.zip
- name: Trim ccache
if: ${{ always() }}
uses: ./.github/actions/trim-ccache
static-libs-osx:
name: Static Libs OSX (${{ matrix.architecture }})
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'static-libs-osx') }}
needs:
- prepare
- linux-release
strategy:
matrix:
include:
- xcode_target_flag: "x86_64"
architecture: "amd64"
- xcode_target_flag: "arm64"
architecture: "arm64"
runs-on: ${{ needs.prepare.outputs.runner_macos_14_arm64 }}
env:
EXTENSION_CONFIGS: '${GITHUB_WORKSPACE}/.github/config/bundled_extensions.cmake'
ENABLE_EXTENSION_AUTOLOADING: 1
ENABLE_EXTENSION_AUTOINSTALL: 1
GEN: ninja
OSX_BUILD_ARCH: ${{ matrix.xcode_target_flag }}
DUCKDB_PLATFORM: osx_${{ matrix.architecture }}
steps:
- name: "Checkout"
uses: duckdb/duckdb-ci/.github/actions/checkout@main
with:
runner_provider: ${{ needs.prepare.outputs.runner_provider }}
fetch_depth: 0
ref: ${{ needs.prepare.outputs.git_sha }}
- uses: actions/setup-python@v6
with:
python-version: '3.12'
- name: Install Ninja
timeout-minutes: 10
run: python3 scripts/ci/retry.py -- brew install ninja
- uses: ./.github/actions/ccache-action
with:
key: static-libs-osx-${{ matrix.architecture }}
save: ${{ fromJson(needs.prepare.outputs.save_cache) }}
- name: Build
shell: bash
run: python3 scripts/ci/retry.py -- make
- name: Bundle static library
shell: bash
run: make gather-libs
- name: Deploy
shell: bash
env:
AWS_ENDPOINT_URL: ${{ secrets.S3_DUCKDB_STAGING_ENDPOINT }}
AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
run: |
zip -r -j static-libs-osx-${{ matrix.architecture }}.zip src/include/duckdb.h build/release/libs/
./scripts/upload-assets-to-staging.sh github_release static-libs-osx-${{ matrix.architecture }}.zip
- uses: actions/upload-artifact@v7
with:
name: duckdb-static-libs-osx-${{ matrix.architecture }}
path: |
static-libs-osx-${{ matrix.architecture }}.zip
static-libs-windows-mingw:
name: Static Libs Windows Mingw
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'static-libs-windows-mingw') }}
needs:
- prepare
- linux-release
runs-on: ${{ needs.prepare.outputs.runner_windows_2022_x64 }}
env:
GEN: ninja
EXTENSION_CONFIGS: '${GITHUB_WORKSPACE}/.github/config/bundled_extensions.cmake'
ENABLE_EXTENSION_AUTOLOADING: 1
ENABLE_EXTENSION_AUTOINSTALL: 1
steps:
- name: "Checkout"
uses: duckdb/duckdb-ci/.github/actions/checkout@main
with:
runner_provider: ${{ needs.prepare.outputs.runner_provider }}
fetch_depth: 0
ref: ${{ needs.prepare.outputs.git_sha }}
- uses: actions/setup-python@v6
with:
python-version: '3.12'
- name: Dependencies
timeout-minutes: 10
shell: bash
run: |
python scripts/ci/retry.py -- choco install \
ccache \
make \
--no-progress
python scripts/ci/retry.py -- choco install \
mingw --version 14.2.0 \
--no-progress
- uses: ./.github/actions/ccache-action
with:
key: static-libs-windows-mingw
save: ${{ fromJson(needs.prepare.outputs.save_cache) }}
- name: Build Environment
shell: bash
run: |
{
# bash from Git
echo 'C:/Program Files/Git/bin'
# make, ninja and ccache from Chocolatey
echo 'C:/ProgramData/Chocolatey/bin'
# g++ from Chocolatey
echo 'C:/ProgramData/mingw64/mingw64/bin'
} >> "${GITHUB_PATH}"
- name: Build Environment Check
shell: cmd
run: |
where bash
bash --version
where make
make --version
where ninja
ninja --version
where ccache
ccache --version
where g++
g++ --version
echo %PATH%
- name: Bundle static library
shell: cmd
run: |
make gather-libs
- name: Deploy
shell: bash
env:
AWS_ENDPOINT_URL: ${{ secrets.S3_DUCKDB_STAGING_ENDPOINT }}
AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
run: |
tmp_zip_dir="$(mktemp -d)"
archive_path="$(pwd)/static-libs-windows-mingw.zip"
cp src/include/duckdb.h "${tmp_zip_dir}/"
find build/release/libs -type f -exec cp {} "${tmp_zip_dir}/" \;
(cd "${tmp_zip_dir}" && "/c/Program Files/7-Zip/7z.exe" a -tzip "${archive_path}" ./*)
rm -rf "${tmp_zip_dir}"
./scripts/upload-assets-to-staging.sh github_release static-libs-windows-mingw.zip
- uses: actions/upload-artifact@v7
with:
name: duckdb-static-libs-windows-mingw
path: |
static-libs-windows-mingw.zip
no-string-inline:
name: No String Inline / Destroy Unpinned Blocks
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'no-string-inline') }}
runs-on: ${{ needs.prepare.outputs.runner_linux_x64 }}
needs:
- prepare
- linux-relassert
env:
GEN: ninja
CORE_EXTENSIONS: "icu;parquet;tpch;tpcds;fts;json;inet"
DISABLE_STRING_INLINE: 1
DESTROY_UNPINNED_BLOCKS: 1
ALTERNATIVE_VERIFY: 1
DISABLE_POINTER_SALT: 1
DISABLE_GCC_FUNCTION_SECTIONS: 1
LSAN_OPTIONS: suppressions=${{ github.workspace }}/.sanitizer-leak-suppressions.txt
DUCKDB_TEST_DESCRIPTION: 'Compiled with ALTERNATIVE_VERIFY=1 DISABLE_STRING_INLINE=1 DESTROY_UNPINNED_BLOCKS=1 DISABLE_POINTER_SALT=1. Use require no_alternative_verify to skip.'
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.prepare.outputs.git_sha }}
- name: Install
timeout-minutes: 10
run: python3 scripts/ci/retry.py -- make toolsci
- uses: ./.github/actions/ccache-action
with:
save: ${{ fromJson(needs.prepare.outputs.save_cache) }}
- name: Build
run: python3 scripts/ci/retry.py -- make relassert
- name: Test
if: ${{ !fromJson(needs.prepare.outputs.skip_tests) }}
run: make unittest_relassert
vector-sizes:
name: Vector Sizes
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'vector-sizes') }}
runs-on: ${{ needs.prepare.outputs.runner_linux_x64 }}
needs:
- prepare
- linux-relassert
env:
CC: gcc
CXX: g++
GEN: ninja
DUCKDB_TEST_DESCRIPTION: 'Compiled with STANDARD_VECTOR_SIZE=2. Use require vector_size 2048 to skip tests.'
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.prepare.outputs.git_sha }}
- name: Install
timeout-minutes: 10
run: python3 scripts/ci/retry.py -- make toolsci
- uses: ./.github/actions/ccache-action
with:
save: ${{ fromJson(needs.prepare.outputs.save_cache) }}
- name: Build
run: STANDARD_VECTOR_SIZE=2 make reldebug
- name: Test
if: ${{ !fromJson(needs.prepare.outputs.skip_tests) }}
run: make unittest_reldebug
valgrind:
name: Valgrind
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'valgrind') }}
runs-on: ubuntu-24.04
needs:
- prepare
- linux-relassert
env:
CC: clang-20
CXX: clang++-20
DISABLE_SANITIZER: 1
BUILD_JEMALLOC: 1
CORE_EXTENSIONS: 'icu;json;parquet;tpch'
GEN: ninja
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.prepare.outputs.git_sha }}
- name: Install
timeout-minutes: 10
shell: bash
run: |
python3 scripts/ci/retry.py -- make toolsci
python3 scripts/ci/retry.py -- sudo apt-get install -y -qq valgrind clang
- uses: ./.github/actions/ccache-action
with:
save: ${{ fromJson(needs.prepare.outputs.save_cache) }}
- name: Build
shell: bash
run: python3 scripts/ci/retry.py -- make relassert
- name: Output version info
shell: bash
run: ./build/relassert/duckdb -c "PRAGMA version;"
- name: Test
if: ${{ !fromJson(needs.prepare.outputs.skip_tests) }}
shell: bash
run: python3 scripts/ci/run_tests.py --workers 1 --batch-size 1 --test-command "valgrind {binary} {flags} -f {test_list}" ./build/relassert/test/unittest test/sql/tpch/tpch_sf001.test_slow
threadsan:
name: Thread Sanitizer
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'threadsan') }}
needs:
- prepare
- linux-relassert
runs-on: ${{ needs.prepare.outputs.runner_linux_x64 }}
env:
CC: clang-20
CXX: clang++-20
GEN: ninja
BUILD_JEMALLOC: 1
CORE_EXTENSIONS: "icu;tpch;tpcds;fts;json;inet"
TSAN_OPTIONS: suppressions=${{ github.workspace }}/.sanitizer-thread-suppressions.txt:external_symbolizer_path=/usr/bin/llvm-symbolizer-20
DUCKDB_TEST_DESCRIPTION: 'Tests run with thread sanitizer.'
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.prepare.outputs.git_sha }}
- name: Install
timeout-minutes: 10
run: python3 scripts/ci/retry.py -- make toolsci
- uses: ./.github/actions/ccache-action
with:
save: ${{ fromJson(needs.prepare.outputs.save_cache) }}
- name: Build
run: THREADSAN=1 make reldebug
- name: Test
if: ${{ !fromJson(needs.prepare.outputs.skip_tests) }}
run: make unittest_threadsan
- name: Test Extra
if: ${{ github.ref_name == 'main' && !fromJson(needs.prepare.outputs.skip_tests) }}
run: make unittest_threadsan_extra
# TODO: Consider bringing back fts
# TODO: DEBUG_STACKTRACE: 1 + reldebug ?
linux-configs:
name: Tests a release build with different configurations
if: ${{ contains(fromJson(needs.prepare.outputs.enabled_jobs), 'linux-configs') }}
runs-on: ${{ needs.prepare.outputs.runner_linux_x64 }}
needs:
- prepare
- linux-release
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.prepare.outputs.git_sha }}
- uses: actions/setup-python@v6
with:
python-version: '3.12'
- name: Install
timeout-minutes: 10
shell: bash
run: python3 scripts/ci/retry.py -- make toolsci
- name: Download linux release artifact
uses: actions/download-artifact@v8
with:
name: linux-release-build
path: build
- name: Extract linux release artifact
shell: bash
run: |
rm -rf build/release
tar -xzf build/release-artifact.tar.gz -C build
- name: test/configs/verify_statement_copy.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/verify_statement_copy.json ./build/release/test/unittest
- name: test/configs/verify_statement_to_string.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/verify_statement_to_string.json ./build/release/test/unittest
- name: test/configs/verify_statement_explain.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/verify_statement_explain.json ./build/release/test/unittest
- name: test/configs/verify_statement_prepare.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/verify_statement_prepare.json ./build/release/test/unittest
- name: test/configs/verify_serializer.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/verify_serializer.json ./build/release/test/unittest
- name: test/configs/verify_stats.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/verify_stats.json ./build/release/test/unittest
- name: test/configs/verify_serialization.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/verify_statement_serialization.json ./build/release/test/unittest
- name: test/configs/force_storage.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/force_storage.json ./build/release/test/unittest
- name: test/configs/force_storage_restart.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/force_storage_restart.json ./build/release/test/unittest
- name: test/configs/latest_storage.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/latest_storage.json ./build/release/test/unittest
- name: test/configs/block_verification.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/block_verification.json ./build/release/test/unittest
- name: test/configs/disable_optimizer.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/disable_optimizer.json ./build/release/test/unittest
- name: test/configs/internal_vector_serialization.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/internal_vector_serialization.json ./build/release/test/unittest
- name: test/configs/internal_vector_verification.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/internal_vector_verification.json ./build/release/test/unittest
- name: test/configs/force_external.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/force_external.json ./build/release/test/unittest
- name: test/configs/verify_fetch_row.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/verify_fetch_row.json ./build/release/test/unittest
- name: test/configs/disable_caching_operators.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/disable_caching_operators.json ./build/release/test/unittest
- name: test/configs/wal_verification.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/wal_verification.json ./build/release/test/unittest
- name: test/configs/vacuum_rebuild_indexes_force_storage.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/vacuum_rebuild_indexes_force_storage.json ./build/release/test/unittest
- name: test/configs/prefetch_all_parquet_files.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/prefetch_all_parquet_files.json ./build/release/test/unittest
- name: test/configs/no_local_filesystem.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/no_local_filesystem.json ./build/release/test/unittest
- name: test/configs/block_size_16kB.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/block_size_16kB.json ./build/release/test/unittest
- name: test/configs/latest_storage_block_size_16kB.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/latest_storage_block_size_16kB.json ./build/release/test/unittest
- name: test/configs/block_allocator_100mib.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/block_allocator_100mib.json ./build/release/test/unittest
- name: Test dictionary_expression
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-flags="--verify-vector dictionary_expression --skip-compiled" ./build/release/test/unittest
- name: Test dictionary_operator
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-flags="--verify-vector dictionary_operator --skip-compiled" ./build/release/test/unittest
- name: Test constant_operator
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-flags="--verify-vector constant_operator --skip-compiled" ./build/release/test/unittest
- name: Test sequence_operator
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-flags="--verify-vector sequence_operator --skip-compiled" ./build/release/test/unittest
- name: Test nested_shuffle
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-flags="--verify-vector nested_shuffle --skip-compiled" ./build/release/test/unittest
- name: Test variant_vector
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/variant_vector.json ./build/release/test/unittest
- name: Test compressed in memory
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/compressed_in_memory.json ./build/release/test/unittest
- name: Test sycnronous table scan implementation
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-flags='--on-init "SET debug_physical_table_scan_execution_strategy=SYNCHRONOUS;"' ./build/release/test/unittest
- name: Test block prefetching
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/prefetch_all_storage.json ./build/release/test/unittest
- name: Forwards compatibility tests
if: success() || failure()
shell: bash
run: |
python3 scripts/test_storage_compatibility.py --versions "1.2.1|1.3.2|1.4.3" --new-unittest build/release/test/unittest
- name: test/configs/encryption.json
if: success() || failure()
shell: bash
run: |
python3 scripts/ci/run_tests.py --test-config=test/configs/encryption.json ./build/release/test/unittest
summary:
name: Summary
if: ${{ always() }}
runs-on: ubuntu-slim
needs:
- prepare
- linux-relassert
- linux-relassert-tests
- regression
- tidy-check
- extensions
- wasm-eh
- linux-release
- linux-release-tests
- linux-release-cli
- linux-musl-release-cli
- main_julia
- swift
- windows
- osx
- static-libs-linux
- static-libs-osx
- static-libs-windows-mingw
- no-string-inline
- vector-sizes
- valgrind
- threadsan
- linux-configs
steps:
- id: release-status
name: Compute release status
if: ${{ always() && (github.event_name == 'workflow_dispatch' || github.event_name == 'repository_dispatch') }}
shell: bash
run: |
if [[ "${{ needs.extensions.result }}" == "success" && \
"${{ needs.osx.result }}" == "success" && \
"${{ needs.windows.result }}" == "success" && \
"${{ needs.static-libs-linux.result }}" == "success" && \
( "${{ needs.static-libs-osx.result }}" == "success" || "${{ needs.static-libs-osx.result }}" == "skipped" ) && \
( "${{ needs.static-libs-windows-mingw.result }}" == "success" || "${{ needs.static-libs-windows-mingw.result }}" == "skipped" ) ]]; then
echo "success=true" >> "$GITHUB_OUTPUT"
else
echo "success=false" >> "$GITHUB_OUTPUT"
fi
- id: summary-context
name: Compute summary dispatch context
if: ${{ always() }}
shell: bash
env:
EVENT_NAME: ${{ github.event_name }}
REPOSITORY: ${{ github.repository }}
GIT_REF: ${{ github.ref }}
INPUT_GIT_REF: ${{ inputs.git_ref }}
OVERRIDE_GIT_DESCRIBE: ${{ github.event_name == 'workflow_dispatch' && inputs.override_git_describe || '' }}
RELEASE_STATUS_SUCCESS: ${{ steps.release-status.outputs.success || 'false' }}
run: |
is_release_event=false
if [[ "$EVENT_NAME" == "workflow_dispatch" || "$EVENT_NAME" == "repository_dispatch" ]]; then
is_release_event=true
fi
is_duckdb_repo=false
if [[ "$REPOSITORY" == "duckdb/duckdb" ]]; then
is_duckdb_repo=true
fi
target_branch="$GIT_REF"
if [[ "$EVENT_NAME" == "workflow_dispatch" && -n "$INPUT_GIT_REF" ]]; then
target_branch="$INPUT_GIT_REF"
fi
has_no_override=false
if [[ "$EVENT_NAME" != "workflow_dispatch" || -z "$OVERRIDE_GIT_DESCRIBE" ]]; then
has_no_override=true
fi
run_vendor=false
if [[ "$is_release_event" == "true" && "$is_duckdb_repo" == "true" && "$RELEASE_STATUS_SUCCESS" == "true" && "$has_no_override" == "true" ]]; then
run_vendor=true
fi
run_nightly=false
if [[ "$is_release_event" == "true" && "$is_duckdb_repo" == "true" ]]; then
run_nightly=true
fi
run_python=false
if [[ "$is_release_event" == "true" && "$is_duckdb_repo" == "true" && "$has_no_override" == "true" ]]; then
run_python=true
fi
echo "summary dispatch context:"
echo " event_name=$EVENT_NAME"
echo " repository=$REPOSITORY"
echo " git_ref=$GIT_REF"
echo " input_git_ref=$INPUT_GIT_REF"
echo " target_branch=$target_branch"
echo " override_git_describe=$OVERRIDE_GIT_DESCRIBE"
echo " release_status_success=$RELEASE_STATUS_SUCCESS"
echo " is_release_event=$is_release_event"
echo " is_duckdb_repo=$is_duckdb_repo"
echo " has_no_override=$has_no_override"
echo " run_vendor=$run_vendor"
echo " run_nightly=$run_nightly"
echo " run_python=$run_python"
{
echo "target_branch=$target_branch"
echo "run_vendor=$run_vendor"
echo "run_nightly=$run_nightly"
echo "run_python=$run_python"
} >> "$GITHUB_OUTPUT"
- name: Run ODBC Vendor
if: ${{ always() && steps.summary-context.outputs.run_vendor == 'true' }}
shell: bash
env:
PAT_USER: ${{ secrets.PAT_USERNAME }}
PAT_TOKEN: ${{ secrets.PAT_TOKEN }}
run: |
export URL=https://api.github.com/repos/duckdb/duckdb-odbc/actions/workflows/Vendor.yml/dispatches
export DATA='{"ref": "${{ steps.summary-context.outputs.target_branch }}", "inputs": {"duckdb-sha": "${{ needs.prepare.outputs.git_sha }}"}}'
curl -v --fail-with-body --retry 5 --retry-all-errors -XPOST -u "${PAT_USER}:${PAT_TOKEN}" -H "Accept: application/vnd.github.everest-preview+json" -H "Content-Type: application/json" "$URL" --data "$DATA"
- name: Run JDBC Vendor
if: ${{ always() && steps.summary-context.outputs.run_vendor == 'true' }}
shell: bash
env:
PAT_USER: ${{ secrets.PAT_USERNAME }}
PAT_TOKEN: ${{ secrets.PAT_TOKEN }}
run: |
export URL=https://api.github.com/repos/duckdb/duckdb-java/actions/workflows/Vendor.yml/dispatches
export DATA='{"ref": "${{ steps.summary-context.outputs.target_branch }}", "inputs": {"duckdb-sha": "${{ needs.prepare.outputs.git_sha }}"}}'
curl -v --fail-with-body --retry 5 --retry-all-errors -XPOST -u "${PAT_USER}:${PAT_TOKEN}" -H "Accept: application/vnd.github.everest-preview+json" -H "Content-Type: application/json" "$URL" --data "$DATA"
- name: Run Nightly build status
if: ${{ always() && steps.summary-context.outputs.run_nightly == 'true' }}
shell: bash
env:
PAT_USER: ${{ secrets.PAT_USERNAME }}
PAT_TOKEN: ${{ secrets.PAT_TOKEN }}
run: |
export URL=https://api.github.com/repos/duckdb/duckdb-build-status/actions/workflows/NightlyBuildsCheck.yml/dispatches
export DATA='{"ref": "${{ steps.summary-context.outputs.target_branch }}", "inputs": {"event": "${{ github.event_name }}", "should_publish": "true"}}'
curl -v --fail-with-body --retry 5 --retry-all-errors -XPOST -u "${PAT_USER}:${PAT_TOKEN}" -H "Accept: application/vnd.github.everest-preview+json" -H "Content-Type: application/json" "$URL" --data "$DATA"
- name: Call /dispatch
if: ${{ always() && steps.summary-context.outputs.run_python == 'true' }}
shell: bash
env:
PAT_USER: ${{ secrets.PAT_USERNAME }}
PAT_TOKEN: ${{ secrets.PAT_TOKEN }}
run: |
export URL=https://api.github.com/repos/duckdb/duckdb-python/actions/workflows/release.yml/dispatches
export DATA='{"ref": "${{ steps.summary-context.outputs.target_branch }}", "inputs": {"duckdb-sha": "${{ needs.prepare.outputs.git_sha }}", "pypi-index": "prod" }}'
curl -v --fail-with-body --retry 5 --retry-all-errors -XPOST -u "${PAT_USER}:${PAT_TOKEN}" -H "Accept: application/vnd.github.everest-preview+json" -H "Content-Type: application/json" "$URL" --data "$DATA"
- name: Check CI status
shell: bash
run: |
NEEDS_JSON='${{ toJSON(needs) }}'
failed_or_cancelled=$(
jq -r '
to_entries[]
| select(.value.result == "failure" or .value.result == "cancelled")
| "\(.key): \(.value.result)"
' <<<"$NEEDS_JSON"
)
if [[ -n "$failed_or_cancelled" ]]; then
echo "One or more required jobs failed or were cancelled."
echo "$failed_or_cancelled"
exit 1
fi