Masalahnya: Terlalu Banyak Job, Terlalu Boros
Awalnya, saya punya workflow harian yang dibagi menjadi beberapa job: satu untuk membersihkan gambar, satu lagi untuk membuat laporan. Secara logika ini benar, tapi secara teknis sangat tidak efisien. Kenapa?
- Boros `checkout`: Setiap job harus melakukan
checkoutrepositori dari awal. Ini membuang waktu. - Riwayat Commit Berantakan: Setiap job membuat commit-nya sendiri-sendiri, menghasilkan riwayat Git yang "berisik".
- Potensi Masalah Timing: Data yang digunakan oleh job kedua mungkin sudah usang karena tidak melihat perubahan yang dibuat oleh job pertama.
Solusinya? Rombak total dan gabungkan semuanya ke dalam satu job tunggal dengan urutan proses yang logis.
Solusi: Satu Alur Kerja, Satu Tujuan
Dengan satu job, kita bisa mengatur urutan tugas dengan sempurna: buat dulu aset baru, bersihkan yang lama, lalu laporkan kondisi finalnya. Semua dalam satu proses yang mulus.
Langkah 1: Buat Aset Baru (Generate Screenshots)
Proses dimulai dengan membuat aset yang mungkin belum ada. Skrip Puppeteer dijalankan untuk membuat screenshot artikel yang belum memiliki gambar cover.
Langkah 2: Bersihkan Aset Lama (Cleanup Orphans)
Setelah semua gambar yang seharusnya ada sudah dibuat, sekarang waktunya bersih-bersih. Skrip akan mencari gambar .webp yang artikelnya sudah tidak ada lagi (orphan) dan menghapusnya.
Langkah 3: Laporkan Kondisi Final (Count & Report)
Setelah semua aset ada di tempatnya dan yang tidak perlu sudah dibuang, barulah kita menghitung dan membuat laporan. Hasil laporan ini akan menjadi cerminan akurat dari kondisi repo saat itu.
Langkah Final: Satu Commit untuk Semua
Inilah bagian terbaiknya. Semua perubahan—gambar baru, gambar yang dihapus, dan laporan baru—dikemas ke dalam satu commit atomik. Riwayat Git menjadi bersih dan mudah dibaca.
Kode Final Workflow:
Inilah wujud akhir dari workflow yang sudah dioptimalkan. Satu job, satu tujuan, efisiensi maksimal.
name: 🔆 Perawatan & Laporan Konten Harian
on:
schedule:
- cron: '0 21 * * *'
workflow_dispatch:
jobs:
maintenance_and_reporting:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: '1. Checkout Repository'
uses: actions/checkout@v4
with: { fetch-depth: 0 }
- name: '2. Setup Node.js'
uses: actions/setup-node@v4
with: { node-version: '20' }
- name: '3. Generate Missing Screenshots'
run: |
npm install puppeteer --no-save
node ext/screenshot-puppeteer.js
- name: '4. Cari dan Hapus Gambar Orphan'
id: cleanup_step
run: |
# ... (script cleanup) ...
- name: '5. Hitung File & Buat Laporan'
run: |
# ... (script reporting) ...
- name: '6. Rotasi Laporan Lama'
run: |
# ... (script rotasi) ...
- name: '7. Hapus File Sementara'
run: rm -rf tmp/ __pycache__/
- name: '8. Commit All 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 img/ mini/
if ! git diff --staged --quiet; then
git commit -m "chore: Daily maintenance (screenshots, cleanup, report)"
git pull origin main --rebase
git push
else
echo "✅ Tidak ada perubahan baru."
fi