๐Ÿ”† Pengecekan & Laporan Konten Harian

Workflow otomatis untuk menjaga kebersihan folder dan memantau jumlah konten harian di GitHub Pages.

Workflow ini dibuat supaya repo tetap rapi dan laporan konten selalu up to date. Ia berjalan dapat setiap hari jam 21:00 UTC (atau sekitar jam 04:00 WIB) dan juga bisa dijalankan manual lewat tombol di GitHub Actions.

๐ŸŽฏ Tujuan Workflow

๐Ÿงฉ Job 1: Cleanup Gambar Orphan

Job pertama akan memindai semua file .webp di folder img/. Jika tidak ditemukan file HTML dengan nama yang sama di folder artikel/, maka file gambar tersebut dianggap yatim dan akan dihapus menggunakan perintah git rm.
for webp_file in img/*.webp; do
 base_name=$(basename "$webp_file" .webp)
 html_file="artikel/${base_name}.html"
 if [ ! -f "$html_file" ]; then
 git rm -f "$webp_file"
 fi
done

๐Ÿ“Š Job 2: Laporan & Badge

Setelah pembersihan, workflow akan menghitung file berdasarkan ekstensi (html, webp, png), membuat file laporan, serta membuat tiga badge:

๐Ÿ“œ Contoh Laporan Harian

LAPORAN KONTEN: artikel & img (10-22)
=================================
Total File: 104
HTML=53, webp=48, PNG=3
Ringkasan per ekstensi:
 53 html
 48 webp
 3 png
URL File HTML (dari folder 'artikel'):
https://dalam.web.id/artikel/nama-artikel.html
...

โš™๏ธ Kode Workflow Lengkap

Berikut adalah isi file workflow .github/workflows/laporan-konten.yml yang siap digunakan:

name: ๐Ÿ”† Pengecekan & Laporan Konten Harian
on:
 schedule:
 - cron: '0 21 * * *'
 workflow_dispatch:
jobs:
 cleanup:
 runs-on: ubuntu-latest
 permissions:
 contents: write
 steps:
 - name: Checkout repository
 uses: actions/checkout@v4
 with:
 fetch-depth: 0
 - name: Cari dan Hapus Gambar Orphan
 id: cleanup_step
 run: |
 echo "๐Ÿงน Memulai proses pembersihan gambar orphan..."
 DELETED_COUNT=0
 mkdir -p img
 shopt -s nullglob
 for webp_file in img/*.webp; do
 base_name=$(basename "$webp_file" .webp)
 html_file="artikel/${base_name}.html"
 if [ ! -f "$html_file" ]; then
 echo "-> Orphan: '$webp_file' tidak memiliki artikel. Menghapus..."
 git rm -f "$webp_file"
 DELETED_COUNT=$((DELETED_COUNT + 1))
 fi
 done
 shopt -u nullglob
 echo "deleted_count=$DELETED_COUNT" >> $GITHUB_OUTPUT
 - name: Commit & Push Hasil Pembersihan (jika ada)
 if: steps.cleanup_step.outputs.deleted_count != '0'
 run: |
 git config user.name "github-actions[bot]"
 git config user.email "github-actions[bot]@users.noreply.github.com"
 git commit -m "chore(cleanup): Hapus ${{ steps.cleanup_step.outputs.deleted_count }} gambar orphan .webp"
 git pull origin main --rebase
 git push
 - name: No Orphan Found
 if: steps.cleanup_step.outputs.deleted_count == '0'
 run: echo "โœ… Tidak ada gambar orphan ditemukan."
 reporting:
 needs: cleanup
 runs-on: ubuntu-latest
 permissions:
 contents: write
 steps:
 - name: Checkout repository
 uses: actions/checkout@v4
 - name: Setup Variables
 id: vars
 run: |
 TARGETS="artikel img"
 DATE=$(date +'%m-%d')
 REPORT="mini/${DATE}-laporan_konten.txt"
 echo "report_path=$REPORT" >> $GITHUB_OUTPUT
 echo "targets=$TARGETS" >> $GITHUB_OUTPUT
 echo "date=$DATE" >> $GITHUB_OUTPUT
 - name: Count Files by Extension
 id: counts
 run: |
 TARGETS="${{ steps.vars.outputs.targets }}"
 declare -A counts
 for ext in html webp png; do
 counts[$ext]=$(find $TARGETS -maxdepth 1 -type f -iname "*.$ext" | wc -l)
 done
 counts[all]=$(find $TARGETS -maxdepth 1 -type f | wc -l)
 for key in "${!counts[@]}"; do
 echo "$key=${counts[$key]}" >> $GITHUB_OUTPUT
 done
 - name: Generate Report
 run: |
 REPORT="${{ steps.vars.outputs.report_path }}"
 DATE="${{ steps.vars.outputs.date }}"
 TARGETS="${{ steps.vars.outputs.targets }}"
 PREFIX_ARTIKEL="https://dalam.web.id/artikel/"
 mkdir -p "$(dirname "$REPORT")"
 {
 echo "LAPORAN KONTEN: artikel & img ($DATE)"
 echo "================================="
 echo "Total File: ${{ steps.counts.outputs.all }}"
 echo "HTML=${{ steps.counts.outputs.html }}, webp=${{ steps.counts.outputs.webp }}, PNG=${{ steps.counts.outputs.png }}"
 echo ""
 echo "Ringkasan per ekstensi:"
 find $TARGETS -maxdepth 1 -type f -print | sed 's/.*\.//' | sort | uniq -c | sort -nr
 echo ""
 echo "URL File HTML:"
 find artikel -maxdepth 1 -type f -iname "*.html" | sed "s|^artikel/|$PREFIX_ARTIKEL|g" | sort
 } > "$REPORT"
 cat "$REPORT"
 - name: Install jq
 run: sudo apt-get update && sudo apt-get install -y jq
 - name: Buat Badge JSON
 run: |
 mkdir -p mini
 html=${{ steps.counts.outputs.html }}
 webp=${{ steps.counts.outputs.webp }}
 color=$(if (( html > webp )); then echo red; elif (( html < webp )); then echo green; else echo blue; fi)
 jq -n --arg m "$html" '{schemaVersion:1,label:"artikel",message:$m,color:"blue"}' > mini/html_count_badge.json
 jq -n --arg m "$webp" '{schemaVersion:1,label:"cover",message:$m,color:"green"}' > mini/webp_count_badge.json
 jq -n --arg mh "$html" --arg mj "$webp" --arg c "$color" '{schemaVersion:1,label:"html/webp",message:("\($mh) / \($mj)"),color:$c}' > mini/html_webp_badge.json
 - name: Rotate Reports
 run: |
 mkdir -p mini
 mapfile -t files < <(ls -1t mini/*-laporan_*.txt 2>/dev/null)
 if ((${#files[@]} > 7)); then
 printf '%s\n' "${files[@]:7}" | xargs rm -f
 fi
 - name: Commit, Pull, and Push Changes
 run: |
 git config --global user.name 'github-actions[bot]'
 git config --global user.email '41898282+github-actions[bot]@users.noreply.github.com'
 git add mini/*
 if ! git diff --staged --quiet; then
 git commit -m "chore: update laporan & badge konten" --author="frijal <[email protected]>"
 git pull origin main --rebase
 git push
 else
 echo "โœ… Tidak ada perubahan baru untuk di-commit."
 fi