| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| name: C++ Extra |
| |
| on: |
| push: |
| branches: |
| - '**' |
| - '!dependabot/**' |
| paths: |
| - '.dockerignore' |
| - '.github/workflows/check_labels.yml' |
| - '.github/workflows/cpp_extra.yml' |
| - '.github/workflows/cpp_windows.yml' |
| - '.github/workflows/report_ci.yml' |
| - 'ci/conda_env_*' |
| - 'ci/docker/**' |
| - 'ci/scripts/ccache_setup.sh' |
| - 'ci/scripts/cpp_*' |
| - 'ci/scripts/install_azurite.sh' |
| - 'ci/scripts/install_gcs_testbench.sh' |
| - 'ci/scripts/install_minio.sh' |
| - 'ci/scripts/msys2_*' |
| - 'ci/scripts/util_*' |
| - 'cpp/**' |
| - 'compose.yaml' |
| - 'dev/archery/archery/**' |
| - 'format/Flight.proto' |
| - 'testing' |
| tags: |
| - '**' |
| pull_request: |
| # This trigger ensures that the `check_labels` workflow runs on manual label changes |
| types: |
| - labeled |
| - opened |
| - reopened |
| - synchronize |
| schedule: |
| - cron: | |
| 0 0 * * * |
| |
| concurrency: |
| group: ${{ github.repository }}-${{ github.head_ref || github.sha }}-${{ github.workflow }} |
| cancel-in-progress: true |
| |
| permissions: |
| actions: read |
| contents: read |
| pull-requests: read |
| |
| jobs: |
| check-labels: |
| uses: ./.github/workflows/check_labels.yml |
| with: |
| parent-workflow: cpp_extra |
| |
| check-enabled: |
| # Check whether the CI builds in this workflow need to be run |
| needs: check-labels |
| runs-on: ubuntu-latest |
| outputs: |
| is_enabled: ${{ steps.set_enabled.outputs.is_enabled }} |
| steps: |
| - id: set_enabled |
| if: >- |
| github.ref_type == 'tag' || |
| (github.event_name == 'schedule' && github.repository == 'apache/arrow') || |
| contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra') || |
| contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra: C++') |
| run: echo "is_enabled=true" >> "$GITHUB_OUTPUT" |
| |
| docker: |
| needs: check-enabled |
| if: needs.check-enabled.outputs.is_enabled == 'true' |
| name: ${{ matrix.title }} |
| runs-on: ${{ matrix.runs-on }} |
| timeout-minutes: 75 |
| strategy: |
| fail-fast: false |
| matrix: |
| include: |
| - image: alpine-linux-cpp |
| runs-on: ubuntu-latest |
| title: AMD64 Alpine Linux |
| - image: ubuntu-cpp |
| run-options: >- |
| -e ARROW_CTEST_TIMEOUT=2000 |
| -e ARROW_C_FLAGS_DEBUG="-O1" |
| -e ARROW_CXX_FLAGS_DEBUG="-O1" |
| -e ARROW_GANDIVA=OFF |
| -e ARROW_LARGE_MEMORY_TESTS=ON |
| -e BUILD_WARNING_LEVEL=PRODUCTION |
| runs-on: "runs-on=${{ github.run_id }}/family=x8i.2xlarge/volume=80gb/spot=capacity-optimized" |
| title: AMD64 Ubuntu Large Memory Tests |
| - image: conda-cpp |
| run-options: >- |
| -e ARROW_USE_MESON=ON |
| runs-on: ubuntu-latest |
| title: AMD64 Ubuntu Meson |
| # TODO: We should remove this "continue-on-error: true" once GH-47207 is resolved |
| - continue-on-error: true |
| envs: |
| - DEBIAN=13 |
| image: debian-cpp |
| run-options: >- |
| -e CMAKE_CXX_STANDARD=23 |
| runs-on: ubuntu-latest |
| title: AMD64 Debian C++23 |
| env: |
| ARCHERY_DEBUG: 1 |
| ARROW_ENABLE_TIMING_TESTS: OFF |
| DOCKER_VOLUME_PREFIX: ".docker/" |
| steps: |
| - name: Checkout Arrow |
| uses: actions/checkout@v7 |
| with: |
| persist-credentials: false |
| fetch-depth: 0 |
| submodules: recursive |
| - name: Restore Docker Volumes |
| uses: apache/infrastructure-actions/stash/restore@0ba14156c9f4c3cfbe4b0c9f36339ab0f8d81e53 |
| with: |
| path: .docker |
| key: cpp-extra-${{ matrix.image }} |
| - name: Setup Python |
| uses: actions/setup-python@v7 |
| with: |
| python-version: 3 |
| - name: Setup Archery |
| run: python3 -m pip install -e dev/archery[docker] |
| - name: Execute Docker Build |
| continue-on-error: ${{ matrix.continue-on-error || false }} |
| env: |
| ARCHERY_DOCKER_USER: ${{ secrets.DOCKERHUB_USER }} |
| ARCHERY_DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} |
| ENVS: ${{ toJSON(matrix.envs) }} |
| run: | |
| # GH-40558: reduce ASLR to avoid ASAN/LSAN crashes |
| sudo sysctl -w vm.mmap_rnd_bits=28 |
| source ci/scripts/util_enable_core_dumps.sh |
| if [ "${ENVS}" != "null" ]; then |
| echo "${ENVS}" | jq -r '.[]' | while read env; do |
| echo "${env}" >> .env |
| done |
| fi |
| archery docker run ${{ matrix.run-options || '' }} ${{ matrix.image }} |
| - name: Save Docker Volumes |
| if: ${{ !cancelled() }} |
| continue-on-error: true |
| uses: apache/infrastructure-actions/stash/save@0ba14156c9f4c3cfbe4b0c9f36339ab0f8d81e53 |
| with: |
| path: .docker |
| key: cpp-extra-${{ matrix.image }} |
| include-hidden-files: true |
| - name: Docker Push |
| if: >- |
| success() && |
| github.event_name == 'push' && |
| github.repository == 'apache/arrow' && |
| github.ref_name == 'main' |
| env: |
| ARCHERY_DOCKER_USER: ${{ secrets.DOCKERHUB_USER }} |
| ARCHERY_DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} |
| continue-on-error: true |
| run: archery docker push ${{ matrix.image }} |
| |
| msvc-arm64: |
| needs: check-enabled |
| if: needs.check-enabled.outputs.is_enabled == 'true' |
| name: ARM64 Windows 11 MSVC |
| uses: ./.github/workflows/cpp_windows.yml |
| with: |
| arch: arm64 |
| os: windows-11-arm |
| simd-level: NONE |
| |
| jni-linux: |
| needs: check-enabled |
| if: needs.check-enabled.outputs.is_enabled == 'true' |
| name: JNI ${{ matrix.platform.runs-on }} ${{ matrix.platform.arch }} |
| runs-on: ${{ matrix.platform.runs-on }} |
| timeout-minutes: 240 |
| permissions: |
| actions: read |
| contents: read |
| # This is for using GitHub Packages for vcpkg cache |
| packages: write |
| strategy: |
| fail-fast: false |
| matrix: |
| platform: |
| - arch: "amd64" |
| runs-on: ubuntu-latest |
| - arch: "arm64/v8" |
| runs-on: ubuntu-24.04-arm |
| env: |
| ARCH: ${{ matrix.platform.arch }} |
| REPO: ghcr.io/${{ github.repository }}-dev |
| steps: |
| - name: Checkout Arrow |
| uses: actions/checkout@v7 |
| with: |
| persist-credentials: false |
| fetch-depth: 0 |
| submodules: recursive |
| - name: Free up disk space |
| run: | |
| ci/scripts/util_free_space.sh |
| - name: Restore Docker Volumes |
| uses: apache/infrastructure-actions/stash/restore@0ba14156c9f4c3cfbe4b0c9f36339ab0f8d81e53 |
| with: |
| path: .docker |
| key: jni-${{ matrix.platform.runs-on }} |
| - name: Setup Python |
| uses: actions/setup-python@v7 |
| with: |
| python-version: 3 |
| - name: Setup Archery |
| run: python3 -m pip install -e dev/archery[docker] |
| - name: Execute Docker Build |
| env: |
| ARCHERY_DOCKER_USER: ${{ github.actor }} |
| ARCHERY_DOCKER_PASSWORD: ${{ secrets.GITHUB_TOKEN }} |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| VCPKG_BINARY_SOURCES: "clear;nuget,GitHub,readwrite" |
| run: | |
| source ci/scripts/util_enable_core_dumps.sh |
| archery docker run cpp-jni |
| - name: Save Docker Volumes |
| if: ${{ !cancelled() }} |
| continue-on-error: true |
| uses: apache/infrastructure-actions/stash/save@0ba14156c9f4c3cfbe4b0c9f36339ab0f8d81e53 |
| with: |
| path: .docker |
| key: jni-${{ matrix.platform.runs-on }} |
| include-hidden-files: true |
| - name: Docker Push |
| if: >- |
| success() && |
| github.event_name == 'push' && |
| github.ref_name == 'main' |
| env: |
| ARCHERY_DOCKER_USER: ${{ github.actor }} |
| ARCHERY_DOCKER_PASSWORD: ${{ secrets.GITHUB_TOKEN }} |
| continue-on-error: true |
| run: archery docker push cpp-jni |
| |
| jni-macos: |
| needs: check-enabled |
| if: needs.check-enabled.outputs.is_enabled == 'true' |
| name: JNI macOS |
| runs-on: macos-14 |
| timeout-minutes: 45 |
| env: |
| MACOSX_DEPLOYMENT_TARGET: "14.0" |
| steps: |
| - name: Checkout Arrow |
| uses: actions/checkout@v7 |
| with: |
| persist-credentials: false |
| fetch-depth: 0 |
| submodules: recursive |
| - name: Install dependencies |
| run: | |
| brew bundle --file=cpp/Brewfile |
| # We want to link aws-sdk-cpp statically but Homebrew's |
| # aws-sdk-cpp provides only shared library. If we have |
| # Homebrew's aws-sdk-cpp, our build mix Homebrew's |
| # aws-sdk-cpp and bundled aws-sdk-cpp. We uninstall Homebrew's |
| # aws-sdk-cpp to ensure using only bundled aws-sdk-cpp. |
| brew uninstall aws-sdk-cpp |
| # We want to use bundled RE2 for static linking. If |
| # Homebrew's RE2 is installed, its header file may be used. |
| # We uninstall Homebrew's RE2 to ensure using bundled RE2. |
| brew uninstall grpc || : # gRPC depends on RE2 |
| brew uninstall grpc@1.54 || : # gRPC 1.54 may be installed too |
| brew uninstall re2 |
| # We want to use bundled Protobuf for static linking. If |
| # Homebrew's Protobuf is installed, its library file may be |
| # used on test We uninstall Homebrew's Protobuf to ensure using |
| # bundled Protobuf. |
| brew uninstall protobuf |
| - name: Prepare ccache |
| run: | |
| echo "CCACHE_DIR=${PWD}/ccache" >> ${GITHUB_ENV} |
| - name: Restore ccache |
| uses: apache/infrastructure-actions/stash/restore@0ba14156c9f4c3cfbe4b0c9f36339ab0f8d81e53 |
| with: |
| path: ccache |
| key: jni-macos |
| - name: CMake |
| run: | |
| cmake \ |
| -S cpp \ |
| -B cpp.build \ |
| --preset=ninja-release-jni-macos \ |
| -DARROW_BUILD_TESTS=ON \ |
| -DCMAKE_INSTALL_PREFIX=$PWD/cpp.install |
| - name: Build |
| run: | |
| cmake --build cpp.build |
| - name: Install |
| run: | |
| cmake --install cpp.build |
| - name: Test |
| env: |
| ARROW_TEST_DATA: ${{ github.workspace }}/testing/data |
| PARQUET_TEST_DATA: ${{ github.workspace }}/cpp/submodules/parquet-testing/data |
| run: | |
| # unstable |
| exclude_tests="arrow-acero-asof-join-node-test" |
| exclude_tests="${exclude_tests}|arrow-acero-hash-join-node-test" |
| ctest \ |
| --exclude-regex "${exclude_tests}" \ |
| --label-regex unittest \ |
| --output-on-failure \ |
| --parallel "$(sysctl -n hw.ncpu)" \ |
| --test-dir "cpp.build" \ |
| --timeout 300 |
| - name: Build example |
| run: | |
| cmake \ |
| -S cpp/examples/minimal_build/ \ |
| -B cpp/examples/minimal_build.build \ |
| -GNinja \ |
| -DCMAKE_INSTALL_PREFIX=$PWD/cpp.install |
| cmake --build cpp/examples/minimal_build.build |
| cd cpp/examples/minimal_build |
| ../minimal_build.build/arrow-example |
| - name: Save ccache |
| if: ${{ !cancelled() }} |
| continue-on-error: true |
| uses: apache/infrastructure-actions/stash/save@0ba14156c9f4c3cfbe4b0c9f36339ab0f8d81e53 |
| with: |
| path: ccache |
| key: jni-macos |
| |
| odbc-linux: |
| needs: check-enabled |
| if: needs.check-enabled.outputs.is_enabled == 'true' |
| name: ODBC Linux |
| runs-on: ubuntu-latest |
| timeout-minutes: 75 |
| strategy: |
| fail-fast: false |
| env: |
| ARCH: amd64 |
| ARCHERY_DEBUG: 1 |
| ARROW_ENABLE_TIMING_TESTS: OFF |
| DOCKER_VOLUME_PREFIX: ".docker/" |
| UBUNTU: 24.04 |
| steps: |
| - name: Checkout Arrow |
| uses: actions/checkout@v7 |
| with: |
| persist-credentials: false |
| fetch-depth: 0 |
| submodules: recursive |
| - name: Setup Python on hosted runner |
| uses: actions/setup-python@v7 |
| with: |
| python-version: 3 |
| - name: Setup Archery |
| run: python3 -m pip install -e dev/archery[docker] |
| - name: Set Up Dremio Instance |
| run: | |
| docker compose up -d dremio |
| cpp/src/arrow/flight/sql/odbc/tests/dremio/set_up_dremio_instance.sh |
| - name: Restore Docker Volumes |
| uses: apache/infrastructure-actions/stash/restore@0ba14156c9f4c3cfbe4b0c9f36339ab0f8d81e53 |
| with: |
| path: .docker |
| key: ubuntu-cpp-odbc |
| - name: Execute Docker Build |
| env: |
| ARCHERY_DOCKER_USER: ${{ secrets.DOCKERHUB_USER }} |
| ARCHERY_DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} |
| run: | |
| # GH-40558: reduce ASLR to avoid ASAN/LSAN crashes |
| sudo sysctl -w vm.mmap_rnd_bits=28 |
| source ci/scripts/util_enable_core_dumps.sh |
| archery docker run ubuntu-cpp-odbc |
| - name: Save Docker Volumes |
| if: ${{ !cancelled() }} |
| continue-on-error: true |
| uses: apache/infrastructure-actions/stash/save@0ba14156c9f4c3cfbe4b0c9f36339ab0f8d81e53 |
| with: |
| path: .docker |
| key: ubuntu-cpp-odbc |
| include-hidden-files: true |
| - name: Docker Push |
| if: >- |
| success() && |
| github.event_name == 'push' && |
| github.repository == 'apache/arrow' && |
| github.ref_name == 'main' |
| env: |
| ARCHERY_DOCKER_USER: ${{ secrets.DOCKERHUB_USER }} |
| ARCHERY_DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} |
| continue-on-error: true |
| run: archery docker push ubuntu-cpp-odbc |
| |
| odbc-macos: |
| needs: check-enabled |
| if: needs.check-enabled.outputs.is_enabled == 'true' |
| name: ODBC ${{ matrix.build-type }} ${{ matrix.architecture }} macOS ${{ matrix.macos-version }} |
| runs-on: macos-${{ matrix.macos-version }} |
| timeout-minutes: 120 |
| strategy: |
| fail-fast: false |
| matrix: |
| include: |
| - { architecture: AMD64, macos-version: "15-intel", build-type : debug } |
| - { architecture: AMD64, macos-version: "15-intel", build-type : release } |
| - { architecture: ARM64, macos-version: "14", build-type : debug } |
| - { architecture: ARM64, macos-version: "14", build-type : release } |
| env: |
| ARROW_BUILD_TESTS: ON |
| ARROW_BUILD_TYPE: ${{ matrix.build-type }} |
| ARROW_DEPENDENCY_SOURCE: BUNDLED |
| ARROW_DEPENDENCY_USE_SHARED: OFF |
| ARROW_FLIGHT_SQL_ODBC: ON |
| ARROW_FLIGHT_SQL_ODBC_INSTALLER: ON |
| ARROW_HOME: /tmp/local |
| ARROW_MIMALLOC: OFF |
| steps: |
| - name: Checkout Arrow |
| uses: actions/checkout@v7 |
| with: |
| persist-credentials: false |
| fetch-depth: 0 |
| submodules: recursive |
| - name: Install Dependencies |
| run: | |
| brew bundle --file=cpp/Brewfile |
| |
| # We want to use bundled RE2 for static linking. If |
| # Homebrew's RE2 is installed, its header file may be used. |
| # We uninstall Homebrew's RE2 to ensure using bundled RE2. |
| brew uninstall grpc || : # gRPC depends on RE2 |
| brew uninstall grpc@1.54 || : # gRPC 1.54 may be installed too |
| brew uninstall re2 |
| |
| # We want to use bundled Protobuf for static linking. If |
| # Homebrew's Protobuf is installed, its library file may be |
| # used on test We uninstall Homebrew's Protobuf to ensure using |
| # bundled Protobuf. |
| brew uninstall protobuf |
| |
| # We want to use bundled Boost for static linking. |
| brew uninstall boost |
| - name: Setup ccache |
| run: | |
| ci/scripts/ccache_setup.sh |
| - name: ccache info |
| id: ccache-info |
| run: | |
| echo "cache-dir=$(ccache --get-config cache_dir)" >> $GITHUB_OUTPUT |
| - name: Restore ccache |
| uses: apache/infrastructure-actions/stash/restore@0ba14156c9f4c3cfbe4b0c9f36339ab0f8d81e53 |
| with: |
| path: ${{ steps.ccache-info.outputs.cache-dir }} |
| key: cpp-odbc-ccache-macos-${{ matrix.macos-version }}-${{ matrix.build-type }} |
| - name: Build |
| run: | |
| # Homebrew uses /usr/local as prefix. So packages |
| # installed by Homebrew also use /usr/local/include. We |
| # want to include headers for packages installed by |
| # Homebrew as system headers to ignore warnings in them. |
| # But "-isystem /usr/local/include" isn't used by CMake |
| # because /usr/local/include is marked as the default |
| # include path. So we disable -Werror to avoid build error |
| # by warnings from packages installed by Homebrew. |
| export BUILD_WARNING_LEVEL=PRODUCTION |
| LIBIODBC_DIR="$(brew --cellar libiodbc)/$(brew list --versions libiodbc | awk '{print $2}')" |
| ODBC_INCLUDE_DIR=$LIBIODBC_DIR/include |
| export ARROW_CMAKE_ARGS="-DODBC_INCLUDE_DIR=$ODBC_INCLUDE_DIR" |
| export CXXFLAGS="$CXXFLAGS -I$ODBC_INCLUDE_DIR" |
| ci/scripts/cpp_build.sh $(pwd) $(pwd)/build |
| - name: Save ccache |
| if: ${{ !cancelled() }} |
| continue-on-error: true |
| uses: apache/infrastructure-actions/stash/save@0ba14156c9f4c3cfbe4b0c9f36339ab0f8d81e53 |
| with: |
| path: ${{ steps.ccache-info.outputs.cache-dir }} |
| key: cpp-odbc-ccache-macos-${{ matrix.macos-version }}-${{ matrix.build-type }} |
| - name: Setup Python |
| uses: actions/setup-python@v7 |
| with: |
| python-version: 3 |
| - name: Setup Archery |
| run: python3 -m pip install -e dev/archery |
| - name: Check ODBC Dependency |
| run: | |
| # ODBC dependency should not include other Arrow or third party libraries |
| archery linking check-dependencies \ |
| --allow CoreFoundation \ |
| --allow libSystem \ |
| --allow libarrow_flight_sql_odbc \ |
| --allow libc++ \ |
| --allow libiconv \ |
| --allow libresolv \ |
| --allow libz \ |
| "$(pwd)/build/cpp/${{ matrix.build-type }}/libarrow_flight_sql_odbc.dylib" |
| - name: Generate macOS Installer |
| if: matrix.build-type == 'release' |
| shell: bash |
| run: | |
| cd $(pwd)/build/cpp |
| cpack |
| - name: Upload ODBC PKG to the job |
| if: matrix.build-type == 'release' |
| uses: actions/upload-artifact@v7 |
| with: |
| name: flight-sql-odbc-pkg-installer-${{ matrix.architecture }} |
| path: build/cpp/ArrowFlightSQLODBC-*.pkg |
| if-no-files-found: error |
| - name: Register Flight SQL ODBC Driver |
| run: | |
| sudo cpp/src/arrow/flight/sql/odbc/install/unix/install_odbc.sh $(pwd)/build/cpp/${{ matrix.build-type }}/libarrow_flight_sql_odbc.dylib |
| - name: Test |
| shell: bash |
| run: | |
| sudo sysctl -w kern.coredump=1 |
| sudo sysctl -w kern.corefile=/tmp/core.%N.%P |
| ulimit -c unlimited # must enable within the same shell |
| # Give CI write access for system DSN |
| sudo mkdir -p /Library/ODBC |
| sudo chown -R $USER /Library/ODBC |
| ci/scripts/cpp_test.sh $(pwd) $(pwd)/build |
| |
| odbc-msvc: |
| needs: check-enabled |
| if: needs.check-enabled.outputs.is_enabled == 'true' |
| name: ODBC Windows |
| runs-on: windows-2022 |
| timeout-minutes: 240 |
| permissions: |
| actions: read |
| contents: read |
| packages: write |
| env: |
| ARROW_BUILD_SHARED: ON |
| ARROW_BUILD_STATIC: OFF |
| ARROW_BUILD_TESTS: ON |
| ARROW_BUILD_TYPE: release |
| # Turn Arrow CSV off to disable `find_package(Arrow)` check on MSVC CI. |
| # GH-49050 TODO: enable `find_package(Arrow)` check on MSVC CI. |
| ARROW_CSV: OFF |
| ARROW_DEPENDENCY_SOURCE: VCPKG |
| ARROW_FLIGHT_SQL_ODBC: ON |
| ARROW_FLIGHT_SQL_ODBC_INSTALLER: ON |
| ARROW_HOME: /usr |
| # GH-49465: work around the gRPC/Abseil exit hang on Windows |
| # https://github.com/grpc/grpc/issues/39321 |
| # https://github.com/abseil/abseil-cpp/issues/1877 |
| # Build Arrow with GPR_DISABLE_ABSEIL_SYNC so grpcpp's Mutex ABI |
| # matches the gRPC rebuilt by the overlay triplet. Remove once fixed upstream. |
| ARROW_CXXFLAGS: -DGPR_DISABLE_ABSEIL_SYNC |
| CMAKE_GENERATOR: Ninja |
| CMAKE_INSTALL_PREFIX: /usr |
| VCPKG_BINARY_SOURCES: 'clear;nugettimeout,600;nuget,GitHub,readwrite' |
| # GH-49465: custom triplet that rebuilds gRPC with GPR_DISABLE_ABSEIL_SYNC |
| # (native sync instead of absl::Mutex). See ci/vcpkg/amd64-windows-no-absl-sync-release.cmake |
| VCPKG_DEFAULT_TRIPLET: amd64-windows-no-absl-sync-release |
| VCPKG_OVERLAY_TRIPLETS: ${{ github.workspace }}/ci/vcpkg |
| steps: |
| - name: Checkout Arrow |
| uses: actions/checkout@v7 |
| with: |
| persist-credentials: false |
| fetch-depth: 0 |
| submodules: recursive |
| - name: Build ODBC Windows |
| uses: ./.github/actions/odbc-windows |
| with: |
| github-token: ${{ secrets.GITHUB_TOKEN }} |
| - name: Test |
| shell: cmd |
| run: | |
| set VCPKG_ROOT_KEEP=%VCPKG_ROOT% |
| call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 |
| set VCPKG_ROOT=%VCPKG_ROOT_KEEP% |
| # Convert VCPKG Windows path to MSYS path |
| for /f "usebackq delims=" %%I in (`bash -c "cygpath -u \"$VCPKG_ROOT_KEEP\""` ) do set VCPKG_ROOT=%%I |
| bash -c "ci/scripts/cpp_test.sh $(pwd) $(pwd)/build" |
| - name: Install WiX Toolset |
| shell: pwsh |
| run: | |
| Invoke-WebRequest -Uri https://github.com/wixtoolset/wix/releases/download/v6.0.0/wix-cli-x64.msi -OutFile wix-cli-x64.msi |
| Start-Process -FilePath wix-cli-x64.msi -ArgumentList '/quiet', 'Include_freethreaded=1' -Wait |
| echo "C:\Program Files\WiX Toolset v6.0\bin\" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append |
| - name: Build MSI ODBC installer |
| shell: pwsh |
| run: | |
| # Verify WiX version |
| wix --version |
| cd build/cpp |
| cpack |
| - name: Upload ODBC MSI to the job |
| uses: actions/upload-artifact@v7 |
| with: |
| name: flight-sql-odbc-msi-installer |
| path: build/cpp/Apache-Arrow-Flight-SQL-ODBC-*-win64.msi |
| if-no-files-found: error |
| - name: Install ODBC MSI |
| run: | |
| cd build/cpp |
| $odbc_msi = Get-ChildItem -Filter "Apache-Arrow-Flight-SQL-ODBC-*-win64.msi" |
| if (-not $odbc_msi) { |
| Write-Error "ODBC MSI not found" |
| exit 1 |
| } |
| |
| foreach ($msi in $odbc_msi) { |
| Write-Host "Installing $($msi.Name) with logs" |
| $log = "odbc-install.log" |
| Start-Process msiexec.exe -Wait -ArgumentList "/i `"$msi`"", "/qn", "/L*V `"$log`"" |
| Get-Content $log |
| } |
| - name: Check ODBC DLL installation |
| run: | |
| $dirs = Get-ChildItem "C:\Program Files" -Directory -Filter "Apache-Arrow-Flight-SQL-ODBC*" |
| |
| foreach ($dir in $dirs) { |
| $bin = Join-Path $dir.FullName "bin" |
| |
| if (Test-Path $bin) { |
| tree $bin /f |
| |
| $dll = Join-Path $bin "arrow_flight_sql_odbc.dll" |
| if (Test-Path $dll) { |
| Write-Host "Found ODBC DLL: $dll" |
| exit 0 |
| } |
| } |
| } |
| |
| Write-Error "ODBC DLL not found" |
| exit 1 |
| |
| odbc-nightly: |
| needs: odbc-msvc |
| name: ODBC nightly |
| runs-on: ubuntu-latest |
| if: github.event_name == 'schedule' && github.repository == 'apache/arrow' |
| steps: |
| - name: Download the artifacts |
| uses: actions/download-artifact@v8 |
| with: |
| name: flight-sql-odbc-msi-installer |
| - name: Prepare ODBC installer for sync |
| run: | |
| mkdir odbc-installer |
| mv *.msi odbc-installer/ |
| |
| # Add `dev-yyyy-mm-dd` to ODBC MSI before `win64.msi`: |
| # Apache Arrow Flight SQL ODBC-24.0.0-win64.msi -> |
| # Apache Arrow Flight SQL ODBC-24.0.0-dev-2026-02-06-win64.msi |
| cd odbc-installer |
| msi_name=$(ls *.msi) |
| dev_msi_name=$(echo ${msi_name} | sed -e "s/win64\.msi$/dev-$(date +%Y-%m-%d)-win64.msi/") |
| mv "${msi_name}" "${dev_msi_name}" |
| cd .. |
| |
| tree odbc-installer |
| - name: Checkout Arrow |
| uses: actions/checkout@v7 |
| with: |
| persist-credentials: false |
| fetch-depth: 1 |
| path: arrow |
| repository: apache/arrow |
| ref: main |
| submodules: recursive |
| - name: Sync to Remote |
| uses: ./arrow/.github/actions/sync-nightlies |
| with: |
| upload: true |
| switches: -avzh --update --delete --progress |
| local_path: odbc-installer |
| remote_path: ${{ secrets.NIGHTLIES_RSYNC_PATH }}/arrow/odbc |
| remote_host: ${{ secrets.NIGHTLIES_RSYNC_HOST }} |
| remote_port: ${{ secrets.NIGHTLIES_RSYNC_PORT }} |
| remote_user: ${{ secrets.NIGHTLIES_RSYNC_USER }} |
| remote_key: ${{ secrets.NIGHTLIES_RSYNC_KEY }} |
| remote_host_key: ${{ secrets.NIGHTLIES_RSYNC_HOST_KEY }} |
| |
| report-extra-cpp: |
| if: github.event_name == 'schedule' && always() |
| needs: |
| - docker |
| - jni-linux |
| - jni-macos |
| - msvc-arm64 |
| - odbc-linux |
| - odbc-macos |
| - odbc-msvc |
| - odbc-nightly |
| uses: ./.github/workflows/report_ci.yml |
| secrets: |
| ARROW_SMTP_PASSWORD: ${{ secrets.ARROW_SMTP_PASSWORD }} |
| ARROW_ZULIP_WEBHOOK: ${{ secrets.ARROW_ZULIP_WEBHOOK }} |