[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/apache/arrow/main/.github/workflows/cpp_extra.yml [Back]  [Original]

# 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

env:
  ARCHERY_DEBUG: 1
  ARROW_ENABLE_TIMING_TESTS: OFF
  DOCKER_VOLUME_PREFIX: ".docker/"

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: ubuntu-cpp-bundled-offline
            runs-on: ubuntu-latest
            envs:
              - UBUNTU=24.04
            title: AMD64 Ubuntu Bundled Offline
          - 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
          - image: debian-cpp
            run-options: >-
              -e ARROW_SIMD_LEVEL=NONE
              -e ARROW_CXXFLAGS=-march=x86-64
            runs-on: ubuntu-latest
            title: AMD64 Debian SIMD Level NONE
    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@ce952724eb5210790bd5d466d70d5d60ac3e6c21
        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@ce952724eb5210790bd5d466d70d5d60ac3e6c21
        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@ce952724eb5210790bd5d466d70d5d60ac3e6c21
        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@ce952724eb5210790bd5d466d70d5d60ac3e6c21
        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@ce952724eb5210790bd5d466d70d5d60ac3e6c21
        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@ce952724eb5210790bd5d466d70d5d60ac3e6c21
        with:
          path: ccache
          key: jni-macos

  jni-windows:
    needs: check-enabled
    if: needs.check-enabled.outputs.is_enabled == 'true'
    name: JNI Windows
    runs-on: windows-2022
    timeout-minutes: 240

    steps:
      - name: Disable Crash Dialogs
        run: |
          reg add `
            "HKCU\SOFTWARE\Microsoft\Windows\Windows Error Reporting" `
            /v DontShowUI `
            /t REG_DWORD `
            /d 1 `
            /f

      - name: Checkout Arrow
        uses: actions/checkout@v7
        with:
          persist-credentials: false
          fetch-depth: 0
          submodules: recursive

      - name: Install msys2 (for tzdata for ORC tests)
        uses: msys2/setup-msys2@v2
        id: setup-msys2

      - name: Install cmake
        shell: bash
        run: |
          ci/scripts/install_cmake.sh 4.1.2 /usr

      - name: Install ccache
        shell: bash
        run: |
          ci/scripts/install_ccache.sh 4.13.6 /usr

      - name: Setup ccache
        shell: bash
        run: |
          ci/scripts/ccache_setup.sh

      - name: ccache info
        id: ccache-info
        shell: bash
        run: |
          echo "cache-dir=$(ccache --get-config cache_dir)" >> $GITHUB_OUTPUT

      - name: Restore ccache
        uses: apache/infrastructure-actions/stash/restore@ce952724eb5210790bd5d466d70d5d60ac3e6c21
        with:
          path: ${{ steps.ccache-info.outputs.cache-dir }}
          key: jni-windows

      - name: CMake
        shell: cmd
        run: |
          call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64
          cmake ^
            -S cpp ^
            -B cpp.build ^
            --preset=ninja-release-jni-windows ^
            -DARROW_BUILD_TESTS=ON ^
            -DCMAKE_INSTALL_PREFIX=%CD%\cpp.install

      - name: Build
        shell: cmd
        run: |
          call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64
          cmake --build cpp.build

      - name: Install
        shell: cmd
        run: |
          call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64
          cmake --install cpp.build

      - name: Test
        shell: cmd
        env:
          MSYS2_LOCATION: ${{ steps.setup-msys2.outputs.msys2-location }}
          ARROW_TEST_DATA: ${{ github.workspace }}\testing\data
          PARQUET_TEST_DATA: ${{ github.workspace }}\cpp\submodules\parquet-testing\data
        run: |
          call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64
          set TZDIR=%MSYS2_LOCATION%\usr\share\zoneinfo

          set exclude_tests=arrow-acero-asof-join-node-test
          set exclude_tests=%exclude_tests%^|arrow-acero-hash-join-node-test

          ctest ^
            --exclude-regex "%exclude_tests%" ^
            --label-regex unittest ^
            --output-on-failure ^
            --parallel %NUMBER_OF_PROCESSORS% ^
            --test-dir cpp.build ^
            --timeout 300

      - name: Build example
        shell: cmd
        run: |
          call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64

          cmake ^
            -S cpp/examples/minimal_build ^
            -B cpp/examples/minimal_build.build ^
            -GNinja ^
            -DCMAKE_BUILD_TYPE=Release ^
            -DCMAKE_INSTALL_PREFIX=%CD%\cpp.install

          cmake --build cpp/examples/minimal_build.build

          cd cpp\examples\minimal_build
          call ..\minimal_build.build\arrow-example.exe

      - name: Save ccache
        if: ${{ !cancelled() }}
        continue-on-error: true
        uses: apache/infrastructure-actions/stash/save@ce952724eb5210790bd5d466d70d5d60ac3e6c21
        with:
          path: ${{ steps.ccache-info.outputs.cache-dir }}
          key: jni-windows

  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
      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@ce952724eb5210790bd5d466d70d5d60ac3e6c21
        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@ce952724eb5210790bd5d466d70d5d60ac3e6c21
        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@ce952724eb5210790bd5d466d70d5d60ac3e6c21
        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@ce952724eb5210790bd5d466d70d5d60ac3e6c21
        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 }}

Web Proxy Viewer  |  New URL  |  Original Page