diff --git a/.github/renovate.json5 b/.github/renovate.json5 index af1da4e..0df0b91 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -80,6 +80,12 @@ { "matchFileNames": ["v1.10.x/**"], "matchPackageNames": ["hashicorp/nomad"], + "allowedVersions": "<=1.10", + "groupName": "nomad-1.10.x", + }, + { + "matchFileNames": ["v1.11.x/**"], + "matchPackageNames": ["hashicorp/nomad"], "ignoreUnstable": false, "groupName": "nomad-latest", }, diff --git a/.github/workflows/v1.11.x-build.yml b/.github/workflows/v1.11.x-build.yml new file mode 100644 index 0000000..f60450f --- /dev/null +++ b/.github/workflows/v1.11.x-build.yml @@ -0,0 +1,22 @@ +name: "v1.11.x: build" + +on: + push: + branches: + - master + paths: + - v1.11.x/** + + pull_request: + branches: + - master + paths: + - v1.11.x/** + +jobs: + test: + name: Test + uses: ./.github/workflows/template-build.yml + with: + platforms: linux/amd64,linux/arm64 + directory: v1.11.x diff --git a/.github/workflows/v1.11.x-create-tag.yml b/.github/workflows/v1.11.x-create-tag.yml new file mode 100644 index 0000000..dcfaa29 --- /dev/null +++ b/.github/workflows/v1.11.x-create-tag.yml @@ -0,0 +1,19 @@ +name: "v1.11.x: create tag" + +on: + push: + branches: + - master + + paths: + - v1.11.x/nomad-version + +jobs: + tag: + name: Tag + permissions: + contents: write + uses: ./.github/workflows/template-create-tag.yml + secrets: inherit + with: + directory: v1.11.x diff --git a/.github/workflows/v1.11.x-release.yml b/.github/workflows/v1.11.x-release.yml new file mode 100644 index 0000000..ace5a0f --- /dev/null +++ b/.github/workflows/v1.11.x-release.yml @@ -0,0 +1,19 @@ +name: "v1.11.x: release" + +on: + push: + tags: + - 1.11.** + +jobs: + release: + name: Release + permissions: + contents: write + packages: write + discussions: write + uses: ./.github/workflows/template-release.yml + secrets: inherit + with: + platforms: linux/amd64,linux/arm64 + directory: v1.11.x diff --git a/v1.11.x/Dockerfile b/v1.11.x/Dockerfile new file mode 100644 index 0000000..502c100 --- /dev/null +++ b/v1.11.x/Dockerfile @@ -0,0 +1,61 @@ +FROM debian:13.1-slim + +# Fetch the target information injected by Docker build +ARG TARGETOS +ARG TARGETARCH + +SHELL ["/bin/bash", "-x", "-c", "-o", "pipefail"] + +# https://releases.hashicorp.com/nomad/ +ARG NOMAD_VERSION +RUN test -n "$NOMAD_VERSION" || (echo "NOMAD_VERSION argument must be set" && false) + +RUN groupadd nomad \ + && useradd --system --gid nomad nomad \ + && mkdir --parents /nomad/data \ + && mkdir --parents /etc/nomad \ + && chown --recursive nomad:nomad /nomad /etc/nomad + +# Allow to fetch artifacts from TLS endpoint during the builds and by Nomad after. +# Install timezone data so we can run Nomad periodic jobs containing timezone information +RUN apt-get update \ + && apt-get install --yes --no-install-recommends \ + ca-certificates \ + dumb-init \ + iproute2 \ + libcap2 \ + tzdata \ + && update-ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +ADD https://releases.hashicorp.com/nomad/${NOMAD_VERSION}/nomad_${NOMAD_VERSION}_${TARGETOS}_${TARGETARCH}.zip \ + nomad_${NOMAD_VERSION}_${TARGETOS}_${TARGETARCH}.zip +ADD https://releases.hashicorp.com/nomad/${NOMAD_VERSION}/nomad_${NOMAD_VERSION}_SHA256SUMS \ + nomad_${NOMAD_VERSION}_SHA256SUMS +ADD https://releases.hashicorp.com/nomad/${NOMAD_VERSION}/nomad_${NOMAD_VERSION}_SHA256SUMS.sig \ + nomad_${NOMAD_VERSION}_SHA256SUMS.sig + +RUN apt-get update \ + && apt-get install --yes --no-install-recommends \ + gnupg \ + unzip \ + && GNUPGHOME="$(mktemp -d)" \ + && export GNUPGHOME \ + && gpg --keyserver pgp.mit.edu --keyserver keys.openpgp.org --keyserver keyserver.ubuntu.com --recv-keys "C874 011F 0AB4 0511 0D02 1055 3436 5D94 72D7 468F" \ + && gpg --batch --verify nomad_${NOMAD_VERSION}_SHA256SUMS.sig nomad_${NOMAD_VERSION}_SHA256SUMS \ + && grep nomad_${NOMAD_VERSION}_${TARGETOS}_${TARGETARCH}.zip nomad_${NOMAD_VERSION}_SHA256SUMS | sha256sum -c \ + && unzip -d /bin nomad_${NOMAD_VERSION}_${TARGETOS}_${TARGETARCH}.zip \ + && chmod +x /bin/nomad \ + && rm -rf "$GNUPGHOME" nomad_${NOMAD_VERSION}_${TARGETOS}_${TARGETARCH}.zip nomad_${NOMAD_VERSION}_SHA256SUMS nomad_${NOMAD_VERSION}_SHA256SUMS.sig \ + && apt-get autoremove --purge --yes \ + gnupg \ + unzip \ + && rm -rf /var/lib/apt/lists/* + +RUN nomad version + +EXPOSE 4646 4647 4648 4648/udp + +COPY start.sh /usr/local/bin/ + +ENTRYPOINT ["/usr/local/bin/start.sh"] diff --git a/v1.11.x/nomad-version b/v1.11.x/nomad-version new file mode 100644 index 0000000..3d77935 --- /dev/null +++ b/v1.11.x/nomad-version @@ -0,0 +1 @@ +1.11.0-beta.1 diff --git a/v1.11.x/start.sh b/v1.11.x/start.sh new file mode 100755 index 0000000..c013a7e --- /dev/null +++ b/v1.11.x/start.sh @@ -0,0 +1,67 @@ +#!/usr/bin/dumb-init /bin/sh +# shellcheck shell=dash +# Script created following Hashicorp's model for Consul: +# https://github.com/hashicorp/docker-consul/blob/master/0.X/docker-entrypoint.sh +# Comments in this file originate from the project above, simply replacing 'Consul' with 'Nomad'. +set -e + +# Note above that we run dumb-init as PID 1 in order to reap zombie processes +# as well as forward signals to all processes in its session. Normally, sh +# wouldn't do either of these functions so we'd leak zombies as well as do +# unclean termination of all our sub-processes. +# As of docker 1.13, using docker run --init achieves the same outcome. + +# NOMAD_DATA_DIR is exposed as a volume for possible persistent storage. The +# NOMAD_CONFIG_DIR isn't exposed as a volume but you can compose additional +# config files in there if you use this image as a base, or use NOMAD_LOCAL_CONFIG +# below. +NOMAD_DATA_DIR=${NOMAD_DATA_DIR:-"/nomad/data"} +NOMAD_CONFIG_DIR=${NOMAD_CONFIG_DIR:-"/etc/nomad"} + +# You can also set the NOMAD_LOCAL_CONFIG environemnt variable to pass some +# Nomad configuration JSON without having to bind any volumes. +if [ -n "$NOMAD_LOCAL_CONFIG" ]; then + echo "$NOMAD_LOCAL_CONFIG" > "$NOMAD_CONFIG_DIR/local.json" +fi + +# If the user is trying to run Nomad directly with some arguments, then +# pass them to Nomad. +if [ "$(printf "%s" "$1" | cut -c 1)" = '-' ]; then + set -- nomad "$@" +fi + +# Look for Nomad subcommands. +if [ "$1" = 'agent' ]; then + shift + set -- nomad agent \ + -data-dir="$NOMAD_DATA_DIR" \ + -config="$NOMAD_CONFIG_DIR" \ + "$@" +elif [ "$1" = 'version' ]; then + # This needs a special case because there's no help output. + set -- nomad "$@" +elif nomad --help "$1" 2>&1 | grep -q "nomad $1"; then + # We can't use the return code to check for the existence of a subcommand, so + # we have to use grep to look for a pattern in the help output. + set -- nomad "$@" +fi + +# If we are running Nomad, make sure it executes as the proper user. +if [ "$1" = 'nomad' ] && [ -z "${NOMAD_DISABLE_PERM_MGMT+x}" ]; then + # If the data or config dirs are bind mounted then chown them. + # Note: This checks for root ownership as that's the most common case. + if [ "$(stat -c %u "$NOMAD_DATA_DIR")" != "$(id -u root)" ]; then + chown root:root "$NOMAD_DATA_DIR" + fi + + # If requested, set the capability to bind to privileged ports before + # we drop to the non-root user. Note that this doesn't work with all + # storage drivers (it won't work with AUFS). + if [ -n "${NOMAD+x}" ]; then + setcap "cap_net_bind_service=+ep" /bin/nomad + fi + + exec runuser -u root -- "$@" +fi + +exec "$@"