Alur Kerja Cerdas: Satu Job untuk Semua Tugas Perawatan Harian 🚀

Sebuah studi kasus tentang cara mengubah workflow yang terpisah-pisah menjadi satu proses tunggal yang efisien, bersih, dan atomik.

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 checkout repositori 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