name: publish # Jeder neue Artikel unter artikel/ wird zu: # - einem Release (taggt den Artikel, erzeugt automatisch einen Atom-Feed-Eintrag) # - einer Discussion in der Kategorie Announcements (der Kommentarthread) # # Veroeffentlichen ist damit: git push. on: push: branches: [main] paths: - 'artikel/**' permissions: contents: write discussions: write jobs: release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Neue Artikel veroeffentlichen env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} BEFORE: ${{ github.event.before }} AFTER: ${{ github.sha }} CATEGORY: ${{ vars.DISCUSSION_CATEGORY || 'Announcements' }} run: | set -euo pipefail # Erster Push oder Force-Push: BEFORE ist unbrauchbar, dann alles nehmen. if git cat-file -e "${BEFORE}^{commit}" 2>/dev/null; then FILES="$(git diff --name-only --diff-filter=A "${BEFORE}" "${AFTER}" -- artikel | grep '\.md$' || true)" else FILES="$(git ls-files -- artikel | grep '\.md$' || true)" fi if [ -z "${FILES}" ]; then echo "Keine neuen Artikel in diesem Push." exit 0 fi echo "Gefunden:" echo "${FILES}" while IFS= read -r file; do [ -n "$file" ] || continue [ -f "$file" ] || continue slug="$(basename "$file" .md)" # Vorlagen und Entwuerfe (fuehrender Unterstrich) werden nicht veroeffentlicht. case "$slug" in _*) echo "Vorlage/Entwurf ${file}, uebersprungen."; continue ;; esac tag="artikel/${slug}" if gh release view "$tag" >/dev/null 2>&1; then echo "Release ${tag} existiert bereits, uebersprungen." continue fi # Titel aus dem Frontmatter, sonst aus der ersten H1, sonst der Slug. title="$(sed -n 's/^title:[[:space:]]*//p' "$file" | head -n1 | sed 's/^"//; s/"$//')" if [ -z "$title" ]; then title="$(sed -n 's/^# //p' "$file" | head -n1)" fi [ -n "$title" ] || title="$slug" # Frontmatter aus den Release-Notes entfernen. body="$(mktemp)" awk ' NR==1 && $0=="---" { fm=1; next } fm==1 && $0=="---" { fm=0; next } fm!=1 { print } ' "$file" > "$body" echo "Veroeffentliche: ${title} -> ${tag}" gh release create "$tag" \ --title "$title" \ --notes-file "$body" \ --discussion-category "$CATEGORY" done <<< "${FILES}"