This is an automated email from the ASF dual-hosted git repository.
kou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/master by this push:
new cc8f6c0267 ARROW-17358: [CI][C++] Add a job for Alpine Linux (#13825)
cc8f6c0267 is described below
commit cc8f6c0267680d5f353766a3bafe5822b0ceb88f
Author: Sutou Kouhei <[email protected]>
AuthorDate: Fri Aug 12 12:29:33 2022 +0900
ARROW-17358: [CI][C++] Add a job for Alpine Linux (#13825)
Authored-by: Sutou Kouhei <[email protected]>
Signed-off-by: Sutou Kouhei <[email protected]>
---
.env | 1 +
ci/docker/alpine-linux-3.16-cpp.dockerfile | 102 +++++++++++++++++++++++++++++
ci/scripts/cpp_build.sh | 3 +-
cpp/build-support/run-test.sh | 5 +-
cpp/cmake_modules/DefineOptions.cmake | 2 +
cpp/src/arrow/csv/converter_test.cc | 39 ++++-------
cpp/src/arrow/util/config.h.cmake | 1 +
cpp/src/arrow/util/value_parsing.h | 3 +-
dev/tasks/tasks.yml | 3 +-
docker-compose.yml | 38 ++++++++++-
10 files changed, 163 insertions(+), 34 deletions(-)
diff --git a/.env b/.env
index 2f06cca474..f00f1fd7d0 100644
--- a/.env
+++ b/.env
@@ -47,6 +47,7 @@ ULIMIT_CORE=-1
# Default versions for platforms
ALMALINUX=8
+ALPINE_LINUX=3.16
DEBIAN=11
FEDORA=35
UBUNTU=20.04
diff --git a/ci/docker/alpine-linux-3.16-cpp.dockerfile
b/ci/docker/alpine-linux-3.16-cpp.dockerfile
new file mode 100644
index 0000000000..1f4ed4c47b
--- /dev/null
+++ b/ci/docker/alpine-linux-3.16-cpp.dockerfile
@@ -0,0 +1,102 @@
+# 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.
+
+ARG arch=amd64
+FROM ${arch}/alpine:3.16
+
+RUN apk add \
+ bash \
+ benchmark-dev \
+ boost-dev \
+ brotli-dev \
+ bzip2-dev \
+ c-ares-dev \
+ ccache \
+ clang \
+ cmake \
+ curl-dev \
+ g++ \
+ gcc \
+ gdb \
+ gflags-dev \
+ git \
+ glog-dev \
+ gmock \
+ grpc-dev \
+ gtest-dev \
+ libxml2-dev \
+ llvm13-dev \
+ llvm13-static \
+ lz4-dev \
+ make \
+ musl-locales \
+ nlohmann-json \
+ openssl-dev \
+ perl \
+ pkgconfig \
+ protobuf-dev \
+ py3-pip \
+ py3-numpy-dev \
+ python3-dev \
+ rapidjson-dev \
+ re2-dev \
+ rsync \
+ samurai \
+ snappy-dev \
+ sqlite-dev \
+ thrift-dev \
+ tzdata \
+ utf8proc-dev \
+ zlib-dev \
+ zstd-dev && \
+ rm -rf /var/cache/apk/* && \
+ ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime && \
+ echo "Etc/UTC" > /etc/timezone
+
+COPY ci/scripts/install_minio.sh /arrow/ci/scripts/
+RUN /arrow/ci/scripts/install_minio.sh latest /usr/local
+
+COPY ci/scripts/install_gcs_testbench.sh /arrow/ci/scripts/
+RUN /arrow/ci/scripts/install_gcs_testbench.sh default
+
+ENV ARROW_BUILD_TESTS=ON \
+ ARROW_DATASET=ON \
+ ARROW_DEPENDENCY_SOURCE=SYSTEM \
+ ARROW_FLIGHT=ON \
+ ARROW_FLIGHT_SQL=ON \
+ ARROW_GANDIVA=ON \
+ ARROW_GCS=ON \
+ ARROW_HOME=/usr/local \
+ ARROW_ORC=ON \
+ ARROW_PARQUET=ON \
+ ARROW_PLASMA=ON \
+ ARROW_S3=ON \
+ ARROW_USE_CCACHE=ON \
+ ARROW_WITH_BROTLI=ON \
+ ARROW_WITH_BZ2=ON \
+ ARROW_WITH_LZ4=ON \
+ ARROW_WITH_OPENTELEMETRY=OFF \
+ ARROW_WITH_MUSL=ON \
+ ARROW_WITH_SNAPPY=ON \
+ ARROW_WITH_ZLIB=ON \
+ ARROW_WITH_ZSTD=ON \
+ AWSSDK_SOURCE=BUNDLED \
+ CMAKE_CXX_STANDARD=17 \
+ google_cloud_cpp_storage_SOURCE=BUNDLED \
+ ORC_SOURCE=BUNDLED \
+ PATH=/usr/lib/ccache/:$PATH \
+ xsimd_SOURCE=BUNDLED
diff --git a/ci/scripts/cpp_build.sh b/ci/scripts/cpp_build.sh
index 738f3d2647..c7d2006978 100755
--- a/ci/scripts/cpp_build.sh
+++ b/ci/scripts/cpp_build.sh
@@ -127,6 +127,7 @@ cmake \
-DARROW_WITH_BZ2=${ARROW_WITH_BZ2:-OFF} \
-DARROW_WITH_LZ4=${ARROW_WITH_LZ4:-OFF} \
-DARROW_WITH_OPENTELEMETRY=${ARROW_WITH_OPENTELEMETRY:-OFF} \
+ -DARROW_WITH_MUSL=${ARROW_WITH_MUSL:-OFF} \
-DARROW_WITH_SNAPPY=${ARROW_WITH_SNAPPY:-OFF} \
-DARROW_WITH_UTF8PROC=${ARROW_WITH_UTF8PROC:-ON} \
-DARROW_WITH_ZLIB=${ARROW_WITH_ZLIB:-OFF} \
@@ -172,7 +173,7 @@ time cmake --build . --target install
popd
if [ -x "$(command -v ldconfig)" ]; then
- ldconfig
+ ldconfig ${ARROW_HOME}/${CMAKE_INSTALL_LIBDIR:-lib}
fi
if [ "${ARROW_USE_CCACHE}" == "ON" ]; then
diff --git a/cpp/build-support/run-test.sh b/cpp/build-support/run-test.sh
index d2d327cfdd..7f68abd31c 100755
--- a/cpp/build-support/run-test.sh
+++ b/cpp/build-support/run-test.sh
@@ -109,8 +109,7 @@ function run_test() {
# XML output from gtest. We assume that gtest knows better than us and our
# regexes in most cases, but for certain errors we delete the resulting xml
# file and let our own post-processing step regenerate it.
- export GREP=$(which egrep)
- if zgrep --silent "ThreadSanitizer|Leak check.*detected leaks" $LOGFILE ;
then
+ if grep -E -q "ThreadSanitizer|Leak check.*detected leaks" $LOGFILE ; then
echo ThreadSanitizer or leak check failures in $LOGFILE
STATUS=1
rm -f $XMLFILE
@@ -157,7 +156,7 @@ function post_process_tests() {
# If we have a LeakSanitizer report, and XML reporting is configured, add a
new test
# case result to the XML file for the leak report. Otherwise Jenkins won't
show
# us which tests had LSAN errors.
- if zgrep --silent "ERROR: LeakSanitizer: detected memory leaks" $LOGFILE ;
then
+ if grep -E -q "ERROR: LeakSanitizer: detected memory leaks" $LOGFILE ; then
echo Test had memory leaks. Editing XML
perl -p -i -e '
if (m#</testsuite>#) {
diff --git a/cpp/cmake_modules/DefineOptions.cmake
b/cpp/cmake_modules/DefineOptions.cmake
index d5590a95ee..0dbf4cb843 100644
--- a/cpp/cmake_modules/DefineOptions.cmake
+++ b/cpp/cmake_modules/DefineOptions.cmake
@@ -158,6 +158,8 @@ if(ARROW_DEFINE_OPTIONS)
define_option(ARROW_GGDB_DEBUG "Pass -ggdb flag to debug builds" ON)
+ define_option(ARROW_WITH_MUSL "Whether the system libc is musl or not" OFF)
+
#----------------------------------------------------------------------
set_option_category("Test and benchmark")
diff --git a/cpp/src/arrow/csv/converter_test.cc
b/cpp/src/arrow/csv/converter_test.cc
index 0c5def554b..c32b07d2de 100644
--- a/cpp/src/arrow/csv/converter_test.cc
+++ b/cpp/src/arrow/csv/converter_test.cc
@@ -624,21 +624,29 @@ TEST(TimestampConversion, UserDefinedParsers) {
{{86400000}, {172800000}}, options);
}
-#ifndef _WIN32
TEST(TimestampConversion, UserDefinedParsersWithZone) {
auto options = ConvertOptions::Defaults();
auto type = timestamp(TimeUnit::SECOND, "America/Phoenix");
// Test a single parser
options.timestamp_parsers = {TimestampParser::MakeStrptime("%m/%d/%Y %z")};
- AssertConversion<TimestampType, int64_t>(type, {"01/02/1970 +0000,01/03/1970
+0000\n"},
- {{86400}, {172800}}, options);
+ if (internal::kStrptimeSupportsZone) {
+ AssertConversion<TimestampType, int64_t>(
+ type, {"01/02/1970 +0000,01/03/1970 +0000\n"}, {{86400}, {172800}},
options);
+ } else {
+ AssertConversionError(type, {"01/02/1970 +0000,01/03/1970 +0000\n"}, {0,
1}, options);
+ }
// Test multiple parsers
options.timestamp_parsers.push_back(TimestampParser::MakeISO8601());
- AssertConversion<TimestampType, int64_t>(
- type, {"01/02/1970 +0000,1970-01-03T00:00:00+0000\n"}, {{86400},
{172800}},
- options);
+ if (internal::kStrptimeSupportsZone) {
+ AssertConversion<TimestampType, int64_t>(
+ type, {"01/02/1970 +0000,1970-01-03T00:00:00+0000\n"}, {{86400},
{172800}},
+ options);
+ } else {
+ AssertConversionError(type, {"01/02/1970
+0000,1970-01-03T00:00:00+0000\n"}, {0},
+ options);
+ }
// Test errors
options.timestamp_parsers = {TimestampParser::MakeStrptime("%m/%d/%Y")};
@@ -646,25 +654,6 @@ TEST(TimestampConversion, UserDefinedParsersWithZone) {
options.timestamp_parsers.push_back(TimestampParser::MakeISO8601());
AssertConversionError(type, {"01/02/1970,1970-01-03T00:00:00+0000\n"}, {0},
options);
}
-#else
-// Windows uses the vendored musl strptime which doesn't support %z.
-TEST(TimestampConversion, UserDefinedParsersWithZone) {
- auto options = ConvertOptions::Defaults();
- auto type = timestamp(TimeUnit::SECOND, "America/Phoenix");
-
- options.timestamp_parsers = {TimestampParser::MakeStrptime("%m/%d/%Y %z")};
- AssertConversionError(type, {"01/02/1970 +0000,01/03/1970 +0000\n"}, {0, 1},
options);
-
- options.timestamp_parsers.push_back(TimestampParser::MakeISO8601());
- AssertConversionError(type, {"01/02/1970 +0000,1970-01-03T00:00:00+0000\n"},
{0},
- options);
-
- options.timestamp_parsers = {TimestampParser::MakeStrptime("%m/%d/%Y")};
- AssertConversionError(type, {"01/02/1970,01/03/1970\n"}, {0, 1}, options);
- options.timestamp_parsers.push_back(TimestampParser::MakeISO8601());
- AssertConversionError(type, {"01/02/1970,1970-01-03T00:00:00+0000\n"}, {0},
options);
-}
-#endif
Decimal128 Dec128(util::string_view value) {
Decimal128 dec;
diff --git a/cpp/src/arrow/util/config.h.cmake
b/cpp/src/arrow/util/config.h.cmake
index c4a2a40be2..c987a0cae3 100644
--- a/cpp/src/arrow/util/config.h.cmake
+++ b/cpp/src/arrow/util/config.h.cmake
@@ -50,6 +50,7 @@
#cmakedefine ARROW_GCS
#cmakedefine ARROW_S3
#cmakedefine ARROW_USE_NATIVE_INT128
+#cmakedefine ARROW_WITH_MUSL
#cmakedefine ARROW_WITH_OPENTELEMETRY
#cmakedefine ARROW_WITH_UCX
diff --git a/cpp/src/arrow/util/value_parsing.h
b/cpp/src/arrow/util/value_parsing.h
index fbbbcf10f0..5193f0af75 100644
--- a/cpp/src/arrow/util/value_parsing.h
+++ b/cpp/src/arrow/util/value_parsing.h
@@ -31,6 +31,7 @@
#include "arrow/type.h"
#include "arrow/type_traits.h"
#include "arrow/util/checked_cast.h"
+#include "arrow/util/config.h"
#include "arrow/util/macros.h"
#include "arrow/util/time.h"
#include "arrow/util/visibility.h"
@@ -770,7 +771,7 @@ static inline bool ParseTimestampISO8601(const char* s,
size_t length,
return true;
}
-#ifdef _WIN32
+#if defined(_WIN32) || defined(ARROW_WITH_MUSL)
static constexpr bool kStrptimeSupportsZone = false;
#else
static constexpr bool kStrptimeSupportsZone = true;
diff --git a/dev/tasks/tasks.yml b/dev/tasks/tasks.yml
index 4b61cf0fcf..4a082085f5 100644
--- a/dev/tasks/tasks.yml
+++ b/dev/tasks/tasks.yml
@@ -1114,7 +1114,8 @@ tasks:
############################## Docker tests ##################################
-{% for image in ["conda-cpp",
+{% for image in ["alpine-linux-cpp",
+ "conda-cpp",
"debian-c-glib",
"ubuntu-c-glib",
"debian-ruby",
diff --git a/docker-compose.yml b/docker-compose.yml
index 13d7a4da4f..ab15f1c59a 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -96,6 +96,7 @@ x-hierarchy:
# descendant images if any. Archery checks that all node has a corresponding
# service entry, so any new image/service must be listed here.
- almalinux-verify-rc
+ - alpine-linux-cpp
- centos-cpp-static
- conda:
- conda-cpp:
@@ -162,6 +163,8 @@ x-hierarchy:
volumes:
almalinux-ccache:
name: ${ARCH}-almalinux-ccache
+ alpine-linux-ccache:
+ name: ${ARCH}-alpine-linux-ccache
conda-ccache:
name: ${ARCH}-conda-ccache
debian-ccache:
@@ -192,6 +195,36 @@ services:
# -e ARROW_TEST_LINKAGE=static \
# conda-cpp|debian-cpp|...
+ alpine-linux-cpp:
+ # Usage:
+ # docker-compose build alpine-linux-cpp
+ # docker-compose run --rm alpine-linux-cpp
+ # Parameters:
+ # ALPINE_LINUX: 3.16
+ # ARCH: amd64, arm64v8, ...
+ image: ${REPO}:${ARCH}-alpine-linux-${ALPINE_LINUX}-cpp
+ build:
+ context: .
+ dockerfile: ci/docker/alpine-linux-${ALPINE_LINUX}-cpp.dockerfile
+ cache_from:
+ - ${REPO}:${ARCH}-alpine-linux-${ALPINE_LINUX}-cpp
+ args:
+ arch: ${ARCH}
+ shm_size: &shm-size 2G
+ ulimits: &ulimits
+ core: ${ULIMIT_CORE}
+ environment:
+ <<: *ccache
+ ARROW_ENABLE_TIMING_TESTS: # inherit
+ ARROW_MIMALLOC: "ON"
+ volumes: &alpine-linux-volumes
+ - .:/arrow:delegated
+ - ${DOCKER_VOLUME_PREFIX}alpine-linux-ccache:/ccache:delegated
+ command: >-
+ /bin/bash -c "
+ /arrow/ci/scripts/cpp_build.sh /arrow /build &&
+ /arrow/ci/scripts/cpp_test.sh /arrow /build"
+
conda:
# Base image for conda builds.
#
@@ -229,9 +262,8 @@ services:
args:
repo: ${REPO}
arch: ${ARCH}
- shm_size: &shm-size 2G
- ulimits: &ulimits
- core: ${ULIMIT_CORE}
+ shm_size: *shm-size
+ ulimits: *ulimits
environment:
<<: *ccache
ARROW_BUILD_BENCHMARKS: "ON"