Adapt to changes on main #292
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |