Skip to content

Update Docker Images #1091

Update Docker Images

Update Docker Images #1091

name: Update Docker Images
on:
schedule:
- cron: "0 1 * * *"
workflow_dispatch:
defaults:
run:
shell: bash
jobs:
variables:
name: Get version of base image
runs-on: ubuntu-20.04
outputs:
versions: ${{ steps.version.outputs.matrix }}
git_tag: ${{ steps.tag.outputs.git_tag }}
docker_platforms: ${{ steps.vars.outputs.docker_platforms }}
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get latest tag
id: tag
run: |
tag=$(git tag --sort=-version:refname | head -n1)
echo "git_tag=${tag//v}" >> $GITHUB_OUTPUT
- name: Checkout Repository at ${{ steps.tag.outputs.git_tag }}
uses: actions/checkout@v4
with:
ref: refs/tags/v${{ steps.tag.outputs.git_tag }}
- name: Set Base image version
id: version
run: |
nginx_alpine=library/nginx:$(grep -m1 "FROM.*nginx.*alpine" <Dockerfile | awk -F"[ :]" '{print $3}')
nginx=library/$(grep -m1 "FROM nginx:" < Dockerfile | awk -F" " '{print $2}')
echo "matrix=[{\"version\": \"${nginx}\", \"distro\": \"debian\"}, {\"version\": \"${nginx_alpine}\", \"distro\": \"alpine\"}]" >> $GITHUB_OUTPUT
- name: Set other variables
id: vars
run: |
echo "docker_platforms=$(grep "PLATFORMS:" .github/workflows/docker.yml | awk -F" " '{print $2}')" >> $GITHUB_OUTPUT
check:
name: Check if updates are needed
runs-on: ubuntu-20.04
needs: variables
outputs:
needs-updating-debian: ${{ steps.var.outputs.debian }}
needs-updating-alpine: ${{ steps.var.outputs.alpine }}
strategy:
matrix:
base_image: ${{ fromJson(needs.variables.outputs.versions) }}
steps:
- name: Build image tag
id: dist
run: |
if [ ${{ matrix.base_image.distro }} == "debian" ]; then dist=""; else dist="-${{ matrix.base_image.distro }}"; fi
echo "tag=${{ needs.variables.outputs.git_tag }}${dist}" >> $GITHUB_OUTPUT
- name: Check if update available ${{ matrix.base_image.version }}
id: update
uses: lucacome/docker-image-update-checker@v2
with:
base-image: ${{ matrix.base_image.version }}
image: opentracing/nginx-opentracing:${{ steps.dist.outputs.tag }}
- id: var
run: |
echo "${{ matrix.base_image.distro }}=${{ steps.update.outputs.needs-updating }}" >> $GITHUB_OUTPUT
build-docker:
if: ${{ needs.check.outputs.needs-updating-debian == 'true' || needs.check.outputs.needs-updating-alpine == 'true' }}
name: Build Docker Image
runs-on: ubuntu-20.04
needs: [check, variables]
strategy:
matrix:
include:
- os: debian
needs-updating: ${{ needs.check.outputs.needs-updating-debian }}
- os: alpine
needs-updating: ${{ needs.check.outputs.needs-updating-alpine }}
steps:
- name: Checkout Repository at ${{ needs.variables.outputs.git_tag }}
uses: actions/checkout@v4
with:
ref: refs/tags/v${{ needs.variables.outputs.git_tag }}
if: ${{ matrix.needs-updating == 'true' }}
- name: Output Variables
id: var
run: |
echo "nginx_version=$(grep -m1 'FROM nginx:' <Dockerfile | awk -F'[: ]' '{print $3}')" >> $GITHUB_OUTPUT
if: ${{ matrix.needs-updating == 'true' }}
- name: Setup QEMU
uses: docker/setup-qemu-action@v3
if: ${{ matrix.needs-updating == 'true' }}
- name: Docker Buildx
uses: docker/setup-buildx-action@v3
if: ${{ matrix.needs-updating == 'true' }}
- name: DockerHub Login
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
if: ${{ matrix.needs-updating == 'true' }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
if: ${{ matrix.needs-updating == 'true' }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
context: git
images: |
opentracing/nginx-opentracing
ghcr.io/opentracing-contrib/nginx-opentracing
flavor: |
latest=true
suffix=${{ matrix.os != 'debian' && '-' || '' }}${{ matrix.os != 'debian' && matrix.os || '' }},onlatest=true
tags: |
type=raw,value=${{ needs.variables.outputs.git_tag }}
type=raw,value=nginx-${{ steps.var.outputs.nginx_version }}
if: ${{ matrix.needs-updating == 'true' }}
- name: Build and push
uses: docker/build-push-action@v6
with:
pull: true
push: true
platforms: ${{ needs.variables.outputs.docker_platforms }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha,scope=${{ matrix.os }}
cache-to: type=gha,scope=${{ matrix.os }},mode=max
target: final
build-args: BUILD_OS=${{ matrix.os }}
if: ${{ matrix.needs-updating == 'true' }}