Skip to content

Image Builder

Image Builder #618

Workflow file for this run

name: Image Builder
on:
push:
branches:
- main
paths:
- alpine/freeze/**
- static/freeze/**
- ubuntu/freeze/**
workflow_dispatch:
inputs:
pandoc_version:
description: >-
Pandoc version; must be either `main` or a release number
default: main
type: string
base_system:
description: Docker base system
default: alpine
type: choice
options:
- alpine
- ubuntu
- static
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- uses: actions/checkout@v4
- id: set-matrix
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "matrix={\"include\":[{\"stack\":\"${{ inputs.base_system }}\",\"version\":\"${{ inputs.pandoc_version }}\"}]}" >> $GITHUB_OUTPUT
else
CHANGED_FILES=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }})
MATRIX="{\"include\":["
FIRST=true
for STACK in alpine ubuntu static; do
if echo "$CHANGED_FILES" | grep -q "^$STACK/"; then
FREEZE_FILE=$(echo "$CHANGED_FILES" | grep "^$STACK/.*\.project\.freeze$" | head -1)
if [ -n "$FREEZE_FILE" ]; then
VERSION=$(basename "$FREEZE_FILE" | sed -E 's/pandoc-(.*)\.project\.freeze/\1/')
if [ "$FIRST" = true ]; then
FIRST=false
else
MATRIX="${MATRIX},"
fi
MATRIX="${MATRIX}{\"stack\":\"${STACK:-alpine}\",\"version\":\"${VERSION:-main}\"}"
fi
fi
done
MATRIX="${MATRIX}]}"
echo "matrix=$MATRIX" >> $GITHUB_OUTPUT
fi
core:
name: minimal and core (${{ matrix.stack }})
needs: prepare
runs-on: ubuntu-latest
strategy:
matrix: ${{ fromJSON(needs.prepare.outputs.matrix) }}
fail-fast: false
steps:
- uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
version: "lab:latest"
driver: cloud
endpoint: "pandoc/multiarch"
- name: minimal
timeout-minutes: 25
uses: ./.github/actions/build
with:
image_type: minimal
base_system: ${{ matrix.stack }}
pandoc_version: ${{ matrix.version }}
dockerfile: ${{ matrix.stack }}/Dockerfile
target: ${{ matrix.stack }}-minimal
- name: core
uses: ./.github/actions/build
if: ${{ matrix.stack != 'static' }}
with:
image_type: core
base_system: ${{ matrix.stack }}
pandoc_version: ${{ matrix.version }}
dockerfile: ${{ matrix.stack }}/Dockerfile
target: ${{ matrix.stack }}-core
typst:
name: Typst (${{ matrix.stack }})
if: ${{ !contains(toJSON(needs.prepare.outputs.matrix), '"stack":"static"') }}
needs: [prepare, core]
strategy:
matrix: ${{ fromJSON(needs.prepare.outputs.matrix) }}
fail-fast: false
uses: ./.github/workflows/addon.yaml
secrets: inherit
with:
addon: typst
base_system: ${{ matrix.stack }}
pandoc_version: ${{ matrix.version }}
latex:
name: LaTeX (${{ matrix.stack }})
if: ${{ !contains(toJSON(needs.prepare.outputs.matrix), '"stack":"static"') }}
needs: [prepare, core]
strategy:
matrix: ${{ fromJSON(needs.prepare.outputs.matrix) }}
fail-fast: false
uses: ./.github/workflows/addon.yaml
secrets: inherit
with:
addon: latex
base_system: ${{ matrix.stack }}
pandoc_version: ${{ matrix.version }}
extra:
name: Extra (${{ matrix.stack }})
if: ${{ !contains(toJSON(needs.prepare.outputs.matrix), '"stack":"static"') }}
needs: [prepare, latex]
strategy:
matrix: ${{ fromJSON(needs.prepare.outputs.matrix) }}
fail-fast: false
uses: ./.github/workflows/addon.yaml
secrets: inherit
with:
addon: extra
base_system: ${{ matrix.stack }}
pandoc_version: ${{ matrix.version }}