Implement artifact-based Docker image sharing with final publish job for GitHub Actions workflows #590
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
name: Alpine Mainline | |
on: | |
pull_request: | |
merge_group: | |
schedule: | |
- cron: "0 0 * * 1" | |
workflow_dispatch: | |
jobs: | |
version: | |
name: Fetch NGINX mainline version | |
runs-on: ubuntu-24.04 | |
outputs: | |
major: ${{ steps.nginx_version.outputs.major }} | |
minor: ${{ steps.nginx_version.outputs.minor }} | |
patch: ${{ steps.nginx_version.outputs.patch }} | |
distro: ${{ steps.distro_version.outputs.release }} | |
steps: | |
- name: Check out the codebase | |
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
- name: Parse NGINX mainline version | |
id: nginx_version | |
run: | | |
echo "major=$(cat update.sh | grep -m1 '\[mainline\]=' | cut -d"'" -f2 | cut -d"." -f1)" >> "$GITHUB_OUTPUT" | |
echo "minor=$(cat update.sh | grep -m1 '\[mainline\]=' | cut -d"'" -f2 | cut -d"." -f2)" >> "$GITHUB_OUTPUT" | |
echo "patch=$(cat update.sh | grep -m1 '\[mainline\]=' | cut -d"'" -f2 | cut -d"." -f3)" >> "$GITHUB_OUTPUT" | |
- name: Parse Alpine version | |
id: distro_version | |
run: | | |
echo "release=$(cat update.sh | grep -m8 '\[mainline\]=' | tail -n1 | cut -d"'" -f2)" >> "$GITHUB_OUTPUT" | |
slim: | |
name: Build Alpine NGINX mainline slim Docker image | |
needs: version | |
runs-on: ubuntu-24.04 | |
strategy: | |
fail-fast: false | |
steps: | |
- name: Check out the codebase | |
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 | |
- name: Build NGINX mainline slim Alpine image locally | |
id: build | |
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 | |
with: | |
platforms: linux/amd64 | |
context: "{{ defaultContext }}:mainline/alpine-slim" | |
tags: nginx-unprivileged:alpine-slim | |
push: false | |
outputs: type=docker,dest=/tmp/alpine-slim.tar | |
- name: Upload Alpine slim image artifact | |
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 | |
with: | |
name: alpine-slim-image | |
path: /tmp/alpine-slim.tar | |
retention-days: 1 | |
core: | |
name: Build Alpine NGINX mainline Docker image | |
needs: [version, slim] | |
runs-on: ubuntu-24.04 | |
strategy: | |
fail-fast: false | |
services: | |
registry: | |
image: registry:2 | |
ports: | |
- 5000:5000 | |
steps: | |
- name: Check out the codebase | |
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 | |
- name: Download Alpine slim image artifact | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
name: alpine-slim-image | |
path: /tmp | |
- name: Load Alpine slim image | |
run: | | |
docker load --input /tmp/alpine-slim.tar | |
docker tag nginx-unprivileged:alpine-slim localhost:5000/nginx-unprivileged:alpine-slim | |
docker image ls -a | |
- name: Push Alpine slim image | |
run: | | |
docker push localhost:5000/nginx-unprivileged:alpine-slim | |
- name: Pull Alpine slim image | |
run: | | |
docker pull localhost:5000/nginx-unprivileged:alpine-slim | |
- name: Build NGINX mainline Alpine image locally | |
id: build | |
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 | |
with: | |
platforms: linux/amd64 | |
context: "{{ defaultContext }}:mainline/alpine" | |
tags: localhost:5000/nginx-unprivileged:alpine | |
build-args: IMAGE=localhost:5000/nginx-unprivileged:alpine-slim | |
push: false | |
outputs: type=docker,dest=/tmp/alpine.tar | |
- name: Upload Alpine image artifact | |
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 | |
with: | |
name: alpine-image | |
path: /tmp/alpine.tar | |
retention-days: 1 | |
perl: | |
name: Build Alpine NGINX mainline perl Docker image | |
needs: [version, core] | |
runs-on: ubuntu-24.04 | |
strategy: | |
fail-fast: false | |
steps: | |
- name: Check out the codebase | |
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
- name: Download Alpine image artifact | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
name: alpine-image | |
path: /tmp | |
- name: Load Alpine image | |
run: | | |
docker load --input /tmp/alpine.tar | |
docker image ls -a | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 | |
- name: Build NGINX mainline perl Alpine image locally | |
id: build | |
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 | |
with: | |
platforms: linux/amd64 | |
context: "{{ defaultContext }}:mainline/alpine-perl" | |
tags: nginx-unprivileged:alpine-perl | |
build-args: IMAGE=nginx-unprivileged:alpine | |
push: false | |
otel: | |
name: Build Alpine NGINX mainline otel Docker image | |
needs: [version, core] | |
runs-on: ubuntu-24.04 | |
strategy: | |
fail-fast: false | |
steps: | |
- name: Check out the codebase | |
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
- name: Download Alpine image artifact | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
name: alpine-image | |
path: /tmp | |
- name: Load Alpine image | |
run: | | |
docker load --input /tmp/alpine.tar | |
docker image ls -a | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 | |
- name: Build NGINX mainline otel Alpine image locally | |
id: build | |
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 | |
with: | |
platforms: linux/amd64 | |
context: "{{ defaultContext }}:mainline/alpine-otel" | |
tags: nginx-unprivileged:alpine-otel | |
build-args: IMAGE=nginx-unprivileged:alpine | |
push: false | |
publish: | |
name: Publish Alpine NGINX mainline images to external registries | |
if: ${{ github.event_name != 'pull_request' }} | |
needs: [version, slim, core, perl, otel] | |
runs-on: ubuntu-24.04 | |
strategy: | |
fail-fast: false | |
steps: | |
- name: Check out the codebase | |
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 | |
- name: Configure AWS credentials | |
uses: aws-actions/configure-aws-credentials@7474bc4690e29a8392af63c5b98e7449536d5c3a # v4.3.1 | |
with: | |
aws-region: ${{ secrets.AWS_REGION }} | |
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
- name: Login to Amazon ECR Public Gallery | |
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 | |
with: | |
registry: public.ecr.aws | |
- name: Login to Docker Hub | |
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 | |
with: | |
username: ${{ secrets.DOCKERHUB_USERNAME }} | |
password: ${{ secrets.DOCKERHUB_TOKEN }} | |
- name: Login to GitHub Container Registry | |
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Login to Quay | |
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 | |
with: | |
registry: quay.io | |
username: ${{ secrets.QUAY_USERNAME }} | |
password: ${{ secrets.QUAY_TOKEN }} | |
# Build and push slim image | |
- name: Extract metadata for slim image | |
id: meta-slim | |
uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0 | |
with: | |
images: | | |
docker.io/nginxinc/nginx-unprivileged | |
ghcr.io/nginx/nginx-unprivileged | |
public.ecr.aws/nginx/nginx-unprivileged | |
quay.io/nginx/nginx-unprivileged | |
tags: | | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}.${{ needs.version.outputs.patch }}-alpine-slim | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}.${{ needs.version.outputs.patch }}-alpine${{ needs.version.outputs.distro }}-slim | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}-alpine-slim | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}-alpine${{ needs.version.outputs.distro }}-slim | |
type=raw,value=${{ needs.version.outputs.major }}-alpine-slim | |
type=raw,value=${{ needs.version.outputs.major }}-alpine${{ needs.version.outputs.distro }}-slim | |
type=raw,value=mainline-alpine-slim | |
type=raw,value=mainline-alpine${{ needs.version.outputs.distro }}-slim | |
type=raw,value=alpine-slim | |
type=raw,value=alpine${{ needs.version.outputs.distro }}-slim | |
env: | |
DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index | |
- name: Build and push NGINX mainline slim Alpine image | |
id: build-slim | |
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 | |
with: | |
platforms: linux/amd64, linux/arm/v6, linux/arm/v7, linux/arm64, linux/386, linux/ppc64le, linux/riscv64, linux/s390x | |
context: "{{ defaultContext }}:mainline/alpine-slim" | |
labels: ${{ steps.meta-slim.outputs.labels }} | |
annotations: ${{ steps.meta-slim.outputs.annotations }} | |
tags: ${{ steps.meta-slim.outputs.tags }} | |
push: true | |
# Build and push core image (needs slim image reference) | |
- name: Extract metadata for core image | |
id: meta-core | |
uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0 | |
with: | |
images: | | |
docker.io/nginxinc/nginx-unprivileged | |
ghcr.io/nginx/nginx-unprivileged | |
public.ecr.aws/nginx/nginx-unprivileged | |
quay.io/nginx/nginx-unprivileged | |
tags: | | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}.${{ needs.version.outputs.patch }}-alpine | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}.${{ needs.version.outputs.patch }}-alpine${{ needs.version.outputs.distro }} | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}-alpine | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}-alpine${{ needs.version.outputs.distro }} | |
type=raw,value=${{ needs.version.outputs.major }}-alpine | |
type=raw,value=${{ needs.version.outputs.major }}-alpine${{ needs.version.outputs.distro }} | |
type=raw,value=mainline-alpine | |
type=raw,value=mainline-alpine${{ needs.version.outputs.distro }} | |
type=raw,value=alpine | |
type=raw,value=alpine${{ needs.version.outputs.distro }} | |
env: | |
DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index | |
- name: Build and push NGINX mainline Alpine image | |
id: build-core | |
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 | |
with: | |
platforms: linux/amd64, linux/arm/v6, linux/arm/v7, linux/arm64, linux/386, linux/ppc64le, linux/riscv64, linux/s390x | |
context: "{{ defaultContext }}:mainline/alpine" | |
build-args: IMAGE=docker.io/nginxinc/nginx-unprivileged:${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}.${{ needs.version.outputs.patch }}-alpine-slim | |
labels: ${{ steps.meta-core.outputs.labels }} | |
annotations: ${{ steps.meta-core.outputs.annotations }} | |
tags: ${{ steps.meta-core.outputs.tags }} | |
push: true | |
# Build and push perl image | |
- name: Extract metadata for perl image | |
id: meta-perl | |
uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0 | |
with: | |
images: | | |
docker.io/nginxinc/nginx-unprivileged | |
ghcr.io/nginx/nginx-unprivileged | |
public.ecr.aws/nginx/nginx-unprivileged | |
quay.io/nginx/nginx-unprivileged | |
tags: | | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}.${{ needs.version.outputs.patch }}-alpine-perl | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}.${{ needs.version.outputs.patch }}-alpine${{ needs.version.outputs.distro }}-perl | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}-alpine-perl | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}-alpine${{ needs.version.outputs.distro }}-perl | |
type=raw,value=${{ needs.version.outputs.major }}-alpine-perl | |
type=raw,value=${{ needs.version.outputs.major }}-alpine${{ needs.version.outputs.distro }}-perl | |
type=raw,value=mainline-alpine-perl | |
type=raw,value=mainline-alpine${{ needs.version.outputs.distro }}-perl | |
type=raw,value=alpine-perl | |
type=raw,value=alpine${{ needs.version.outputs.distro }}-perl | |
env: | |
DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index | |
- name: Build and push NGINX mainline perl Alpine image | |
id: build-perl | |
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 | |
with: | |
platforms: linux/amd64, linux/arm/v6, linux/arm/v7, linux/arm64, linux/386, linux/ppc64le, linux/riscv64, linux/s390x | |
context: "{{ defaultContext }}:mainline/alpine-perl" | |
build-args: IMAGE=docker.io/nginxinc/nginx-unprivileged:${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}.${{ needs.version.outputs.patch }}-alpine | |
labels: ${{ steps.meta-perl.outputs.labels }} | |
annotations: ${{ steps.meta-perl.outputs.annotations }} | |
tags: ${{ steps.meta-perl.outputs.tags }} | |
push: true | |
# Build and push otel image | |
- name: Extract metadata for otel image | |
id: meta-otel | |
uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0 | |
with: | |
images: | | |
docker.io/nginxinc/nginx-unprivileged | |
ghcr.io/nginx/nginx-unprivileged | |
public.ecr.aws/nginx/nginx-unprivileged | |
quay.io/nginx/nginx-unprivileged | |
tags: | | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}.${{ needs.version.outputs.patch }}-alpine-otel | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}.${{ needs.version.outputs.patch }}-alpine${{ needs.version.outputs.distro }}-otel | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}-alpine-otel | |
type=raw,value=${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}-alpine${{ needs.version.outputs.distro }}-otel | |
type=raw,value=${{ needs.version.outputs.major }}-alpine-otel | |
type=raw,value=${{ needs.version.outputs.major }}-alpine${{ needs.version.outputs.distro }}-otel | |
type=raw,value=mainline-alpine-otel | |
type=raw,value=mainline-alpine${{ needs.version.outputs.distro }}-otel | |
type=raw,value=alpine-otel | |
type=raw,value=alpine${{ needs.version.outputs.distro }}-otel | |
env: | |
DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index | |
- name: Build and push NGINX mainline otel Alpine image | |
id: build-otel | |
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 | |
with: | |
platforms: linux/amd64, linux/arm64 | |
context: "{{ defaultContext }}:mainline/alpine-otel" | |
build-args: IMAGE=docker.io/nginxinc/nginx-unprivileged:${{ needs.version.outputs.major }}.${{ needs.version.outputs.minor }}.${{ needs.version.outputs.patch }}-alpine | |
labels: ${{ steps.meta-otel.outputs.labels }} | |
annotations: ${{ steps.meta-otel.outputs.annotations }} | |
tags: ${{ steps.meta-otel.outputs.tags }} | |
push: true | |