This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push:
new a4f86c9d0 ci: verify source using OS-installed dependencies (#2718)
a4f86c9d0 is described below
commit a4f86c9d0bd4b83ca9f0ca00f47f813d61c70e8c
Author: David Li <[email protected]>
AuthorDate: Thu Apr 24 11:41:19 2025 +0900
ci: verify source using OS-installed dependencies (#2718)
We've only really tested Conda so far. Validate non-Conda builds too.
This only tests Ubuntu/APT but eventually we should also test
Debian/APT, macOS/Homebrew, Fedora/RPM, and AlmaLinux/RPM.
---------
Co-authored-by: Sutou Kouhei <[email protected]>
Co-authored-by: Dewey Dunnington <[email protected]>
---
.github/workflows/nightly-verify.yml | 31 ++++++
ci/scripts/verify_ubuntu.sh | 111 +++++++++++++++++++++
compose.yaml | 9 ++
dev/release/verify-release-candidate.sh | 76 ++++++++------
.../driver/flightsql/flightsql_adbc_server_test.go | 3 +-
5 files changed, 197 insertions(+), 33 deletions(-)
diff --git a/.github/workflows/nightly-verify.yml
b/.github/workflows/nightly-verify.yml
index a689ccf7f..5caa2b26c 100644
--- a/.github/workflows/nightly-verify.yml
+++ b/.github/workflows/nightly-verify.yml
@@ -39,6 +39,10 @@ defaults:
# 'bash' will expand to -eo pipefail
shell: bash
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
jobs:
source:
# For cron: only run on the main repo, not forks
@@ -201,3 +205,30 @@ jobs:
run: |
pushd arrow-adbc
docker compose run -e PYTHON=3.12 --rm python-debug
+
+ source-verify-docker:
+ name: "Verify Source (OS)/${{ matrix.os }} ${{ matrix.version }}"
+ runs-on: ubuntu-latest
+ strategy:
+ max-parallel: 2
+ matrix:
+ include:
+ - os: ubuntu
+ version: "22.04"
+ - os: ubuntu
+ version: "24.04"
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ path: arrow-adbc
+ persist-credentials: false
+ submodules: recursive
+
+ - name: Verify
+ env:
+ OS: ${{ matrix.os }}
+ OS_VERSION: ${{ matrix.version }}
+ run: |
+ pushd arrow-adbc
+ env ${OS@U}=${OS_VERSION} docker compose run --rm verify-all-${OS}
diff --git a/ci/scripts/verify_ubuntu.sh b/ci/scripts/verify_ubuntu.sh
new file mode 100755
index 000000000..0b1eef2c5
--- /dev/null
+++ b/ci/scripts/verify_ubuntu.sh
@@ -0,0 +1,111 @@
+#!/bin/bash
+#
+# 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.
+#
+
+# Test the validation script using system dependencies instead of Conda. This
+# script is meant for automation (e.g. Docker), not a local/developer machine
+# (except via Docker).
+
+set -euo pipefail
+
+main() {
+ local -r source_dir="${1}"
+
+ # Install all the dependencies we need for all the subprojects
+
+ # When installing tzdata, don't block and wait for user input
+ export DEBIAN_FRONTEND=noninteractive
+ export TZ=Etc/UTC
+
+ apt update
+ apt install -y \
+ apt-transport-https \
+ build-essential \
+ ca-certificates \
+ cmake \
+ curl \
+ dirmngr \
+ git \
+ gobject-introspection \
+ gpg \
+ libgirepository1.0-dev \
+ libglib2.0-dev \
+ libgmock-dev \
+ libgtest-dev \
+ libpq-dev \
+ libsqlite3-dev \
+ lsb-release \
+ ninja-build \
+ pkg-config \
+ protobuf-compiler \
+ python3 \
+ python3-dev \
+ python3-pip \
+ python3-venv \
+ r-base \
+ ruby-full \
+ software-properties-common \
+ wget
+
+ # Install Java
+
+ wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | \
+ gpg --dearmor | \
+ tee /etc/apt/trusted.gpg.d/adoptium.gpg > /dev/null
+
+ echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F=
'/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | \
+ tee /etc/apt/sources.list.d/adoptium.list
+
+ # Install Arrow GLib
+ wget https://packages.apache.org/artifactory/arrow/$(lsb_release --id
--short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release
--codename --short).deb
+ apt install -y -V ./apache-arrow-apt-source-latest-$(lsb_release
--codename --short).deb
+
+ apt update
+ apt install -y \
+ libarrow-dev \
+ libarrow-glib-dev \
+ temurin-21-jdk
+
+ # Install Maven
+ wget
https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz
+ mkdir -p /opt/maven
+ tar -C /opt/maven -xzvf apache-maven-3.9.9-bin.tar.gz --strip-components=1
+ export PATH=/opt/maven/bin:$PATH
+
+ # Check if protoc is too old (Ubuntu 22.04). If so, install it from
+ # upstream instead.
+ if ! protoc --version | \
+ awk '{print $2}{print "3.15"}' | \
+ sort --version-sort | \
+ head -n1 | \
+ grep -E '^3\.15.*$' >/dev/null ; then
+ echo "protoc is too old"
+
+ wget -O protoc.zip
https://github.com/protocolbuffers/protobuf/releases/download/v30.2/protoc-30.2-linux-x86_64.zip
+ unzip -o protoc.zip -d /usr/local -x readme.txt
+ fi
+
+ # We run under Docker and this is necessary since the source dir is
+ # typically mounted as a volume
+ git config --global --add safe.directory "${source_dir}"
+
+ "${source_dir}/dev/release/verify-release-candidate.sh"
+}
+
+main "$@"
diff --git a/compose.yaml b/compose.yaml
index 3a7b07fdc..742669cc8 100644
--- a/compose.yaml
+++ b/compose.yaml
@@ -275,3 +275,12 @@ services:
retries: 5
ports:
- "5432:5432"
+
+ ################################ Verification
################################
+
+ verify-all-ubuntu:
+ image: ubuntu:${UBUNTU}
+ volumes:
+ - .:/adbc:delegated
+ command: |
+ /adbc/ci/scripts/verify_ubuntu.sh /adbc
diff --git a/dev/release/verify-release-candidate.sh
b/dev/release/verify-release-candidate.sh
index 4967493e7..fab1cb019 100755
--- a/dev/release/verify-release-candidate.sh
+++ b/dev/release/verify-release-candidate.sh
@@ -246,38 +246,42 @@ install_dotnet() {
return 0
fi
- show_info "Ensuring that .NET is installed..."
-
- if dotnet --version | grep 8\.0 > /dev/null 2>&1; then
- local csharp_bin=$(dirname $(which dotnet))
- show_info "Found C# at $(which csharp) (.NET $(dotnet --version))"
- else
- if which dotnet > /dev/null 2>&1; then
- show_info "dotnet found but it is the wrong version and will be ignored."
+ if command -v dotnet; then
+ show_info "Found $(dotnet --version) at $(which dotnet)"
+
+ if dotnet --version | grep --quiet --fixed-string 8.0; then
+ local csharp_bin=$(dirname $(which dotnet))
+ show_info "Found C# at $(which csharp) (.NET $(dotnet --version))"
+ DOTNET_ALREADY_INSTALLED=1
+ return 0
fi
- local csharp_bin=${ARROW_TMPDIR}/csharp/bin
- local dotnet_version=8.0.204
- local dotnet_platform=
- case "$(uname)" in
+ fi
+
+ show_info "dotnet found but it is the wrong version or dotnet not found"
+
+ local csharp_bin=${ARROW_TMPDIR}/csharp/bin
+ local dotnet_version=8.0.204
+ local dotnet_platform=
+ case "$(uname)" in
Linux)
- dotnet_platform=linux
- ;;
+ dotnet_platform=linux
+ ;;
Darwin)
- dotnet_platform=macos
- ;;
- esac
- local
dotnet_download_thank_you_url=https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-${dotnet_version}-${dotnet_platform}-x64-binaries
- local dotnet_download_url=$( \
- curl -sL ${dotnet_download_thank_you_url} | \
- grep 'directLink' | \
- grep -E -o 'https://download[^"]+' | \
- sed -n 2p)
- mkdir -p ${csharp_bin}
- curl -sL ${dotnet_download_url} | \
+ dotnet_platform=macos
+ ;;
+ esac
+ local
dotnet_download_thank_you_url=https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-${dotnet_version}-${dotnet_platform}-x64-binaries
+ show_info "Getting .NET download URL from ${dotnet_download_thank_you_url}"
+ local dotnet_download_url=$(curl -sL ${dotnet_download_thank_you_url} | \
+ grep 'directLink' | \
+ grep -E -o 'https://download[^"]+' | \
+ sed -n 2p)
+ show_info "Downloading .NET from ${dotnet_download_url}"
+ mkdir -p ${csharp_bin}
+ curl -sL ${dotnet_download_url} | \
tar xzf - -C ${csharp_bin}
- PATH=${csharp_bin}:${PATH}
- show_info "Installed C# at $(which csharp) (.NET $(dotnet --version))"
- fi
+ PATH=${csharp_bin}:${PATH}
+ show_info "Installed C# at $(which csharp) (.NET $(dotnet --version))"
DOTNET_ALREADY_INSTALLED=1
}
@@ -296,6 +300,18 @@ install_go() {
return 0
fi
+ local prefix=${ARROW_TMPDIR}/go
+ mkdir -p $prefix
+
+ if [ -f "${prefix}/go/bin/go" ]; then
+ export GOROOT=${prefix}/go
+ export GOPATH=${prefix}/gopath
+ export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
+ show_info "Found $(go version) at ${prefix}/go/bin/go"
+ GO_ALREADY_INSTALLED=1
+ return 0
+ fi
+
local version=1.24.2
show_info "Installing go version ${version}..."
@@ -315,8 +331,6 @@ install_go() {
local archive="go${version}.${os}-${arch}.tar.gz"
curl -sLO https://go.dev/dl/$archive
- local prefix=${ARROW_TMPDIR}/go
- mkdir -p $prefix
tar -xzf $archive -C $prefix
rm -f $archive
@@ -549,7 +563,7 @@ test_python() {
show_header "Build and test Python libraries"
# Build and test Python
- maybe_setup_virtualenv cython duckdb pandas protobuf pyarrow pytest
setuptools_scm setuptools importlib_resources || exit 1
+ maybe_setup_virtualenv cython duckdb pandas polars protobuf pyarrow pytest
setuptools_scm setuptools importlib_resources || exit 1
# XXX: pin Python for now since various other packages haven't caught up
maybe_setup_conda --file "${ADBC_DIR}/ci/conda_env_python.txt" python=3.12
|| exit 1
diff --git a/go/adbc/driver/flightsql/flightsql_adbc_server_test.go
b/go/adbc/driver/flightsql/flightsql_adbc_server_test.go
index 5ec08b1b6..1261d6bec 100644
--- a/go/adbc/driver/flightsql/flightsql_adbc_server_test.go
+++ b/go/adbc/driver/flightsql/flightsql_adbc_server_test.go
@@ -1660,8 +1660,7 @@ func (ts *TimeoutTests) TestDoActionTimeout() {
var adbcErr adbc.Error
ts.ErrorAs(stmt.Prepare(context.Background()), &adbcErr)
ts.Equal(adbc.StatusTimeout, adbcErr.Code, adbcErr.Error())
- // Exact match - we don't want extra fluff in the message
- ts.Equal("[FlightSQL] context deadline exceeded (DeadlineExceeded;
Prepare)", adbcErr.Msg)
+ // It seems gRPC isn't stable about the error message, unfortunately
}
func (ts *TimeoutTests) TestDoGetTimeout() {