Skip to content

Add workflow_dispatch definitions #674

Add workflow_dispatch definitions

Add workflow_dispatch definitions #674

Workflow file for this run

# 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:
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'
types:
- labeled
- opened
- reopened
- synchronize
schedule:
- cron: |
0 0 * * *
workflow_dispatch:
# Example: gh workflow run cpp_extra.yml --ref apache-arrow-24.0.0-rc0 -f odbc_upload=dll
# -AL- todo implement dispatch variables.
# -AL- I need to make sure the workflows run first before implementing
# dispatch in workflow A and B. Assume that user trigger via tag.
# -AL- can use:
# if: inputs.odbc_upload == 'dll' # For CI A, trigger first
# if: inputs.odbc_upload == 'msi' # For CI B, trigger after upload signed DLL
# And then replace `${RELEASE_CANDIDATE_TAG_NAME}` with `GITHUB_REF_NAME`
inputs:
odbc_upload:
description: 'ODBC Component Upload'
required: true
default: 'dll'
type: choice
options:
- dll
- msi
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:
if: github.event_name != 'schedule' || github.repository == 'apache/arrow'
uses: ./.github/workflows/check_labels.yml
secrets: inherit
with:
parent-workflow: cpp_extra
# docker:
# needs: check-labels
# name: ${{ matrix.title }}
# runs-on: ${{ matrix.runs-on }}
# if: >-
# needs.check-labels.outputs.force == 'true' ||
# contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra') ||
# contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra: C++')
# timeout-minutes: 75
# strategy:
# fail-fast: false
# matrix:
# include:
# - image: alpine-linux-cpp
# runs-on: ubuntu-latest
# title: AMD64 Alpine Linux
# - 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@v6
# with:
# fetch-depth: 0
# submodules: recursive
# - name: Cache Docker Volumes
# uses: actions/cache@v5
# with:
# path: .docker
# key: extra-${{ matrix.image }}-${{ hashFiles('cpp/**') }}
# restore-keys: extra-${{ matrix.image }}-
# - name: Setup Python
# uses: actions/setup-python@v6
# 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: 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-labels
# if: >-
# needs.check-labels.outputs.force == 'true' ||
# contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra') ||
# contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra: C++')
# 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-labels
# name: JNI ${{ matrix.platform.runs-on }} ${{ matrix.platform.arch }}
# runs-on: ${{ matrix.platform.runs-on }}
# if: >-
# needs.check-labels.outputs.force == 'true' ||
# contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra') ||
# contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra: C++')
# timeout-minutes: 240
# permissions:
# # This is for using GitHub Packages for vcpkg cache
# packages: write
# strategy:
# fail-fast: false
# matrix:
# platform:
# - arch: "amd64"
# runs-on: ubuntu-latest
# - arch: "arm64v8"
# runs-on: ubuntu-24.04-arm
# env:
# ARCH: ${{ matrix.platform.arch }}
# REPO: ghcr.io/${{ github.repository }}-dev
# steps:
# - name: Checkout Arrow
# uses: actions/checkout@v6
# with:
# fetch-depth: 0
# submodules: recursive
# - name: Free up disk space
# run: |
# ci/scripts/util_free_space.sh
# - name: Cache Docker Volumes
# uses: actions/cache@v5
# with:
# path: .docker
# key: jni-${{ matrix.platform.runs-on }}-${{ hashFiles('cpp/**') }}
# restore-keys: jni-${{ matrix.platform.runs-on }}-
# - name: Setup Python
# uses: actions/setup-python@v6
# 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: 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-labels
# name: JNI macOS
# runs-on: macos-14
# if: >-
# needs.check-labels.outputs.force == 'true' ||
# contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra') ||
# contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra: C++')
# timeout-minutes: 45
# env:
# MACOSX_DEPLOYMENT_TARGET: "14.0"
# steps:
# - name: Checkout Arrow
# uses: actions/checkout@v6
# with:
# 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: Cache ccache
# uses: actions/cache@v5
# with:
# path: ccache
# key: jni-macos-${{ hashFiles('cpp/**') }}
# restore-keys: 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: |
# # MinIO is required
# exclude_tests="arrow-s3fs-test"
# # unstable
# exclude_tests="${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
# odbc-linux:
# needs: check-labels
# name: ODBC Linux
# runs-on: ubuntu-latest
# if: >-
# needs.check-labels.outputs.force == 'true' ||
# contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra') ||
# contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra: C++')
# timeout-minutes: 75
# strategy:
# fail-fast: false
# env:
# ARCH: amd64
# ARCHERY_DEBUG: 1
# ARROW_ENABLE_TIMING_TESTS: OFF
# CLANG_TOOLS: 18
# DOCKER_VOLUME_PREFIX: ".docker/"
# LLVM: 18
# UBUNTU: 24.04
# steps:
# - name: Checkout Arrow
# uses: actions/checkout@v6
# with:
# fetch-depth: 0
# submodules: recursive
# - name: Cache Docker Volumes
# uses: actions/cache@v5
# with:
# path: .docker
# key: ubuntu-cpp-odbc-${{ hashFiles('cpp/**') }}
# restore-keys: ubuntu-cpp-odbc-
# - name: Setup Python on hosted runner
# uses: actions/setup-python@v6
# with:
# python-version: 3
# - name: Setup Archery
# run: python3 -m pip install -e dev/archery[docker]
# - 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: 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-labels
# name: ODBC ${{ matrix.build-type }} ${{ matrix.architecture }} macOS ${{ matrix.macos-version }}
# runs-on: macos-${{ matrix.macos-version }}
# if: >-
# needs.check-labels.outputs.force == 'true' ||
# contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra') ||
# contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra: C++')
# timeout-minutes: 75
# 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_HOME: /tmp/local
# ARROW_MIMALLOC: OFF
# steps:
# - name: Checkout Arrow
# uses: actions/checkout@v6.0.1
# with:
# 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: Cache ccache
# uses: actions/cache@v5.0.2
# with:
# path: ${{ steps.ccache-info.outputs.cache-dir }}
# key: cpp-odbc-ccache-macos-${{ matrix.macos-version }}-${{ matrix.build-type }}-${{ hashFiles('cpp/**') }}
# restore-keys: 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"
# if [ "${{ matrix.macos-version }}" = "15-intel" ]; then
# # GH-49563 Explicitly set llvm path to avoid linking to libunwind
# export CLANG_TOOLS_PATH=/usr/local/opt/llvm@18/bin
# fi
# ci/scripts/cpp_build.sh $(pwd) $(pwd)/build
# - name: Setup Python
# uses: actions/setup-python@v6
# 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: 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
# -AL- todo create CI A, and CI B.
# - [get ODBC DLL] Trigger CI A - This CI will build `arrow_flight_sql_odbc.dll` and
# upload the DLL to GitHub release as `arrow_flight_sql_odbc_unsigned.dll`
# to differentiate from signed DLL.
# - [get ODBC MSI] Trigger CI B - This CI will generate cpack files (and unsigned ODBC),
# then download signed `arrow_flight_sql_odbc.dll` from GitHub release,
# and then replace unsigned DLL with the signed DLL locally.
# Then run `cpack` and build the unsigned MSI, and upload the MSI to GitHub release.
# This MSI will pick up the signed DLL.
# -AL- todo need to add `github.event_name != 'workflow_dispatch' ||` to all existing workflows after uncomment
# (except CI A and B ofc)
odbc-msvc:
needs: check-labels
name: ODBC Windows
runs-on: windows-2022
if: >-
github.event_name != 'workflow_dispatch' ||
needs.check-labels.outputs.force == 'true' ||
contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra') ||
contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra: C++')
timeout-minutes: 240
permissions:
packages: write
env: &odbc_msvc_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
CMAKE_GENERATOR: Ninja
CMAKE_INSTALL_PREFIX: /usr
VCPKG_BINARY_SOURCES: 'clear;nugettimeout,600;nuget,GitHub,readwrite'
VCPKG_DEFAULT_TRIPLET: x64-windows
steps:
- name: Checkout Arrow
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
- name: Build ODBC Windows
uses: ./.github/actions/odbc-windows
- 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
# -AL- todo keep upload dll code in here! Can remove installer upload code.
# -AL- This is CI A.
odbc-msvc-upload-dll:
needs: check-labels
name: ODBC Windows Upload Unsigned DLL
runs-on: windows-2022
# -AL- todo: change to dispatch workflow instead of trigger by defualt.
if: >-
needs.check-labels.outputs.force == 'true' ||
contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra') ||
contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra: C++')
timeout-minutes: 240
permissions:
packages: write
env: *odbc_msvc_env
steps:
- name: Checkout Arrow
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
- name: Build ODBC Windows
uses: ./.github/actions/odbc-windows
- name: Name Unsigned ODBC DLL
run: |
Rename-Item `
-Path build/cpp/${{ env.ARROW_BUILD_TYPE }}/arrow_flight_sql_odbc.dll `
-NewName arrow_flight_sql_odbc_unsigned.dll
- name: Upload ODBC DLL to the job
uses: actions/upload-artifact@v7
with:
name: flight-sql-odbc-dll
path: build/cpp/${{ env.ARROW_BUILD_TYPE }}/arrow_flight_sql_odbc_unsigned.dll
if-no-files-found: error
# -AL- CI A's follow up
odbc-dll-release:
needs: odbc-msvc-upload-dll
name: Upload Unsigned ODBC DLL
runs-on: ubuntu-latest
permissions:
# Upload to GitHub Release
contents: write
env:
RELEASE_CANDIDATE_TAG_NAME: 'apache-arrow-test-24.0.0-rc0' #ALINA_TEST_TAG -AL-
steps:
- name: Checkout Arrow
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
- name: Download the artifacts
uses: actions/download-artifact@v8
with:
name: flight-sql-odbc-dll
- name: Test Echo RELEASE_CANDIDATE_TAG_NAME # -AL- delete later
run: |
echo ${RELEASE_CANDIDATE_TAG_NAME}
- name: Wait for creating GitHub Release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
dev/release/utils-watch-gh-workflow.sh \
${RELEASE_CANDIDATE_TAG_NAME} \
release_candidate.yml
- name: Upload the artifacts to GitHub Release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release upload ${RELEASE_CANDIDATE_TAG_NAME} \
--clobber \
arrow_flight_sql_odbc_unsigned.dll
# -AL- This is CI B draft.
odbc-msvc-upload-msi:
needs: check-labels
name: ODBC Windows Upload Unsigned MSI
runs-on: windows-2022
# -AL- todo: change to dispatch workflow instead of trigger by defualt.
# -AL- todo 2: add RELEASE_CANDIDATE_TAG_NAME as input. Example: "v12.0.0-rc1"
if: >-
needs.check-labels.outputs.force == 'true' ||
contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra') ||
contains(fromJSON(needs.check-labels.outputs.ci-extra-labels || '[]'), 'CI: Extra: C++')
timeout-minutes: 240
permissions:
packages: write
env: *odbc_msvc_env
steps:
- name: Checkout Arrow
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
- name: Build ODBC Windows
uses: ./.github/actions/odbc-windows
- name: Download signed ODBC DLL
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release download ${RELEASE_CANDIDATE_TAG_NAME} `
--pattern arrow_flight_sql_odbc.dll `
--clobber
# Let ODBC Build (build should come after download to save time in case signed DLL is not available)
- name: Replace signed DLL with unsigned DLL
run: |
Move-Item -Path .\arrow_flight_sql_odbc.dll -Destination .\build\cpp\release\Release\arrow_flight_sql_odbc.dll -Force
- 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 the artifacts to GitHub Release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release upload ${RELEASE_CANDIDATE_TAG_NAME} \
--clobber \
Apache-Arrow-Flight-SQL-ODBC-*-win64.msi
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@v6
with:
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 }}
# -AL- this can be removed?
# odbc-release:
# needs: odbc-msvc
# name: ODBC release
# runs-on: ubuntu-latest
# if: ${{ startsWith(github.ref_name, 'apache-arrow-') && contains(github.ref_name, '-rc') }}
# permissions:
# # Upload to GitHub Release
# contents: write
# steps:
# - name: Checkout Arrow
# uses: actions/checkout@v6
# with:
# fetch-depth: 0
# submodules: recursive
# - name: Download the artifacts
# uses: actions/download-artifact@v8
# with:
# name: flight-sql-odbc-msi-installer
# - name: Wait for creating GitHub Release
# env:
# GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# run: |
# dev/release/utils-watch-gh-workflow.sh \
# ${GITHUB_REF_NAME} \
# release_candidate.yml
# - name: Upload the artifacts to GitHub Release
# env:
# GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# run: |
# gh release upload ${GITHUB_REF_NAME} \
# --clobber \
# Apache-Arrow-Flight-SQL-ODBC-*-win64.msi
# -AL- draft code for upload; I was thinking that in the final product,
# the `Download the artifacts` step could have been skipped,
# and we do github release directly. Or maybe not because it needs
# ubuntu... nvm
# - name: Download the artifacts
# uses: actions/download-artifact@v8
# with:
# name: flight-sql-odbc-dll
# - name: Upload the artifacts to GitHub Release
# env:
# GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# run: |
# gh release download ${GITHUB_REF_NAME} \
# --clobber \
# arrow_flight_sql_odbc_unsigned.dll
# End of ODBC DLL draft code
# -AL- below is draft code for downloading signed DLL and using it
# I think we can have `RELEASE_CANDIDATE_TAG_NAME` as input? that part needs review later though
# Also for CI B, we don't actually need the `Wait for creating GitHub Release` step,
# so Windows should be ok.
# - name: Download signed ODBC DLL
# env:
# GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# run: |
# gh release download ${RELEASE_CANDIDATE_TAG_NAME} \
# --pattern arrow_flight_sql_odbc.dll \
# --clobber
# # Let ODBC Build (build should come after download to save time in case signed DLL is not available)
# - name: Replace signed DLL with unsigned DLL
# run: |
# Move-Item -Path .\arrow_flight_sql_odbc.dll -Destination .\build\cpp\release\Release\arrow_flight_sql_odbc.dll -Force
report-extra-cpp:
if: github.event_name == 'schedule' && always()
needs:
# - docker
# - jni-linux
# - jni-macos
# - msvc-arm64
# - odbc-linux
# - odbc-macos
- odbc-msvc
- odbc-msvc-upload-dll
- odbc-msvc-upload-msi
- odbc-nightly
# - odbc-release # -AL- can be removed after CI A and CI B implement
uses: ./.github/workflows/report_ci.yml
secrets: inherit