| |
| # 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. |
| |
| ############### |
| # |
| # Example Apache Yetus Dockerfile that includes all functionality supported |
| # as well as enough bits to build and release Apache Yetus itself. |
| # |
| ############### |
| |
| FROM ubuntu:noble AS yetusbase |
| |
| ## NOTE to committers: if this gets moved from Xenial to something else, be |
| ## sure to also fix the gpg link in asf-site-src as appropriate |
| |
| WORKDIR /root |
| SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
| |
| ENV DEBIAN_FRONTEND=noninteractive |
| ENV DEBCONF_TERSE=true |
| |
| ###### |
| # Install some basic Apache Yetus requirements |
| # some git repos need ssh-client so do it too |
| # Adding libffi-dev for all the programming languages |
| # that take advantage of it. Also throw in |
| # xmllint here since so much links against libxml anyway. |
| ###### |
| # hadolint ignore=DL3008 |
| RUN apt-get -q update && apt-get -q install --no-install-recommends -y \ |
| apt-transport-https \ |
| apt-utils \ |
| ca-certificates \ |
| curl \ |
| dirmngr \ |
| git \ |
| gpg \ |
| gpg-agent \ |
| libffi-dev \ |
| libicu-dev \ |
| libxml2-utils \ |
| locales \ |
| patch \ |
| pkg-config \ |
| rsync \ |
| software-properties-common \ |
| ssh-client \ |
| xz-utils \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* |
| |
| ### |
| # Set the locale |
| ### |
| #hadolint ignore=DL3059 |
| RUN locale-gen en_US.UTF-8 |
| ENV LANG=en_US.UTF-8 |
| ENV LANGUAGE=en_US:en |
| ENV LC_ALL=en_US.UTF-8 |
| |
| #### |
| # Install GNU C/C++ and GNU make (everything generally needs this) |
| #### |
| # hadolint ignore=DL3008 |
| RUN apt-get -q update && apt-get -q install --no-install-recommends -y \ |
| g++ \ |
| gcc \ |
| libc-dev \ |
| make \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* |
| |
| ### |
| # Install golang as part of base so we can do each |
| # helper utility in parallel. go bins are typically |
| # statically linked, so this is perfectly safe. |
| ### |
| # hadolint ignore=DL3008,DL3059 |
| RUN add-apt-repository -y ppa:longsleep/golang-backports \ |
| && apt-get -q update \ |
| && apt-get -q install --no-install-recommends -y golang-go \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* |
| |
| ############ |
| # Fetch all of the non-conflicting bits in parallel |
| ############# |
| |
| #### |
| # Install Apache Creadur RAT jar |
| #### |
| FROM yetusbase AS yetusapacherat |
| ARG APACHE_RAT_VERSION=0.18 |
| SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
| RUN mkdir -p /opt/apache-rat \ |
| && curl -f -s -L -o /tmp/rat.tgz \ |
| "https://archive.apache.org/dist/creadur/apache-rat-$APACHE_RAT_VERSION/apache-rat-$APACHE_RAT_VERSION-bin.tar.gz" \ |
| && curl -f -s -L -o /tmp/rat.tgz.sha512 \ |
| "https://archive.apache.org/dist/creadur/apache-rat-$APACHE_RAT_VERSION/apache-rat-$APACHE_RAT_VERSION-bin.tar.gz.sha512" \ |
| && echo "$(cat /tmp/rat.tgz.sha512) /tmp/rat.tgz" > /tmp/rat.tgz.verify \ |
| && shasum -a 512 -c /tmp/rat.tgz.verify \ |
| && tar --strip-components 1 -C /opt/apache-rat -xpzf /tmp/rat.tgz \ |
| && rm /tmp/rat.tgz /tmp/rat.tgz.sha512 /tmp/rat.tgz.verify \ |
| && mv "/opt/apache-rat/apache-rat-$APACHE_RAT_VERSION.jar" /opt/apache-rat/apache-rat.jar |
| |
| ##### |
| # Install SpotBugs |
| ##### |
| FROM yetusbase AS yetusspotbugs |
| ARG SPOTBUGS_VERSION=4.9.8 |
| SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
| RUN curl -sSL https://repo.maven.apache.org/maven2/com/github/spotbugs/spotbugs/$SPOTBUGS_VERSION/spotbugs-$SPOTBUGS_VERSION.tgz -o spotbugs.tgz \ |
| && curl -sSL https://repo.maven.apache.org/maven2/com/github/spotbugs/spotbugs/$SPOTBUGS_VERSION/spotbugs-$SPOTBUGS_VERSION.tgz.sha1 -o spotbugs.tgz.sha1 \ |
| && echo -n " spotbugs.tgz" >> spotbugs.tgz.sha1 \ |
| && shasum -c spotbugs.tgz.sha1 \ |
| && mkdir -p /opt/spotbugs \ |
| && tar -C /opt/spotbugs --strip-components 1 -xpf spotbugs.tgz \ |
| && rm spotbugs.tgz spotbugs.tgz.sha1 \ |
| && chmod a+rx /opt/spotbugs/bin/* |
| ## NOTE: SPOTBUGS_HOME is set below |
| |
| #### |
| # Install shellcheck (shell script lint) |
| #### |
| FROM yetusbase AS yetusshellcheck |
| ARG SHELLCHECK_VERSION=0.10.0 |
| SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
| RUN curl -sSL \ |
| https://github.com/koalaman/shellcheck/releases/download/v$SHELLCHECK_VERSION/shellcheck-v$SHELLCHECK_VERSION.linux."$(uname -m)".tar.xz \ |
| | tar --strip-components 1 --wildcards -xJf - '*/shellcheck' \ |
| && chmod a+rx shellcheck \ |
| && mv shellcheck /bin/shellcheck |
| |
| #### |
| # Install hadolint (dockerfile lint) |
| #### |
| FROM yetusbase AS yetushadolint |
| ARG HADOLINT_VERSION=2.12.0 |
| SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
| RUN if [[ "$(uname -m)" == "x86_64" ]]; then curl -sSL \ |
| https://github.com/hadolint/hadolint/releases/download/v$HADOLINT_VERSION/hadolint-Linux-x86_64 \ |
| -o /bin/hadolint \ |
| && chmod a+rx /bin/hadolint; \ |
| elif [[ "$(uname -m)" == "aarch64" ]]; then curl -sSL \ |
| https://github.com/hadolint/hadolint/releases/download/v$HADOLINT_VERSION/hadolint-Linux-arm64 \ |
| -o /bin/hadolint \ |
| && chmod a+rx /bin/hadolint; \ |
| else \ |
| touch /bin/hadolint; \ |
| fi |
| |
| #### |
| # Install buf (protobuf lint) |
| #### |
| FROM yetusbase AS yetusbuf |
| ARG BUF_VERSION=1.50.0 |
| SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
| RUN curl -sSL \ |
| https://github.com/bufbuild/buf/releases/download/v$BUF_VERSION/buf-Linux-"$(uname -m)".tar.gz \ |
| -o buf.tar.gz \ |
| && tar -xzf buf.tar.gz -C /usr/local --strip-components 1 \ |
| && rm buf.tar.gz |
| |
| #### |
| # Install bats (TAP-capable unit testing for shell scripts) |
| #### |
| FROM yetusbase AS yetusbats |
| ARG BATS_VERSION=1.11.1 |
| SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
| RUN git clone --branch v$BATS_VERSION \ |
| https://github.com/bats-core/bats-core.git \ |
| /tmp/bats-core \ |
| && /tmp/bats-core/install.sh /opt/bats \ |
| && rm -rf /tmp/bats-core |
| |
| #### |
| # revive (golint on steroids) |
| #### |
| FROM yetusbase AS yetusrevive |
| ARG REVIVE_VERSION=1.15.0 |
| SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
| RUN curl -sSL \ |
| https://github.com/mgechev/revive/releases/download/v$REVIVE_VERSION/revive_"$(go env GOOS)"_"$(go env GOARCH)".tar.gz \ |
| -o revive.tar.gz \ |
| && tar -xzf revive.tar.gz -C /usr/local/bin revive \ |
| && rm revive.tar.gz |
| |
| |
| #### |
| # checkmake (Makefile linter) |
| # |
| # requires go 1.15 as of 2021-03-02 |
| # |
| #### |
| FROM yetusbase AS yetuscheckmake |
| ARG CHECKMAKE_VERSION=0.2.2 |
| SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
| ENV BUILDER_NAME='Apache Yetus' |
| ENV BUILDER_EMAIL='dev@apache.yetus.org' |
| RUN git clone \ |
| https://github.com/mrtazz/checkmake.git /tmp/checkmake \ |
| && git -C /tmp/checkmake checkout $CHECKMAKE_VERSION \ |
| && GOOS=linux CGO_ENABLED=0 make -C /tmp/checkmake binaries \ |
| && make -C /tmp/checkmake test |
| |
| #### |
| # golangci-lint (Multi-tool golang linter) |
| # |
| # NOTE: go must be installed prior to executing this block! |
| #### |
| FROM yetusbase AS yetusgolangci |
| ARG GOLANGCILINT_VERSION=1.64.4 |
| SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
| RUN curl -sSL \ |
| https://github.com/golangci/golangci-lint/releases/download/v$GOLANGCILINT_VERSION/golangci-lint-$GOLANGCILINT_VERSION-"$(go env GOOS)"-"$(go env GOARCH)".tar.gz \ |
| -o golangcilint.tar.gz \ |
| && tar -xzf golangcilint.tar.gz -C /usr/local/bin --strip-components 1 \ |
| && rm golangcilint.tar.gz |
| |
| ######## |
| # |
| # |
| # Content that needs to be installed in order due to packages... |
| # |
| # |
| ######## |
| |
| FROM yetusbase |
| SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
| |
| #### |
| # Install java (first, since we want to dictate what form of Java) |
| #### |
| |
| #### |
| # OpenJDK 21 |
| # NOTE: This default only works when Apache Yetus is launched |
| # _in_ the container and not outside of it! |
| #### |
| # hadolint ignore=DL3008,DL3059 |
| RUN apt-get -q update && apt-get -q install --no-install-recommends -y \ |
| default-jdk-headless \ |
| openjdk-21-jdk-headless \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* \ |
| ENV JAVA_HOME=/usr/lib/jvm/default-java |
| ENV SPOTBUGS_HOME=/opt/spotbugs |
| |
| #### |
| # Install ant |
| #### |
| # hadolint ignore=DL3008 |
| RUN apt-get -q update && apt-get -q install --no-install-recommends -y ant \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* |
| |
| #### |
| # Install GNU automake and related |
| #### |
| # hadolint ignore=DL3008,DL3059 |
| RUN apt-get -q update && apt-get -q install --no-install-recommends -y autoconf automake libtool \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* |
| |
| #### |
| # Install cmake |
| #### |
| # hadolint ignore=DL3008,DL3059 |
| RUN apt-get -q update && apt-get -q install --no-install-recommends -y cmake \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* |
| |
| ### |
| # Install docker |
| ### |
| # hadolint ignore=DL3008,DL3059 |
| RUN mkdir -p /etc/apt/keyrings \ |
| && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg \ |
| && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu noble stable" \ |
| > /etc/apt/sources.list.d/docker.list \ |
| && apt-get -q update && apt-get -q install --no-install-recommends -y docker-ce docker-compose-plugin \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* |
| |
| ###### |
| # Install maven |
| ###### |
| # hadolint ignore=DL3008,DL3059 |
| ARG MVN_VERSION=3.9.9 |
| ARG MVN_TGZ=apache-maven-$MVN_VERSION-bin.tar.gz |
| RUN curl -sSL \ |
| -o $MVN_TGZ \ |
| https://archive.apache.org/dist/maven/maven-3/$MVN_VERSION/binaries/$MVN_TGZ \ |
| && tar xzpf $MVN_TGZ \ |
| && mkdir -p /opt \ |
| && mv apache-maven-$MVN_VERSION /opt \ |
| && ln -s /opt/apache-maven-$MVN_VERSION/bin/mvn /bin \ |
| && curl -sSL \ |
| -o KEYS \ |
| https://downloads.apache.org/maven/KEYS \ |
| && gpg --import KEYS \ |
| && curl -sSL \ |
| -o $MVN_TGZ.asc \ |
| https://archive.apache.org/dist/maven/maven-3/$MVN_VERSION/binaries/$MVN_TGZ.asc \ |
| && gpg --verify $MVN_TGZ.asc $MVN_TGZ \ |
| && rm -rf $MVN_TGZ* /root/.gnupg KEYS |
| |
| ###### |
| # Install perl |
| ###### |
| # hadolint ignore=DL3008,DL3059 |
| RUN apt-get -q update && apt-get -q install --no-install-recommends -y \ |
| perl \ |
| libperl-critic-perl \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* |
| |
| ###### |
| # Install python3 and pylint3 (historical; most stuff uses "pylint" now) |
| # astroid and pylint go hand-in-hand. Upgrade both at the same time. |
| ###### |
| #ARG PY3_ANSIBLE_VERSION=7.5.0 |
| ARG PY3_ANSIBLELINT_VERSION=26.3.0 |
| ARG PY3_ASTROID_VERSION=4.0.4 |
| ARG PY3_CODESPELL_VERSION=2.4.2 |
| ARG PY3_DETECT_SECRETS=1.5.0 |
| ARG PY3_PYLINT_VERSION=4.0.5 |
| ARG PY3_YAMLLINT_VERSION=1.38.0 |
| # hadolint ignore=DL3008 |
| RUN apt-get -q update && apt-get -q install --no-install-recommends -y \ |
| python3-full \ |
| python3-pip \ |
| python3-venv \ |
| python3-dev \ |
| python3-dateutil \ |
| python3-dockerpty \ |
| python3-yaml \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* \ |
| && python3 -m venv --copies /usr/local \ |
| && /usr/local/bin/pip install --no-cache-dir -v \ |
| python-dateutil \ |
| ansible-lint==$PY3_ANSIBLELINT_VERSION \ |
| astroid==$PY3_ASTROID_VERSION \ |
| codespell==$PY3_CODESPELL_VERSION \ |
| detect-secrets==$PY3_DETECT_SECRETS \ |
| pylint==$PY3_PYLINT_VERSION \ |
| yamllint==$PY3_YAMLLINT_VERSION \ |
| && ln -sf /usr/local/bin/pylint /usr/local/bin/pylint3 \ |
| && chmod -R a+w /usr/local/lib/python3.12/site-packages /usr/local/bin \ |
| && rm -rf /root/.cache /root/.config /root/.local |
| |
| #### |
| # Install ruby and associated bits |
| ### |
| ARG RUBY_BUNDLER_VERSION=4.0.8 |
| ARG RUBY_RAKE_VERSION=13.2.1 |
| ARG RUBY_RUBOCOP_VERSION=1.86.0 |
| # hadolint ignore=DL3008 |
| RUN echo 'gem: --no-rdoc --no-ri' >> /root/.gemrc \ |
| && apt-get -q update && apt-get -q install --no-install-recommends -y \ |
| ruby \ |
| ruby-dev \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* \ |
| && gem install bundler -v $RUBY_BUNDLER_VERSION \ |
| && gem install rake -v $RUBY_RAKE_VERSION \ |
| && gem install rubocop -v $RUBY_RUBOCOP_VERSION \ |
| && rm -rf /root/.gem /root/.config /root/.local |
| # set some reasonable defaults for ruby |
| # user's can always override these as needed |
| ENV PATH=${PATH}:/var/tmp/.bundler-gems/bin |
| ENV BUNDLE_PATH=/var/tmp/.bundler-gems |
| |
| ### |
| # Install npm and JSHint |
| ### |
| ARG JSHINT_VERSION=2.13.6 |
| ARG MARKDOWNLINTCLI_VERSION=0.48.0 |
| ARG JSONLINT_VERSION=17.0.1 |
| # hadolint ignore=DL3008 |
| RUN 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_24.x nodistro main" \ |
| > /etc/apt/sources.list.d/nodesource.list \ |
| && apt-get -q update \ |
| && apt-get -q install --no-install-recommends -y nodejs \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* \ |
| && npm install -g \ |
| jshint@$JSHINT_VERSION \ |
| @prantlf/jsonlint@$JSONLINT_VERSION \ |
| markdownlint-cli@$MARKDOWNLINTCLI_VERSION \ |
| && rm -rf /root/.npm /root/.config /root/.local |
| |
| ##### |
| # Now all the stuff that was built in parallel |
| ##### |
| |
| COPY --from=yetusapacherat /opt/apache-rat /opt/apache-rat |
| COPY --from=yetusspotbugs /opt/spotbugs /opt/spotbugs |
| COPY --from=yetusshellcheck /bin/shellcheck /bin/shellcheck |
| COPY --from=yetushadolint /bin/hadolint /bin/hadolint |
| COPY --from=yetusbuf /usr/local/bin/buf /usr/local/bin/buf |
| COPY --from=yetusbats /opt/bats /opt/bats |
| RUN ln -s /opt/bats/bin/bats /usr/local/bin/bats |
| |
| COPY --from=yetusrevive /usr/local/bin/revive /usr/local/bin |
| COPY --from=yetuscheckmake /tmp/checkmake/checkmake /usr/local/bin |
| COPY --from=yetusgolangci /usr/local/bin/golangci-lint /usr/local/bin |
| |
| #### |
| # YETUS CUT HERE |
| # Magic text above! Everything from here on is ignored |
| # by Yetus, so could include anything not needed |
| # by your testing environment |
| ### |