diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 1280243..6d5ac81 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -11,8 +11,9 @@ on: pull_request: branches: - master + workflow_dispatch: schedule: - - cron: '0 0 * * *' + - cron: '0 6 * * *' jobs: build: @@ -80,7 +81,7 @@ jobs: uses: docker/setup-buildx-action@v3 - name: Login to GHCR uses: docker/login-action@v3 - if: github.event_name != 'pull_request' + if: (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/master' with: registry: ghcr.io username: rust-lang @@ -88,11 +89,48 @@ jobs: - name: Login to Docker Hub uses: docker/login-action@v3 - if: github.event_name != 'pull_request' + if: (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/master' with: username: rustopsbot password: ${{ secrets.DOCKER_HUB_TOKEN }} + - name: Compute nightly date + id: date + env: + EVENT_NAME: ${{ github.event_name }} + run: | + set -euo pipefail + DATE=$(date -u +%Y-%m-%d) + URL="https://static.rust-lang.org/dist/${DATE}/channel-rust-nightly.toml" + if ! curl -fsI -o /dev/null "$URL"; then + case "${EVENT_NAME}" in + push|pull_request) + echo "Today's nightly manifest is not yet published; falling back to yesterday." >&2 + DATE=$(date -u -d 'yesterday' +%Y-%m-%d) + ;; + *) + echo "Today's nightly manifest is not yet published; refusing to publish a stale nightly." >&2 + exit 1 + ;; + esac + fi + echo "date=${DATE}" >> "$GITHUB_OUTPUT" + + - name: Build dated tag list + id: dated_tags + env: + BASE_TAGS: ${{ matrix.tags }} + DATE: ${{ steps.date.outputs.date }} + run: | + { + echo "tags<> "$GITHUB_OUTPUT" + - name: Docker Metadata id: meta uses: docker/metadata-action@v5 @@ -100,13 +138,17 @@ jobs: images: | rustlang/rust ghcr.io/rust-lang/rust - tags: ${{ matrix.tags }} + tags: | + ${{ matrix.tags }} + ${{ steps.dated_tags.outputs.tags }} - name: Build and push image uses: docker/build-push-action@v6 with: context: ${{ matrix.context }} platforms: ${{ matrix.platforms }} - push: ${{ github.event_name != 'pull_request' }} + build-args: | + RUST_VERSION=nightly-${{ steps.date.outputs.date }} + push: ${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/master' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} diff --git a/Dockerfile-alpine.template b/Dockerfile-alpine.template index f26da74..30e51ac 100644 --- a/Dockerfile-alpine.template +++ b/Dockerfile-alpine.template @@ -7,10 +7,11 @@ RUN apk add --no-cache \ musl-dev \ gcc +%%RUST-VERSION-ARG%% ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=%%RUST-VERSION%% + RUST_VERSION=%%RUST-VERSION-VALUE%% RUN set -eux; \ \ diff --git a/Dockerfile-debian.template b/Dockerfile-debian.template index f12e088..935f10b 100644 --- a/Dockerfile-debian.template +++ b/Dockerfile-debian.template @@ -2,10 +2,11 @@ FROM buildpack-deps:%%TAG%% LABEL org.opencontainers.image.source=https://github.com/rust-lang/docker-rust +%%RUST-VERSION-ARG%% ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=%%RUST-VERSION%% + RUST_VERSION=%%RUST-VERSION-VALUE%% RUN set -eux; \ \ diff --git a/Dockerfile-slim.template b/Dockerfile-slim.template index 0cc8c8b..658346d 100644 --- a/Dockerfile-slim.template +++ b/Dockerfile-slim.template @@ -2,10 +2,11 @@ FROM debian:%%TAG%%-slim LABEL org.opencontainers.image.source=https://github.com/rust-lang/docker-rust +%%RUST-VERSION-ARG%% ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=%%RUST-VERSION%% + RUST_VERSION=%%RUST-VERSION-VALUE%% RUN set -eux; \ \ diff --git a/nightly/alpine3.21/Dockerfile b/nightly/alpine3.21/Dockerfile index a1877e8..733db0f 100644 --- a/nightly/alpine3.21/Dockerfile +++ b/nightly/alpine3.21/Dockerfile @@ -7,10 +7,11 @@ RUN apk add --no-cache \ musl-dev \ gcc +ARG RUST_VERSION=nightly ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=nightly + RUST_VERSION=${RUST_VERSION} RUN set -eux; \ \ diff --git a/nightly/alpine3.22/Dockerfile b/nightly/alpine3.22/Dockerfile index acee8be..77f9c6e 100644 --- a/nightly/alpine3.22/Dockerfile +++ b/nightly/alpine3.22/Dockerfile @@ -7,10 +7,11 @@ RUN apk add --no-cache \ musl-dev \ gcc +ARG RUST_VERSION=nightly ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=nightly + RUST_VERSION=${RUST_VERSION} RUN set -eux; \ \ diff --git a/nightly/alpine3.23/Dockerfile b/nightly/alpine3.23/Dockerfile index 11126c4..de05119 100644 --- a/nightly/alpine3.23/Dockerfile +++ b/nightly/alpine3.23/Dockerfile @@ -7,10 +7,11 @@ RUN apk add --no-cache \ musl-dev \ gcc +ARG RUST_VERSION=nightly ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=nightly + RUST_VERSION=${RUST_VERSION} RUN set -eux; \ \ diff --git a/nightly/bookworm/Dockerfile b/nightly/bookworm/Dockerfile index 97d2635..9b052a4 100644 --- a/nightly/bookworm/Dockerfile +++ b/nightly/bookworm/Dockerfile @@ -2,10 +2,11 @@ FROM buildpack-deps:bookworm LABEL org.opencontainers.image.source=https://github.com/rust-lang/docker-rust +ARG RUST_VERSION=nightly ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=nightly + RUST_VERSION=${RUST_VERSION} RUN set -eux; \ \ diff --git a/nightly/bookworm/slim/Dockerfile b/nightly/bookworm/slim/Dockerfile index 791317c..fc08dc9 100644 --- a/nightly/bookworm/slim/Dockerfile +++ b/nightly/bookworm/slim/Dockerfile @@ -2,10 +2,11 @@ FROM debian:bookworm-slim LABEL org.opencontainers.image.source=https://github.com/rust-lang/docker-rust +ARG RUST_VERSION=nightly ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=nightly + RUST_VERSION=${RUST_VERSION} RUN set -eux; \ \ diff --git a/nightly/bullseye/Dockerfile b/nightly/bullseye/Dockerfile index 3e2e4e0..e7cdc2f 100644 --- a/nightly/bullseye/Dockerfile +++ b/nightly/bullseye/Dockerfile @@ -2,10 +2,11 @@ FROM buildpack-deps:bullseye LABEL org.opencontainers.image.source=https://github.com/rust-lang/docker-rust +ARG RUST_VERSION=nightly ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=nightly + RUST_VERSION=${RUST_VERSION} RUN set -eux; \ \ diff --git a/nightly/bullseye/slim/Dockerfile b/nightly/bullseye/slim/Dockerfile index 3682cb8..4e8879a 100644 --- a/nightly/bullseye/slim/Dockerfile +++ b/nightly/bullseye/slim/Dockerfile @@ -2,10 +2,11 @@ FROM debian:bullseye-slim LABEL org.opencontainers.image.source=https://github.com/rust-lang/docker-rust +ARG RUST_VERSION=nightly ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=nightly + RUST_VERSION=${RUST_VERSION} RUN set -eux; \ \ diff --git a/nightly/trixie/Dockerfile b/nightly/trixie/Dockerfile index 495a126..5b46261 100644 --- a/nightly/trixie/Dockerfile +++ b/nightly/trixie/Dockerfile @@ -2,10 +2,11 @@ FROM buildpack-deps:trixie LABEL org.opencontainers.image.source=https://github.com/rust-lang/docker-rust +ARG RUST_VERSION=nightly ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=nightly + RUST_VERSION=${RUST_VERSION} RUN set -eux; \ \ diff --git a/nightly/trixie/slim/Dockerfile b/nightly/trixie/slim/Dockerfile index 0841d40..40ee2f7 100644 --- a/nightly/trixie/slim/Dockerfile +++ b/nightly/trixie/slim/Dockerfile @@ -2,10 +2,11 @@ FROM debian:trixie-slim LABEL org.opencontainers.image.source=https://github.com/rust-lang/docker-rust +ARG RUST_VERSION=nightly ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ - RUST_VERSION=nightly + RUST_VERSION=${RUST_VERSION} RUN set -eux; \ \ diff --git a/x.py b/x.py index f19c190..f509fe5 100755 --- a/x.py +++ b/x.py @@ -156,12 +156,23 @@ def render_template( arch_cases, rendered_path ): + if rust_version == "nightly": + rust_version_arg = "ARG RUST_VERSION=nightly\n" + rust_version_value = "${RUST_VERSION}" + else: + rust_version_arg = "" + rust_version_value = rust_version + template = read_file(template_path) - rendered = template \ - .replace("%%TAG%%", docker_tag) \ - .replace("%%RUST-VERSION%%", rust_version) \ - .replace("%%RUSTUP-VERSION%%", rustup_version) \ + rendered = ( + template + .replace("%%TAG%%", docker_tag) + # We match with `\n` here so that the line is removed entirely if the argument is not needed + .replace("%%RUST-VERSION-ARG%%\n", rust_version_arg) + .replace("%%RUST-VERSION-VALUE%%", rust_version_value) + .replace("%%RUSTUP-VERSION%%", rustup_version) .replace("%%ARCH-CASE%%", arch_cases) + ) write_file(rendered_path, rendered) def update_ci():