From f1c4a1920ba7b251b934e019d28314a0bb21b266 Mon Sep 17 00:00:00 2001 From: Prachi Gaonkar Date: Tue, 1 Sep 2026 13:32:52 +0530 Subject: [PATCH] logstash: add OSS build script, patch, Dockerfile and build_info for v9.4.5 on UBI 9.8 (ppc64le) --- .../Dockerfiles/9.4.5_ubi_9.8/Dockerfile | 161 +++++++++++++ l/logstash/assemble-tar-oss-withoutjdk.patch | 55 +++++ l/logstash/build_info.json | 33 ++- l/logstash/logstash_oss_9.4.5_ubi9.8.sh | 220 ++++++++++++++++++ l/logstash/logstash_v9.4.5.patch | 188 +++++++++++++++ 5 files changed, 652 insertions(+), 5 deletions(-) create mode 100644 l/logstash/Dockerfiles/9.4.5_ubi_9.8/Dockerfile create mode 100644 l/logstash/assemble-tar-oss-withoutjdk.patch create mode 100644 l/logstash/logstash_oss_9.4.5_ubi9.8.sh create mode 100644 l/logstash/logstash_v9.4.5.patch diff --git a/l/logstash/Dockerfiles/9.4.5_ubi_9.8/Dockerfile b/l/logstash/Dockerfiles/9.4.5_ubi_9.8/Dockerfile new file mode 100644 index 0000000000..eda6c9e461 --- /dev/null +++ b/l/logstash/Dockerfiles/9.4.5_ubi_9.8/Dockerfile @@ -0,0 +1,161 @@ +# syntax=docker/dockerfile:1 +# Stage 1: build the Logstash OSS tarball for ppc64le +FROM registry.access.redhat.com/ubi9/ubi:latest AS build + +ARG PACKAGE_VERSION=v9.4.5 +ARG PATCH=https://raw.githubusercontent.com/ppc64le/build-scripts/master/l/logstash/logstash_v9.4.5.patch +ENV PACKAGE_NAME=logstash + +# Install build dependencies +RUN yum -y update && yum install -y \ + git procps yum-utils wget ncurses make gcc-c++ libffi-devel \ + java-21-openjdk java-21-openjdk-devel java-21-openjdk-headless + +# Add CentOS Stream 9 repos for bison and readline-devel (not in UBI9) +RUN rpm --import https://www.centos.org/keys/RPM-GPG-KEY-CentOS-Official && \ + printf '[cs9-appstream]\nname=CentOS Stream 9 - AppStream\nbaseurl=https://mirror.stream.centos.org/9-stream/AppStream/ppc64le/os/\ngpgcheck=1\ngpgkey=https://www.centos.org/keys/RPM-GPG-KEY-CentOS-Official\nenabled=1\n' \ + > /etc/yum.repos.d/cs9-appstream.repo && \ + printf '[cs9-baseos]\nname=CentOS Stream 9 - BaseOS\nbaseurl=https://mirror.stream.centos.org/9-stream/BaseOS/ppc64le/os/\ngpgcheck=1\ngpgkey=https://www.centos.org/keys/RPM-GPG-KEY-CentOS-Official\nenabled=1\n' \ + > /etc/yum.repos.d/cs9-baseos.repo && \ + printf '[cs9-crb]\nname=CentOS Stream 9 - CRB\nbaseurl=https://mirror.stream.centos.org/9-stream/CRB/ppc64le/os/\ngpgcheck=1\ngpgkey=https://www.centos.org/keys/RPM-GPG-KEY-CentOS-Official\nenabled=1\n' \ + > /etc/yum.repos.d/cs9-crb.repo && \ + yum install -y bison readline-devel + +WORKDIR /tmp + +RUN wget ${PATCH} && \ + git clone https://github.com/elastic/logstash ${PACKAGE_NAME} && \ + cd ${PACKAGE_NAME} && \ + git checkout ${PACKAGE_VERSION} && \ + git apply --check ../${PATCH##*/} && \ + git apply --ignore-whitespace ../${PATCH##*/} && \ + rm -f /tmp/${PATCH##*/} + +# Install RVM and the Ruby version required by Logstash +RUN curl -sSL https://rvm.io/mpapis.asc | gpg2 --import - && \ + curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import - && \ + curl -L https://get.rvm.io | bash -s stable +RUN /bin/bash -l -c "\ + source /etc/profile.d/rvm.sh && \ + rvm install \$(cat /tmp/${PACKAGE_NAME}/.ruby-version) && \ + rvm use \$(cat /tmp/${PACKAGE_NAME}/.ruby-version) --default" + +ENV OSS=true +ENV LOGSTASH_SOURCE=1 +ENV LOGSTASH_PATH=/tmp/logstash + +# Download and unpack the ppc64le JDK; writes JDK_VERSION file expected by the rake task +RUN /bin/bash -l -c "\ + source /usr/local/rvm/scripts/rvm && \ + cd /tmp/${PACKAGE_NAME} && \ + ARCH=ppc64le ./gradlew copyAllJdks --rerun-tasks --no-build-cache" + +# Ensure JDK_VERSION file exists (written by copyAllJdks doLast from jdk-linux-ppc64le/release) +RUN cd /tmp/${PACKAGE_NAME} && \ + if [ ! -f JDK_VERSION ]; then \ + JDK_REL=jdk-linux-ppc64le/release; \ + if [ ! -f "$JDK_REL" ]; then \ + echo "ERROR: JDK_VERSION missing and $JDK_REL not found - copyAllJdks did not complete" >&2; exit 1; \ + fi; \ + grep IMPLEMENTOR_VERSION "$JDK_REL" | sed 's/IMPLEMENTOR_VERSION="//;s/"//' > JDK_VERSION; \ + fi + +# Install gems into the vendored JRuby (avoids Bundler double-load conflict with system Ruby) +RUN /bin/bash -l -c "\ + source /usr/local/rvm/scripts/rvm && \ + cd /tmp/${PACKAGE_NAME} && \ + cp Gemfile.jruby-3.4.lock.release Gemfile.lock && \ + vendor/jruby/bin/jruby -S gem install bundler --no-document && \ + vendor/jruby/bin/jruby -S bundle install --without development test" + +# Build the OSS tarball +RUN /bin/bash -l -c "\ + source /usr/local/rvm/scripts/rvm && \ + cd /tmp/${PACKAGE_NAME} && \ + ARCH=ppc64le \ + BUNDLE_WITHOUT='development:test' \ + RELEASE=1 \ + vendor/jruby/bin/jruby -S bundle exec rake artifact:archives_oss" + +# ───────────────────────────────────────────────────────────── +# Stage 2: install the tarball on a clean UBI9-minimal base +# ───────────────────────────────────────────────────────────── +FROM registry.access.redhat.com/ubi9/ubi-minimal:latest + +ENV ELASTIC_CONTAINER=true +ENV PATH=/usr/share/logstash/bin:$PATH +ENV LANG=C.UTF-8 +ENV LC_ALL=C.UTF-8 + +WORKDIR /usr/share + +# ------------------------------------------------------------ +# Install required packages +# ------------------------------------------------------------ +RUN microdnf install -y \ + procps \ + findutils \ + tar \ + gzip \ + openssl \ + which \ + shadow-utils \ + && microdnf clean all + +# Provide a non-root user to run the process. +# Add Logstash itself and set permissions. +RUN --mount=type=bind,from=build,source=/tmp/logstash/build/logstash-oss-9.4.5-linux-ppc64le.tar.gz,target=/tmp/logstash.tar.gz \ + groupadd --gid 1000 logstash && \ + adduser --uid 1000 --gid 1000 \ + --home "/usr/share/logstash" \ + --no-create-home \ + logstash && \ + tar -zxf /tmp/logstash.tar.gz -C /usr/share && \ + mv /usr/share/logstash-9.4.5 /usr/share/logstash && \ + chown -R logstash:root /usr/share/logstash && \ + chmod -R g=u /usr/share/logstash && \ + mkdir /licenses && \ + mv /usr/share/logstash/NOTICE.TXT /licenses/NOTICE.TXT && \ + mv /usr/share/logstash/LICENSE.txt /licenses/LICENSE.txt && \ + find /usr/share/logstash -type d -exec chmod g+s {} \; && \ + ln -s /usr/share/logstash /opt/logstash + +COPY --from=build --chown=logstash:root /tmp/logstash/docker/data/logstash/env2yaml/classes /usr/share/logstash/env2yaml/classes/ +COPY --from=build --chown=logstash:root /tmp/logstash/docker/data/logstash/env2yaml/lib /usr/share/logstash/env2yaml/lib/ +COPY --from=build --chmod=0755 /tmp/logstash/docker/data/logstash/env2yaml/env2yaml /usr/local/bin/env2yaml +COPY --from=build --chown=logstash:root /tmp/logstash/docker/data/logstash/config/pipelines.yml /usr/share/logstash/config/pipelines.yml +COPY --from=build --chown=logstash:root /tmp/logstash/docker/data/logstash/config/log4j2.properties /usr/share/logstash/config/log4j2.properties +COPY --from=build --chown=logstash:root /tmp/logstash/docker/data/logstash/config/log4j2.file.properties /usr/share/logstash/config/log4j2.file.properties +COPY --from=build --chown=logstash:root /tmp/logstash/docker/data/logstash/config/logstash-oss.yml /usr/share/logstash/config/logstash.yml +COPY --from=build --chown=logstash:root /tmp/logstash/docker/data/logstash/pipeline/default.conf /usr/share/logstash/pipeline/logstash.conf +COPY --from=build --chmod=0755 /tmp/logstash/docker/data/logstash/bin/docker-entrypoint /usr/local/bin/docker-entrypoint + +WORKDIR /usr/share/logstash + +USER 1000 + +EXPOSE 9600 5044 + +LABEL org.label-schema.build-date="" \ + org.label-schema.license="Apache 2.0" \ + org.label-schema.name="logstash" \ + org.label-schema.schema-version="1.0" \ + org.label-schema.url="https://www.elastic.co/products/logstash" \ + org.label-schema.vcs-url="https://github.com/elastic/logstash" \ + org.label-schema.vendor="Elastic" \ + org.label-schema.version="9.4.5" \ + org.opencontainers.image.created="" \ + org.opencontainers.image.description="Logstash is a free and open server-side data processing pipeline that ingests data from a multitude of sources, transforms it, and then sends it to your favorite 'stash.'" \ + org.opencontainers.image.licenses="Apache 2.0" \ + org.opencontainers.image.title="logstash" \ + org.opencontainers.image.vendor="Elastic" \ + org.opencontainers.image.version="9.4.5" \ + description="Logstash is a free and open server-side data processing pipeline that ingests data from a multitude of sources, transforms it, and then sends it to your favorite 'stash.'" \ + license="Apache 2.0" \ + maintainer="info@elastic.co" \ + name="logstash" \ + summary="Logstash is a free and open server-side data processing pipeline that ingests data from a multitude of sources, transforms it, and then sends it to your favorite 'stash.'" \ + vendor="Elastic" + +ENTRYPOINT ["/usr/local/bin/docker-entrypoint"] + diff --git a/l/logstash/assemble-tar-oss-withoutjdk.patch b/l/logstash/assemble-tar-oss-withoutjdk.patch new file mode 100644 index 0000000000..64a55c916e --- /dev/null +++ b/l/logstash/assemble-tar-oss-withoutjdk.patch @@ -0,0 +1,55 @@ +diff --git a/build.gradle b/build.gradle +index a41412bce..1e0812575 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -466,6 +466,22 @@ tasks.register("artifactDockerObservabilitySRE") { + } + } + ++tasks.register("assembleTarDistributionOssWithoutJdk") { ++ dependsOn bootstrap ++ inputs.files fileTree("${projectDir}/rakelib") ++ inputs.files fileTree("${projectDir}/bin") ++ inputs.files fileTree("${projectDir}/config") ++ inputs.files fileTree("${projectDir}/lib") ++ inputs.files fileTree("${projectDir}/modules") ++ inputs.files fileTree("${projectDir}/logstash-core-plugin-api") ++ inputs.files fileTree("${projectDir}/logstash-core/lib") ++ inputs.files fileTree("${projectDir}/logstash-core/src") ++ outputs.files file("${buildDir}/logstash-oss-${project.version}-SNAPSHOT.tar.gz") ++ doLast { ++ rake(projectDir, buildDir, 'artifact:oss_no_bundle_jdk_tar') ++ } ++} ++ + tasks.register("assembleTarDistribution") { + dependsOn bootstrap + dependsOn "copyAllJdks" +diff --git a/rakelib/artifacts.rake b/rakelib/artifacts.rake +index 75dea5878..290d5a59d 100644 +--- a/rakelib/artifacts.rake ++++ b/rakelib/artifacts.rake +@@ -223,9 +223,9 @@ namespace "artifact" do + end + + # Create an archive pack using settings appropriate for the running machine +- def create_local_archive_pack(bundle_jdk) ++ def create_local_archive_pack(bundle_jdk, license = 'ELASTIC-LICENSE', tar_suffix = nil, exclude_paths = default_exclude_paths) + @bundles_jdk = bundle_jdk +- build_tar('ELASTIC-LICENSE') ++ build_tar(license, tar_suffix, exclude_paths) + end + + desc "Build a not JDK bundled tar.gz of default logstash plugins with all dependencies" +@@ -233,6 +233,11 @@ namespace "artifact" do + create_local_archive_pack(false) + end + ++ desc "Build a not JDK bundled OSS tar.gz of default logstash plugins with all dependencies" ++ task "oss_no_bundle_jdk_tar" => ["prepare-oss", "generate_build_metadata"] do ++ create_local_archive_pack(false, 'APACHE-LICENSE-2.0', "-oss", oss_exclude_paths) ++ end ++ + desc "Build a JDK bundled tar.gz of default logstash plugins with all dependencies" + task "bundle_jdk_tar" => ["prepare", "generate_build_metadata"] do + create_local_archive_pack(true) diff --git a/l/logstash/build_info.json b/l/logstash/build_info.json index 52a1a62df5..a29a25df64 100644 --- a/l/logstash/build_info.json +++ b/l/logstash/build_info.json @@ -1,20 +1,43 @@ { - "maintainer": "Sapana-Khemkar", + "maintainer": "prachi.gaonkar@ibm.com", "package_name": "logstash", "github_url": "https://github.com/elastic/logstash.git", - "version": "v8.11.3", + "version": "v9.4.5", "default_branch": "main", - "build_script": "logstash_8.11.3_ubi_8.9.sh", + "build_script": "logstash_oss_9.4.5_ubi9.8.sh", "package_dir": "l/logstash/", "validate_build_script": true, "use_non_root_user": false, "docker_build": true, "docker_cmd": "docker build -t ${package_name}:$PACKAGE_VERSION ${dir}", - "v*.*.*": { + "v9.4.5": { + "dir": "9.4.5_ubi_9.8", + "patches": { + "PATCH": "https://raw.githubusercontent.com/ppc64le/build-scripts/master/l/logstash/logstash_v9.4.5.patch" + }, + "build_script": "logstash_oss_9.4.5_ubi9.8.sh" + }, + "v8.11.3": { "dir": "8.11.3_ubi_8", "patches": { "PATCH": "https://raw.githubusercontent.com/ppc64le/build-scripts/master/l/logstash/assemble-tar-withoutjdk.patch" }, "build_script": "logstash_8.11.3_ubi_8.9.sh" + }, + "v7.6.0": { + "dir": "7.6.0_centos_7", + "patches": { + "PATCH": "https://raw.githubusercontent.com/ppc64le/build-scripts/master/l/logstash/assemble-tar-withoutjdk.patch" + }, + "build_script": "logstash_7.6.0_rhel_7.6" + }, + "v7.11.2": { + "build_script": "logstash_7.11.2_centos_7.sh" + }, + "v7.11.0": { + "build_script": "logstash_7.11.0_rhel_7.9.sh" + }, + "v6.7.2": { + "build_script": "logstash_6.5.4_ubuntu_18.04.sh" } -} \ No newline at end of file +} diff --git a/l/logstash/logstash_oss_9.4.5_ubi9.8.sh b/l/logstash/logstash_oss_9.4.5_ubi9.8.sh new file mode 100644 index 0000000000..1a83456053 --- /dev/null +++ b/l/logstash/logstash_oss_9.4.5_ubi9.8.sh @@ -0,0 +1,220 @@ +#!/bin/bash -e +# ----------------------------------------------------------------------------- +# +# Package : logstash +# Version : v9.4.5 +# Source repo : https://github.com/elastic/logstash +# Tested on : UBI 9.8 +# Ci-Check : True +# Language : Java, Ruby +# Script License: Apache License Version 2.0 +# Maintainer : Prachi Gaonkar +# +# Disclaimer: This script has been tested in root mode on given +# ========== platform using the mentioned version of the package. +# It may not work as expected with newer versions of the +# package and/or distribution. In such case, please +# contact "Maintainer" of this script. +# +# ---------------------------------------------------------------------------- + +SCRIPT_PACKAGE_VERSION=v9.4.5 +PACKAGE_NAME=logstash +PACKAGE_VERSION=${1:-${SCRIPT_PACKAGE_VERSION}} +PACKAGE_URL=https://github.com/elastic/logstash +WORKDIR=$(pwd) +REPO_DIR="$WORKDIR/$PACKAGE_NAME" +SCRIPT_PATH=$(dirname $(realpath $0)) + + +# Strip the leading 'v' to get the bare semver used in artifact filenames. +VERSION="${PACKAGE_VERSION#v}" + +OS_VERSION=$(grep ^VERSION_ID /etc/os-release | cut -d= -f2 | cut -d\" -f2) +echo "RHEL VERSION is $OS_VERSION" + +# ── 1. System dependencies ──────────────────────────────────────────────────── +yum -y update && yum install -y \ + git procps yum-utils wget ncurses make gcc-c++ libffi-devel \ + java-21-openjdk java-21-openjdk-devel java-21-openjdk-headless + +# bison and readline-devel are not in UBI9; pull from the official CentOS Stream 9 mirrors +rpm --import https://www.centos.org/keys/RPM-GPG-KEY-CentOS-Official + +cat > /etc/yum.repos.d/cs9-appstream.repo << 'EOF' +[cs9-appstream] +name=CentOS Stream 9 - AppStream +baseurl=https://mirror.stream.centos.org/9-stream/AppStream/ppc64le/os/ +gpgcheck=1 +gpgkey=https://www.centos.org/keys/RPM-GPG-KEY-CentOS-Official +enabled=1 +EOF + +cat > /etc/yum.repos.d/cs9-baseos.repo << 'EOF' +[cs9-baseos] +name=CentOS Stream 9 - BaseOS +baseurl=https://mirror.stream.centos.org/9-stream/BaseOS/ppc64le/os/ +gpgcheck=1 +gpgkey=https://www.centos.org/keys/RPM-GPG-KEY-CentOS-Official +enabled=1 +EOF + +yum install -y bison readline-devel + +# ── 2. Java environment ─────────────────────────────────────────────────────── +export JAVA_HOME=/usr/lib/jvm/java-21-openjdk +export PATH=$JAVA_HOME/bin:$PATH + +# ── 3. Clone and checkout ───────────────────────────────────────────────────── +cd "${WORKDIR}" + +if ! git clone "${PACKAGE_URL}" "${PACKAGE_NAME}"; then + echo "------------------${PACKAGE_NAME}:clone_fails---------------------------------------" + echo "${PACKAGE_URL} ${PACKAGE_NAME}" + echo "${PACKAGE_NAME} | ${PACKAGE_URL} | ${PACKAGE_VERSION} | ${OS_NAME} | GitHub | Fail | Clone_Fails" + exit 1 +fi + +cd "${PACKAGE_NAME}" +git checkout "${PACKAGE_VERSION}" +git apply --ignore-whitespace "${SCRIPT_PATH}/${PACKAGE_NAME}_${SCRIPT_PACKAGE_VERSION}.patch" + +# ── 4. Install RVM and Ruby (version pinned by .ruby-version in the repo) ───── +curl -sSL https://rvm.io/mpapis.asc | gpg2 --import - +curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import - +curl -L https://get.rvm.io | bash -s stable --ruby=$(cat .ruby-version) +source /etc/profile.d/rvm.sh + +rvm --version +ruby --version + +# ── 5. Install rake and bundler ─────────────────────────────────────────────── +# Disable JVM TLS session cache to avoid SSLError on ppc64le with JRuby: +# "No new session is allowed and no existing session can be resumed" +export JAVA_TOOL_OPTIONS="-Djdk.tls.client.sessionCacheSize=0 -Djdk.tls.useExtendedMasterSecret=false" +gem install rake +gem install bundler +unset JAVA_TOOL_OPTIONS + +rake --version +bundle -v + +# ── 6. Build: install OSS dependencies via Gradle ──────────────────────────── +# GRADLE_OPTS: disable JVM TLS session cache to avoid SSLError during gem downloads on ppc64le +export OSS=true +export LOGSTASH_SOURCE=1 +export LOGSTASH_PATH=$WORKDIR/$PACKAGE_NAME +export ARCH=ppc64le +export GRADLE_OPTS="-Djdk.tls.client.sessionCacheSize=0 -Djdk.tls.useExtendedMasterSecret=false" + +if ! ./gradlew installDevelopmentGems; then + echo "------------------${PACKAGE_NAME}:install_dev_gems_fails------------------------------" + echo "${PACKAGE_NAME} | ${PACKAGE_URL} | ${PACKAGE_VERSION} | GitHub | Fail | InstallDevelopmentGems_Fails" + exit 1 +fi +echo "------------------${PACKAGE_NAME}:install_dev_gems_success------------------------------" + +if ! ./gradlew installDefaultGems; then + echo "------------------${PACKAGE_NAME}:install_default_gems_fails-------------------------" + echo "${PACKAGE_NAME} | ${PACKAGE_URL} | ${PACKAGE_VERSION} | GitHub | Fail | InstallDefaultGems_Fails" + exit 1 +fi +echo "------------------${PACKAGE_NAME}:install_default_gems_success-------------------------" + +# copyAllJdks downloads the ppc64le Temurin JDK into jdk-linux-ppc64le/ and +# writes JDK_VERSION — both are required by artifact:archives_oss at tar time. +if ! ./gradlew copyAllJdks; then + echo "------------------${PACKAGE_NAME}:copy_all_jdks_fails--------------------------------" + echo "${PACKAGE_NAME} | ${PACKAGE_URL} | ${PACKAGE_VERSION} | GitHub | Fail | CopyAllJdks_Fails" + exit 1 +fi +echo "------------------${PACKAGE_NAME}:copy_all_jdks_success--------------------------------" + +# Fallback: write JDK_VERSION if copyAllJdks doLast block did not produce it. +# Both JDK_VERSION and jdk-linux-ppc64le/ are written inside the cloned repo dir. +if [ ! -f "$REPO_DIR/JDK_VERSION" ]; then + JDK_REL="$REPO_DIR/jdk-linux-ppc64le/release" + if [ ! -f "$JDK_REL" ]; then + echo "ERROR: JDK_VERSION missing and $JDK_REL not found" >&2 + exit 1 + fi + grep 'IMPLEMENTOR_VERSION=' "$JDK_REL" | cut -d'"' -f2 > "$REPO_DIR/JDK_VERSION" +fi + +if ! ./gradlew assemble; then + echo "------------------${PACKAGE_NAME}:assemble_fails-------------------------------------" + echo "${PACKAGE_NAME} | ${PACKAGE_URL} | ${PACKAGE_VERSION} | GitHub | Fail | Assemble_Fails" + exit 1 +fi +echo "------------------${PACKAGE_NAME}:assemble_success-------------------------------------" + +# ── 7. Build the OSS tar ────────────────────────────────────────────────────── +# Run as root before the test-user chown, so no ownership restore is needed. +# git safe.directory lets generate_build_metadata call git rev-parse HEAD. +# OSS=true strips x-pack plugins; RELEASE=1 removes the -SNAPSHOT suffix. +# +# Gems are installed into vendor/bundle by Gradle's embedded JRuby, not by the +# RVM ruby. Use the repo's own vendored JRuby (vendor/jruby/bin/jruby) so +# bundler resolves gems from the same gem path Gradle populated. +# Switch Gemfile.lock to the JRuby-specific lock file first (mirrors what the +# Dockerfile does), then run `bundle install` to wire up the vendored gems, +# and finally invoke rake through that same bundler environment. +git config --global --add safe.directory "$REPO_DIR" + +echo "--- Building OSS tar (artifact:archives_oss) ---" +if ! ( + cd "$REPO_DIR" + cp Gemfile.jruby-3.4.lock.release Gemfile.lock + vendor/jruby/bin/jruby -S gem install bundler --no-document + vendor/jruby/bin/jruby -S bundle install --without development test + ARCH=ppc64le BUNDLE_WITHOUT='development:test' RELEASE=1 \ + vendor/jruby/bin/jruby -S bundle exec rake artifact:archives_oss +); then + echo "------------------${PACKAGE_NAME}:oss_tar_build_fails--------------------------------" + echo "${PACKAGE_NAME} | ${PACKAGE_URL} | ${PACKAGE_VERSION} | GitHub | Fail | OssTarBuild_Fails" + exit 1 +fi +echo "------------------${PACKAGE_NAME}:oss_tar_build_success--------------------------------" +echo "OSS tar: $REPO_DIR/build/logstash-oss-${VERSION}-linux-ppc64le.tar.gz" + +# ── 8. Run unit and integration tests as non-root ──────────────────────────── +useradd -m -s /bin/bash logstash-test || true +chown -R logstash-test:logstash-test "$REPO_DIR" +export LS_HEAP_SIZE=2048m + +echo "--- Running unit tests (gradlew test) ---" +if ! su -s /bin/bash logstash-test -c " + export HOME=/home/logstash-test + export JAVA_HOME=$JAVA_HOME + export PATH=$PATH + export OSS=$OSS + export LOGSTASH_SOURCE=$LOGSTASH_SOURCE + export LOGSTASH_PATH=$LOGSTASH_PATH + export ARCH=$ARCH + export LS_HEAP_SIZE=$LS_HEAP_SIZE + cd "$REPO_DIR" && ./gradlew test +"; then + echo "------------------${PACKAGE_NAME}:test_fails-----------------------------------------" + echo "${PACKAGE_NAME} | ${PACKAGE_URL} | ${PACKAGE_VERSION} | GitHub | Fail | Test_Fails" + exit 2 +fi +echo "------------------${PACKAGE_NAME}:test_success-----------------------------------------" + +echo "--- Running check (gradlew check) ---" +if ! su -s /bin/bash logstash-test -c " + export HOME=/home/logstash-test + export JAVA_HOME=$JAVA_HOME + export PATH=$PATH + export OSS=$OSS + export LOGSTASH_SOURCE=$LOGSTASH_SOURCE + export LOGSTASH_PATH=$LOGSTASH_PATH + export ARCH=$ARCH + export LS_HEAP_SIZE=$LS_HEAP_SIZE + cd "$REPO_DIR" && ./gradlew check +"; then + echo "------------------${PACKAGE_NAME}:check_fails----------------------------------------" + echo "${PACKAGE_NAME} | ${PACKAGE_URL} | ${PACKAGE_VERSION} | GitHub | Fail | Check_Fails" + exit 2 +fi +echo "------------------${PACKAGE_NAME}:check_success----------------------------------------" +echo "OSS tar available at : $REPO_DIR/build/logstash-oss-${VERSION}-linux-ppc64le.tar.gz" diff --git a/l/logstash/logstash_v9.4.5.patch b/l/logstash/logstash_v9.4.5.patch new file mode 100644 index 0000000000..93880a005b --- /dev/null +++ b/l/logstash/logstash_v9.4.5.patch @@ -0,0 +1,188 @@ +diff --git a/build.gradle b/build.gradle +index a41412bce..071935672 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -159,7 +159,10 @@ tasks.register("configureArchitecture") { + } else if (arch == "amd64") { + beatsArch="x86_64" + esArch="x86_64" +- } ++ } else if (arch == "ppc64le" || arch == "ppc64") { ++ beatsArch="ppc64le" ++ esArch="ppc64le" ++ } + + project.ext.set("beatsArchitecture", "${osName}-${beatsArch}") + project.ext.set("esArchitecture", "${osName}-${esArch}") +@@ -842,7 +845,9 @@ def selectArch() { + // Matches rake pattern: x86_64 → x86_64, anything else (aarch64, arm64, etc.) → arm64 + String envArch = System.getenv("ARCH") + if (envArch) { +- return (envArch == "x86_64") ? "x86_64" : "arm64" ++ if (envArch == "x86_64") return "x86_64" ++ if (envArch == "ppc64le" || envArch == "ppc64") return "ppc64le" ++ return "arm64" + } + // 3. Fall back to host architecture + String cpu_arch = System.properties["os.arch"] +@@ -853,6 +858,9 @@ def selectArch() { + case "aarch64": + case "arm64": + return "arm64" ++ case "ppc64le": ++ case "ppc64": ++ return "ppc64le" + default: + throw new IllegalArgumentException("Can't handle os.arch of type $cpu_arch") + } +@@ -889,6 +897,16 @@ class JDKDetails { + } + + String createDownloadUrl() { ++ // ppc64le is not listed in the Elastic JVM catalog; fetch directly from Adoptium GitHub releases. ++ // URL pattern: https://github.com/adoptium/temurin-binaries/releases/download/ ++ // jdk-%2B/OpenJDKU-jdk_ppc64le_linux_hotspot__.tar.gz ++ // e.g. for 21.0.12+8 → jdk-21.0.12%2B8/OpenJDK21U-jdk_ppc64le_linux_hotspot_21.0.12_8.tar.gz ++ if (arch == "ppc64le") { ++ def ver = "${revision}_${build}" ++ return "https://github.com/adoptium/temurin${major}-binaries/releases/download/" + ++ "jdk-${revision}%2B${build}/" + ++ "OpenJDK${major}U-jdk_ppc64le_linux_hotspot_${ver}.tar.gz" ++ } + return createElasticCatalogDownloadUrl() + } + +@@ -969,7 +987,7 @@ class JDKDetails { + } + } + +- def requestedArtifact = "adoptiumjdk-${revision}+${build}-${osName}${arch == "aarch64" ? "-${arch}" : ""}" ++ def requestedArtifact = "adoptiumjdk-${revision}+${build}-${osName}${(arch != 'x64') ? "-${arch}" : ""}" + if (lastResponseCode == 404) { + throw new GradleException("Elastic JVM catalog returned 404 for ${requestedArtifact}. Verify the artifact exists.", lastException) + } +@@ -1008,6 +1026,10 @@ class JDKDetails { + case "x86_64": + return "x64" + break ++ case "ppc64le": ++ case "ppc64": ++ return "ppc64le" ++ break + case "arm64": + return "aarch64" + break +@@ -1035,15 +1057,18 @@ def getTargetPlatforms() { + String arch = selectArch() + if (arch == "x86_64") { + return [[os: "linux", arch: "x86_64"], [os: "windows", arch: "x86_64"], [os: "darwin", arch: "x86_64"]] ++ } else if (arch == "ppc64le") { ++ return [[os: "linux", arch: "ppc64le"]] + } else { + return [[os: "linux", arch: "arm64"], [os: "darwin", arch: "arm64"]] + } + } + + ["linux", "windows", "darwin"].each { osName -> +- ["x86_64", "arm64"].each { archName -> ++ ["x86_64", "arm64", "ppc64le"].each { archName -> + if (osName == "windows" && archName == "arm64") { return } +- String taskSuffix = "${osName.capitalize()}${archName == 'x86_64' ? 'X64' : 'Arm64'}" ++ if ((osName == "darwin" || osName == "windows") && archName == "ppc64le") { return } ++ String taskSuffix = "${osName.capitalize()}${archName == 'x86_64' ? 'X64' : archName == 'ppc64le' ? 'Ppc64le' : 'Arm64'}" + String jdkFolderName = ToolingUtils.jdkFolderName(osName, archName) + + tasks.register("downloadJdk${taskSuffix}", Download) { +@@ -1087,7 +1112,7 @@ def getTargetPlatforms() { + tasks.register("copyAllJdks") { + dependsOn bootstrap + getTargetPlatforms().each { platform -> +- String taskSuffix = "${platform.os.capitalize()}${platform.arch == 'x86_64' ? 'X64' : 'Arm64'}" ++ String taskSuffix = "${platform.os.capitalize()}${platform.arch == 'x86_64' ? 'X64' : platform.arch == 'ppc64le' ? 'Ppc64le' : 'Arm64'}" + dependsOn "unpackJdk${taskSuffix}" + } + doLast { +diff --git a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/ToolingUtils.groovy b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/ToolingUtils.groovy +index 07bda35ec..bcea7babb 100644 +--- a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/ToolingUtils.groovy ++++ b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/ToolingUtils.groovy +@@ -2,7 +2,7 @@ package org.logstash.gradle.tooling + + class ToolingUtils { + static String jdkFolderName(String osName, String arch) { +- String normalizedArch = (arch == "x86_64" || arch == "amd64") ? "x64" : "arm64" ++ String normalizedArch = (arch == "x86_64" || arch == "amd64") ? "x64" : (arch == "ppc64le" || arch == "ppc64") ? "ppc64le" : "arm64" + return "jdk-${osName}-${normalizedArch}" + } + } +diff --git a/logstash-core/lib/logstash/agent.rb b/logstash-core/lib/logstash/agent.rb +index c16b47ec9..901d7f945 100644 +--- a/logstash-core/lib/logstash/agent.rb ++++ b/logstash-core/lib/logstash/agent.rb +@@ -685,7 +685,7 @@ class LogStash::Agent + database_metric = LogStash::GeoipDatabaseManagement::Metric.new(geoip_metric) + database_manager = LogStash::GeoipDatabaseManagement::Manager.instance + database_manager.database_metric = database_metric +- rescue LoadError => e ++ rescue LoadError, ArgumentError => e + @logger.trace("DatabaseManager is not in classpath", exception: e.message, backtrace: e.backtrace) + end + end +diff --git a/logstash-core/spec/logstash/api/commands/default_metadata_spec.rb b/logstash-core/spec/logstash/api/commands/default_metadata_spec.rb +index 9fe73b1e9..57caaa607 100644 +--- a/logstash-core/spec/logstash/api/commands/default_metadata_spec.rb ++++ b/logstash-core/spec/logstash/api/commands/default_metadata_spec.rb +@@ -55,6 +55,7 @@ describe LogStash::Api::Commands::DefaultMetadata do + end + + it "check monitoring section exist when legacy monitoring is enabled and allowed" do ++ skip "xpack.monitoring settings not registered in OSS mode" unless LogStash::SETTINGS.registered?("xpack.monitoring.allow_legacy_collection") + LogStash::SETTINGS.set_value("xpack.monitoring.allow_legacy_collection", true) + LogStash::SETTINGS.set_value("xpack.monitoring.enabled", true) + expect(report.keys).to include( +@@ -63,6 +64,7 @@ describe LogStash::Api::Commands::DefaultMetadata do + end + + it "check monitoring section does not appear when legacy monitoring is not allowed but enabled" do ++ skip "xpack.monitoring settings not registered in OSS mode" unless LogStash::SETTINGS.registered?("xpack.monitoring.allow_legacy_collection") + LogStash::SETTINGS.set_value("xpack.monitoring.allow_legacy_collection", false) + LogStash::SETTINGS.set_value("xpack.monitoring.enabled", true) + expect(report.keys).not_to include( +diff --git a/rakelib/artifacts.rake b/rakelib/artifacts.rake +index 75dea5878..2efdd1381 100644 +--- a/rakelib/artifacts.rake ++++ b/rakelib/artifacts.rake +@@ -26,12 +26,14 @@ namespace "artifact" do + ARCH = case ENV["ARCH"] + when "x86_64" + "x86_64" ++ when "ppc64le", "ppc64" ++ "ppc64le" + else + "arm64" # default for aarch64, arm64, or any other value (including nil) + end + + def jdk_folder_for_platform(os_name, arch) +- normalized_arch = (arch == "x86_64" || arch == "amd64") ? "x64" : "arm64" ++ normalized_arch = (arch == "x86_64" || arch == "amd64") ? "x64" : (arch == "ppc64le" || arch == "ppc64") ? "ppc64le" : "arm64" + "jdk-#{os_name}-#{normalized_arch}" + end + +@@ -184,6 +186,8 @@ namespace "artifact" do + @bundles_jdk = true + if ARCH == "x86_64" + create_archive_pack(license_details, "x86_64", "linux", "windows", "darwin") ++ elsif ARCH == "ppc64le" ++ create_archive_pack(license_details, "ppc64le", "linux") + else + create_archive_pack(license_details, "arm64", "linux", "darwin") + end +@@ -245,6 +249,8 @@ namespace "artifact" do + license_details = ['APACHE-LICENSE-2.0', "-oss", oss_exclude_paths] + if ARCH == "x86_64" + create_archive_pack(license_details, "x86_64", "linux", "windows", "darwin") ++ elsif ARCH == "ppc64le" ++ create_archive_pack(license_details, "ppc64le", "linux") + else + create_archive_pack(license_details, "arm64", "linux", "darwin") + end