From 90598056d4399eb79879c713bba35083b20664f0 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 17 May 2026 17:24:34 +0200 Subject: [PATCH] ci: build slides via Forgejo Actions runner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds .forgejo/workflows/build-slides.yml triggering on push to main and manual dispatch. Job runs in node:20-bookworm-slim, installs marp-cli + python3, mounts /srv/slides/html into /output, and invokes build-slides.sh with OUTPUT_DIR=/output. build-slides.sh now honors OUTPUT_DIR/SLIDES_TITLE/REPO_WEB_URL env overrides (defaults preserve local-dev behavior), wipes stale .html before each build, and regenerates a styled index.html listing every deck — replacing the equivalent logic from the old webhook update.sh. Co-Authored-By: Claude Opus 4.7 (1M context) --- .forgejo/workflows/build-slides.yml | 29 ++++++++++++++++++ build-slides.sh | 47 +++++++++++++++++++++++------ 2 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 .forgejo/workflows/build-slides.yml diff --git a/.forgejo/workflows/build-slides.yml b/.forgejo/workflows/build-slides.yml new file mode 100644 index 0000000..b0a7f3a --- /dev/null +++ b/.forgejo/workflows/build-slides.yml @@ -0,0 +1,29 @@ +name: Build slides + +on: + push: + branches: [main] + workflow_dispatch: + +jobs: + build: + runs-on: self-hosted + container: + image: node:20-bookworm-slim + volumes: + - /srv/slides/html:/output + env: + OUTPUT_DIR: /output + steps: + - name: Install build dependencies + run: | + set -e + apt-get update -qq + apt-get install -y --no-install-recommends git python3 ca-certificates + npm install -g @marp-team/marp-cli + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Build slides into /output + run: bash build-slides.sh diff --git a/build-slides.sh b/build-slides.sh index 417a5c6..5e9732d 100755 --- a/build-slides.sh +++ b/build-slides.sh @@ -2,7 +2,14 @@ set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -OUTPUT_DIR="$REPO_ROOT/slides" +OUTPUT_DIR="${OUTPUT_DIR:-$REPO_ROOT/slides}" +SLIDES_TITLE="${SLIDES_TITLE:-MakerFLOSS Slides}" +REPO_WEB_URL="${REPO_WEB_URL:-https://forgejo.makerfloss.eu/sjat/MakerFLOSS}" + +mkdir -p "$OUTPUT_DIR" + +# Wipe previously built slides so deleted/de-tagged .md files disappear. +find "$OUTPUT_DIR" -maxdepth 1 -name "*.html" -delete # Find all markdown files with marp: true frontmatter SLIDES=() @@ -18,7 +25,7 @@ fi echo "Found ${#SLIDES[@]} presentation(s):" printf ' %s\n' "${SLIDES[@]}" -# Create temp output directory for Docker +# Create temp output directory for Docker fallback TEMP_OUTPUT=$(mktemp -d) chmod 777 "$TEMP_OUTPUT" trap "rm -rf '$TEMP_OUTPUT'" EXIT @@ -27,7 +34,6 @@ if command -v marp &>/dev/null; then marp --html --output "$OUTPUT_DIR/" "${SLIDES[@]}" else echo "marp not found locally — using Docker (marpteam/marp-cli)..." - # Process each slide individually in Docker for slide in "${SLIDES[@]}"; do REL_SLIDE="${slide#${REPO_ROOT}/}" BASENAME=$(basename "${slide%.*}") @@ -36,14 +42,9 @@ else -v "$TEMP_OUTPUT":/home/marp/output \ marpteam/marp-cli --html --output "/home/marp/output/${BASENAME}.html" "$REL_SLIDE" done + cp "$TEMP_OUTPUT"/*.html "$OUTPUT_DIR/" 2>/dev/null || true fi -# Ensure output directory exists -mkdir -p "$OUTPUT_DIR" - -# Copy generated HTML files to final output directory -cp "$TEMP_OUTPUT"/*.html "$OUTPUT_DIR/" 2>/dev/null || true - # Inject mermaid.js into any HTML that contains mermaid code blocks. # Marp emits fenced mermaid blocks as
.
 # The script finds those elements, replaces them with 
, @@ -90,4 +91,32 @@ else echo "Warning: python3 not found — skipping mermaid injection" fi +# Regenerate index.html listing every built deck. +INDEX="$OUTPUT_DIR/index.html" +{ + printf '' + printf '' + printf '%s' "$SLIDES_TITLE" + printf '' + printf '

%s

' "$SLIDES_TITLE" + printf '

Built from %s

' \ + "$REPO_WEB_URL" "${REPO_WEB_URL#https://}" + printf '
    ' + find "$OUTPUT_DIR" -maxdepth 1 -name "*.html" ! -name "index.html" | sort | while IFS= read -r html; do + name=$(basename "$html" .html) + printf '
  • %s
  • ' "$(basename "$html")" "$name" + done + printf '
' + printf '' "$(date -Iseconds)" + printf '' +} > "$INDEX" + echo "Done — slides in $OUTPUT_DIR/"