From d8509ab427ff5b1db31355e5928f4850767689d9 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Mon, 21 Sep 2026 23:49:52 +0200 Subject: [PATCH] THRIFT-6349: Drop the ubuntu-focal build image Client: build Ubuntu 20.04 left standard support on 2025-05-31, and ppa:ondrej/php no longer publishes packages for focal, so the image could not be built: its PHP step failed for every PHP version. No CI job builds the images under build/docker, so nothing noticed. Remove build/docker/ubuntu-focal, and drop focal from the docker README: its column in the version tables, the python2 row that only focal had, and the Supported Containers list. Jammy, now the oldest image, becomes the default in the README examples, .travis.yml and the comment in build-cpan-dist.sh. .travis.yml also loses its focal docker and autotools jobs; Travis CI no longer reports on this repository. Co-Authored-By: Claude Opus 5 (1M context) --- .travis.yml | 15 +- build/docker/README.md | 99 +++++---- build/docker/ubuntu-focal/Dockerfile | 304 --------------------------- lib/perl/build-cpan-dist.sh | 2 +- 4 files changed, 51 insertions(+), 369 deletions(-) delete mode 100644 build/docker/ubuntu-focal/Dockerfile diff --git a/.travis.yml b/.travis.yml index 0d1a11a1d0d..d5bf1601c48 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,7 +26,7 @@ sudo: required # https://docs.travis-ci.com/user/reference/linux -dist: focal +dist: jammy language: cpp services: @@ -47,7 +47,7 @@ env: - SCRIPT="cmake.sh" - BUILD_ARG="" - BUILD_ENV="-e CC=gcc -e CXX=g++ -e THRIFT_CROSSTEST_CONCURRENCY=4" - - DISTRO=ubuntu-focal + - DISTRO=ubuntu-jammy - BUILD_LIBS="CPP C_GLIB JAVA PYTHON TESTING TUTORIALS" # only meaningful for CMake builds - TRAVIS_BUILD_STAGE=test # DOCKER_REPO (this works for all builds as a source for docker images - you can override for fork builds in your Travis settings) @@ -58,11 +58,6 @@ env: jobs: include: # ========================= stage: docker ========================= - - script: true - env: - - JOB="Docker Build ubuntu-focal 20.04 LTS" - - DISTRO=ubuntu-focal - - TRAVIS_BUILD_STAGE=docker - script: true env: - JOB="Docker Build ubuntu-jammy 22.04 LTS" @@ -124,12 +119,6 @@ jobs: # - DISTRO=ubuntu-jammy # - SCRIPT="autotools.sh" - - script: build/docker/run.sh - env: - - JOB="Autotools (Ubuntu Focal)" - - DISTRO=ubuntu-focal - - SCRIPT="autotools.sh" - # ------------------------- phase: cmake ------------------------ - script: build/docker/run.sh env: diff --git a/build/docker/README.md b/build/docker/README.md index f7c8b1289c2..cedfd9423fa 100644 --- a/build/docker/README.md +++ b/build/docker/README.md @@ -20,12 +20,12 @@ logic to determine their behavior: | Variable | Default | Usage | | -------- | ----- | ------- | -| `DISTRO` | `ubuntu-focal` | Set by various build jobs in `.travis.yml` to run builds in different containers. Not intended to be set externally.| +| `DISTRO` | `ubuntu-jammy` | Set by various build jobs in `.travis.yml` to run builds in different containers. Not intended to be set externally.| | `DOCKER_REPO` | `thrift/thrift-build` | The name of the Docker Hub repository to obtain and store docker images. | | `DOCKER_USER` | `` | The Docker Hub account name containing the repository. | | `DOCKER_PASS` | `` | The Docker Hub account password to use when pushing new tags. | -For example, the default docker image that is used in builds if no overrides are specified would be: `thrift/thrift-build:ubuntu-focal` +For example, the default docker image that is used in builds if no overrides are specified would be: `thrift/thrift-build:ubuntu-jammy` ### Forks ### @@ -46,13 +46,11 @@ Docker Hub and push the resulting tags. ## Supported Containers ## -The Travis CI (continuous integration) builds use the Ubuntu Noble (24.04 LTS), -Jammy (22.04 LTS) and Focal (20.04 LTS) images to maximize language level -coverage. +The Travis CI (continuous integration) builds use the Ubuntu Noble (24.04 LTS) +and Jammy (22.04 LTS) images to maximize language level coverage. ### Ubuntu ### -* focal (stable) * jammy (stable) * noble (next stable) @@ -105,16 +103,16 @@ Then, to pull down the current image being used to build (the same way Travis CI does it) - if it is out of date in any way it will build a new one for you: - thrift$ DOCKER_REPO=thrift/thrift-build DISTRO=ubuntu-focal build/docker/refresh.sh + thrift$ DOCKER_REPO=thrift/thrift-build DISTRO=ubuntu-jammy build/docker/refresh.sh To run all unit tests (just like Travis CI does): - thrift$ dockerrun thrift/thrift-build:ubuntu-focal + thrift$ dockerrun thrift/thrift-build:ubuntu-jammy root@8caf56b0ce7b:/thrift/src# build/docker/scripts/autotools.sh To run the cross tests (just like Travis CI does): - thrift$ dockerrun thrift/thrift-build:ubuntu-focal + thrift$ dockerrun thrift/thrift-build:ubuntu-jammy root@8caf56b0ce7b:/thrift/src# build/docker/scripts/cross-test.sh When you are done, you want to clean up occasionally so that docker isn't using lots of extra disk space: @@ -153,48 +151,47 @@ Open a command prompt in the image: Last updated: May 2, 2026 -| Tool | ubuntu-focal | ubuntu-jammy | ubuntu-noble | Notes | -| :-------- | :------------ | :------------ | :------------ | :---- | -| ant | 1.10.7 | 1.10.12 | | | -| autoconf | 2.69 | 2.71 | | | -| automake | 1.16.1 | 1.16.5 | | | -| bison | 3.5.1 | 3.8.2 | | | -| boost | 1.71.0 | 1.74.0 | | | -| cmake | 3.16.3 | 3.22.1 | | | -| cppcheck | 1.90 | 2.7 | | | -| flex | 2.6.4 | 2.6.4 | | | -| libc6 | 2.31 | 2.35 | | glibc | -| libevent | 2.0.16 | 2.0.16 | | | -| libstdc++ | 10.5.0 | 10.5.0 | | | -| make | 4.2.1 | 4.3 | | | -| openssl | 1.1.1f | 3.0.2 | | | -| qt5 | 5.12.8 | 5.15.3 | | | +| Tool | ubuntu-jammy | ubuntu-noble | Notes | +| :-------- | :------------ | :------------ | :---- | +| ant | 1.10.12 | | | +| autoconf | 2.71 | | | +| automake | 1.16.5 | | | +| bison | 3.8.2 | | | +| boost | 1.74.0 | | | +| cmake | 3.22.1 | | | +| cppcheck | 2.7 | | | +| flex | 2.6.4 | | | +| libc6 | 2.35 | | glibc | +| libevent | 2.0.16 | | | +| libstdc++ | 10.5.0 | | | +| make | 4.3 | | | +| openssl | 3.0.2 | | | +| qt5 | 5.15.3 | | | ## Compiler/Language Versions per Dockerfile ## -| Tool | ubuntu-focal | ubuntu-jammy | ubuntu-noble | Notes | -| :-------- | :------------ | :------------ | :------------ | :---- | -| as of | Mar 06, 2018 | Jul 1, 2019 | | | -| C++ gcc | 9.4.0 | 11.4.0 | | | -| C++ clang | 13.0.0 | 13.0.0 | | | -| c\_glib | 3.2.12 | 3.2.12 | | | -| cl (sbcl) | | 1.5.3 | | | -| d | 2.087.0 | 2.087.0 | | | -| dart | 2.7.2-1 | 2.7.2-1 | | | -| delphi | | | | Not in CI | -| erlang | OTP-25.3.2.9 | OTP-25.3.2.9 | | | -| go | 1.21.7 | 1.21.7 | | | -| haxe | 4.2.1 | 4.2.1 | | | -| java | 17 | 17 | | | -| js | Node.js 16.20.2, npm 8.19.4 | | | Node.js 16.20.2, npm 8.19.4 | -| lua | 5.2.4 | 5.2.4 | | Lua 5.3: see THRIFT-4386 | -| netstd | 9.0 | 9.0 | 9.0 | | -| nodejs | 16.20.2 | 16.20.2 | | | -| ocaml | 4.08.1 | 4.13.1 | | | -| perl | 5.30.0 | 5.34.0 | | | -| php | 8.2 (ondrej) | 8.2 (ondrej) | 8.3 | focal & jammy pull 8.2 from ppa:ondrej/php | -| python2 | 2.7.18 | | | | -| python3 | 3.8.10 | 3.10.12 | | | -| ruby | 2.7.0p0 | 3.0.2p107 | | | -| rust | 1.83.0 | 1.83.0 | | | -| smalltalk | | | | Not in CI | +| Tool | ubuntu-jammy | ubuntu-noble | Notes | +| :-------- | :------------ | :------------ | :---- | +| as of | Jul 1, 2019 | | | +| C++ gcc | 11.4.0 | | | +| C++ clang | 13.0.0 | | | +| c\_glib | 3.2.12 | | | +| cl (sbcl) | 1.5.3 | | | +| d | 2.087.0 | | | +| dart | 2.7.2-1 | | | +| delphi | | | Not in CI | +| erlang | OTP-25.3.2.9 | | | +| go | 1.21.7 | | | +| haxe | 4.2.1 | | | +| java | 17 | | | +| js | | | Node.js 16.20.2, npm 8.19.4 | +| lua | 5.2.4 | | Lua 5.3: see THRIFT-4386 | +| netstd | 9.0 | 9.0 | | +| nodejs | 16.20.2 | | | +| ocaml | 4.13.1 | | | +| perl | 5.34.0 | | | +| php | 8.2 (ondrej) | 8.3 | jammy pulls 8.2 from ppa:ondrej/php | +| python3 | 3.10.12 | | | +| ruby | 3.0.2p107 | | | +| rust | 1.83.0 | | | +| smalltalk | | | Not in CI | diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile deleted file mode 100644 index 5402c215805..00000000000 --- a/build/docker/ubuntu-focal/Dockerfile +++ /dev/null @@ -1,304 +0,0 @@ -# Licensed 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. - -# -# Apache Thrift Docker build environment for Ubuntu Focal -# with some updated packages. -# - -FROM buildpack-deps:focal-scm -LABEL MAINTAINER="Apache Thrift " -ENV DEBIAN_FRONTEND=noninteractive - -### Add apt repos - -RUN apt-get update -yq && \ - apt-get dist-upgrade -y && \ - apt-get install -y --no-install-recommends --fix-missing \ - apt \ - apt-transport-https \ - apt-utils \ - curl \ - dirmngr \ - software-properties-common \ - wget - -# Create a user -ARG user=build -ARG group=build -ARG uid=1000 -ARG gid=1000 - -RUN apt-get install -y --no-install-recommends sudo && \ - echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \ - if [ -z `cat /etc/group | grep "${group}:"` ] && [ -z `cat /etc/group | grep ":${gid}:"` ]; then addgroup --gid ${gid} ${group}; fi && \ - if [ -z `cat /etc/passwd | grep "${user}:"` ] && [ -z `cat /etc/passwd | grep ":${uid}:"` ]; then adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos ""; fi && \ - echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ - mkdir -p /home/${user} && \ - chown -R ${user}:${group} /home/${user} - -# Dart -RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ - curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \ - /etc/apt/sources.list.d/dart_stable.list - -# dotnet (netcore) -RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \ - wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/20.04/prod.list && \ - chown root:root /etc/apt/trusted.gpg.d/microsoft.gpg && \ - chown root:root /etc/apt/sources.list.d/microsoft-prod.list - -# node.js -RUN mkdir -p /etc/apt/keyrings && \ - curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \ - echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list - -### install general dependencies -RUN apt-get update -yq && \ - apt-get install -y --no-install-recommends \ - `# General dependencies` \ - bash-completion \ - bison \ - build-essential \ - clang \ - cmake \ - debhelper \ - flex \ - gdb \ - libasound2 \ - libatk-bridge2.0-0 \ - libgtk-3-0 \ - llvm \ - ninja-build \ - pkg-config \ - unzip \ - valgrind \ - vim -ENV PATH=/usr/lib/llvm-6.0/bin:$PATH - -# TODO: "apt-get install" without "apt-get update" in the same "RUN" step can cause cache issues if modified later. -# See https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run -RUN apt-get install -y --no-install-recommends \ - `# C++ dependencies` \ - libboost-all-dev \ - libevent-dev \ - libssl-dev \ - qt5-default \ - qtbase5-dev \ - qtbase5-dev-tools - -ENV SBCL_VERSION=1.5.3 -RUN \ - `# Common Lisp (sbcl) dependencies` \ - curl --version && \ - curl -o sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 -J -L https://sourceforge.net/projects/sbcl/files/sbcl/${SBCL_VERSION}/sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2/download?use_mirror=managedway# && \ - tar xjf sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 && \ - cd sbcl-${SBCL_VERSION}-x86-64-linux && \ - ./install.sh && \ - sbcl --version && \ - cd .. && \ - rm -rf sbcl* - -ENV D_VERSION=2.087.0 -ENV DMD_DEB=dmd_2.087.0-0_amd64.deb -RUN \ - `# D dependencies` \ - wget -q http://downloads.dlang.org/releases/2.x/${D_VERSION}/${DMD_DEB} && \ - dpkg --install ${DMD_DEB} && \ - rm -f ${DMD_DEB} && \ - mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \ - git clone -b 'v2.0.2+2.0.16' https://github.com/D-Programming-Deimos/libevent.git deimos-libevent-2.0 && \ - mv deimos-libevent-2.0/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv deimos-libevent-2.0/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf deimos-libevent-2.0 && \ - git clone -b 'v2.0.0+1.1.0h' https://github.com/D-Programming-Deimos/openssl.git deimos-openssl-1.1.0h && \ - mv deimos-openssl-1.1.0h/deimos/* /usr/include/dmd/druntime/import/deimos/ && \ - mv deimos-openssl-1.1.0h/C/* /usr/include/dmd/druntime/import/C/ && \ - rm -rf deimos-openssl-1.1.0h - -ENV DART_VERSION=3.13.3-1 -RUN apt-get install -y --no-install-recommends \ - `# Dart dependencies` \ - dart=$DART_VERSION -ENV PATH=/usr/lib/dart/bin:$PATH - -# Because Ubuntu 20.04 turned EOL in April/May 2025, Microsoft does not support .NET 9 or higher on that platform -RUN apt-get install -y --no-install-recommends \ - `# dotnet core dependencies` \ - dotnet-sdk-8.0 \ - dotnet-runtime-8.0 \ - aspnetcore-runtime-8.0 \ - dotnet-apphost-pack-8.0 - -# Erlang dependencies -ARG ERLANG_OTP_VERSION=23.3.4.11 -ARG ERLANG_REBAR_VERSION=3.18.0 -RUN apt-get update && apt-get install -y --no-install-recommends libncurses5-dev && \ - curl -ssLo /usr/local/bin/kerl https://raw.githubusercontent.com/kerl/kerl/master/kerl && chmod +x /usr/local/bin/kerl && \ - kerl build $ERLANG_OTP_VERSION && kerl install $ERLANG_OTP_VERSION /usr/local/lib/otp/ && . /usr/local/lib/otp/activate && \ - curl -ssLo /usr/local/bin/rebar3 https://github.com/erlang/rebar3/releases/download/${ERLANG_REBAR_VERSION}/rebar3 && chmod +x /usr/local/bin/rebar3 && \ - rebar3 --version -ENV PATH=/usr/local/lib/otp/bin:$PATH - -RUN apt-get install -y --no-install-recommends \ - `# GlibC dependencies` \ - libglib2.0-dev - -# golang -ENV GOLANG_VERSION=1.24.3 -ENV GOLANG_DOWNLOAD_URL=https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz -ENV GOLANG_DOWNLOAD_SHA256=3333f6ea53afa971e9078895eaa4ac7204a8c6b5c68c10e6bc9a33e8e391bdd8 -RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \ - echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && \ - tar -C /usr/local -xzf golang.tar.gz && \ - ln -s /usr/local/go/bin/go /usr/local/bin && \ - rm golang.tar.gz - -# HAXE -ARG HAXE_VERSION=4.2.1 -ARG NEKO_VERSION=2.3.0 -RUN cd $HOME && \ - `# Haxe dependencies` && \ - wget https://github.com/HaxeFoundation/haxe/releases/download/${HAXE_VERSION}/haxe-${HAXE_VERSION}-linux64.tar.gz && \ - tar xvf haxe-${HAXE_VERSION}-linux64.tar.gz && \ - rm haxe-${HAXE_VERSION}-linux64.tar.gz && \ - mv haxe_* /opt/haxe && \ - wget https://github.com/HaxeFoundation/neko/releases/download/v`echo ${NEKO_VERSION} | sed "s/\./-/g"`/neko-${NEKO_VERSION}-linux64.tar.gz && \ - tar xvf neko-${NEKO_VERSION}-linux64.tar.gz && \ - rm neko-${NEKO_VERSION}-linux64.tar.gz && \ - mv neko-* /opt/neko -ENV PATH=/opt/haxe:/opt/neko:$PATH -RUN echo "/opt/neko" > /etc/ld.so.conf.d/neko.conf && \ - ldconfig -USER ${user} -RUN mkdir -p $HOME/haxe/lib && \ - haxelib setup --always $HOME/haxe/lib && \ - haxelib install --always hxcpp 2>&1 > /dev/null && \ - haxelib install --always uuid 2>&1 > /dev/null -USER root - -ENV GRADLE_VERSION="8.4" -RUN apt-get install -y --no-install-recommends \ - `# Java dependencies` \ - ant \ - ant-optional \ - maven \ - openjdk-17-jdk-headless && \ - `# Gradle` \ - wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \ - (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \ - unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \ - mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \ - ln -s /usr/local/gradle/bin/gradle /usr/local/bin - -RUN apt-get install -y --no-install-recommends \ - `# Lua dependencies` \ - lua5.3 \ - liblua5.3-dev - -RUN apt-get install -y --no-install-recommends \ - `# Node.js dependencies` \ - nodejs - -# Test dependencies for running puppeteer -RUN apt-get install -y --no-install-recommends \ - `# JS dependencies` \ - libxss1 \ - libxtst6 - -RUN apt-get install -y --no-install-recommends \ - `# OCaml dependencies` \ - ocaml \ - opam && \ - `# disable sandboxing see https://github.com/ocaml/opam/issues/4327` \ - opam init --yes --disable-sandboxing && \ - opam install --yes oasis - -RUN apt-get install -y --no-install-recommends \ - `# Perl dependencies` \ - libbit-vector-perl \ - libclass-accessor-class-perl \ - libcrypt-ssleay-perl \ - libio-socket-ssl-perl \ - libnet-ssleay-perl \ - libtest-exception-perl - -# PHP via Ondřej Surý PPA (focal default is 7.4 which is below our 8.2 floor) -RUN add-apt-repository -y ppa:ondrej/php && \ - apt-get update -yq - -RUN apt-get install -y --no-install-recommends \ - `# Php dependencies` \ - php8.2 \ - php8.2-cli \ - php8.2-dev \ - php8.2-xml \ - php8.2-curl \ - php8.2-xdebug \ - php-pear \ - re2c - -# Install Composer 2 explicitly to avoid distro package version drift. -RUN curl -sS https://getcomposer.org/installer | php -- --2 --install-dir=/usr/local/bin --filename=composer && \ - composer --version - -RUN apt-get install -y --no-install-recommends \ - `# Python3 dependencies` \ - python3-all \ - python3-all-dbg \ - python3-all-dev \ - python3-pip \ - python3-setuptools \ - python3-wheel - -RUN python3 -m pip install --no-cache-dir --upgrade "tornado>=6.3.0" "twisted>=24.3.0" "zope.interface>=6.1" - -RUN apt-get install -y --no-install-recommends \ - `# Ruby dependencies` \ - ruby \ - ruby-dev \ - ruby-bundler - -USER ${user} -RUN `# Rust dependencies` \ - curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.83.0 -y -ENV PATH=/home/${user}/.cargo/bin:$PATH -USER root - -# Locale(s) for cpp unit tests -RUN apt-get install -y --no-install-recommends \ - `# Locale dependencies` \ - locales && \ - locale-gen en_US.UTF-8 && \ - locale-gen de_DE.UTF-8 && \ - update-locale - -RUN apt-get install -y --no-install-recommends \ - `# Static Code Analysis dependencies` \ - cppcheck \ - sloccount && \ - pip install flake8 - -# NOTE: this does not reduce the image size but adds an additional layer. -# # Clean up -# RUN rm -rf /var/cache/apt/* && \ -# rm -rf /var/lib/apt/lists/* && \ -# rm -rf /tmp/* && \ -# rm -rf /var/tmp/* - -ENV THRIFT_ROOT=/thrift -RUN mkdir -p $THRIFT_ROOT/src && \ - chown -R ${uid}:${uid} $THRIFT_ROOT/ -COPY Dockerfile $THRIFT_ROOT/ -WORKDIR $THRIFT_ROOT/src - -USER ${user} diff --git a/lib/perl/build-cpan-dist.sh b/lib/perl/build-cpan-dist.sh index b9250f475f9..2fe703be134 100755 --- a/lib/perl/build-cpan-dist.sh +++ b/lib/perl/build-cpan-dist.sh @@ -2,7 +2,7 @@ # # This script is intended to be used after tagging the repository and updating # the version files for a release. It will create a CPAN archive. Run this -# from inside a docker image like ubuntu-focal. +# from inside a docker image like ubuntu-jammy. # set -e