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
- ๐งน Membersihkan file gambar orphan (.webp) yang tidak memiliki artikel HTML pasangannya.
- ๐งพ Menghitung jumlah artikel, cover, dan total file dalam folder
artikel&img. - ๐ Membuat laporan harian dalam bentuk file teks & badge JSON.
๐งฉ 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:
- artikel Jumlah file HTML
- cover Jumlah file WebP
- html/webp Perbandingan total keduanya
๐ 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