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"

Reply via email to