Gua lihat banyak tim yang masih manual ngejalankan skrip setiap hari. Padahal, Hermes udah punya fitur cron job yang bisa ngotomatisasi tugas berulang tanpa ribet. Artikel ini bakal ngajak kamu dari nol: kenapa cron job penting, gimana cara set upnya, sampai tips ampuh agar tidak gagal diam-diam.

---

Kenapa Cron Job Penting di Hermes?

Cron job adalah fitur di Hermes yang memungkinkan kamu menjadwalkan eksekusi skrip atau pipeline secara otomatis. Bayangkan: setiap pagi jam 7, Hermes bisa nge-generate laporan harian, ngirim notifikasi ke Slack, atau update database tanpa kamu perlu sentuh apapun. Ini bukan cuma soal efisiensi, tapi juga soal konsistensi. Manual execution rentan lupa, telat, atau human error. Cron job menghilangkan variabel manusia dari proses berulang.

Di Hermes, cron job terintegrasi dengan workflow yang sudah kamu buat. Jadi, bukan cuma menjalankan skrip mentah, tapi juga bisa memicu seluruh pipeline yang sudah terkonfigurasi. Misal, pipeline yang ngumpulin data, olah, lalu kirim ke tim. Semua bisa berjalan otomatis sesuai jadwal.

---

Anatomi Cron Job di Hermes

Sebelum setup, kamu perlu ngerti struktur dasar cron job di Hermes. Setiap cron job punya empat komponen utama: schedule, prompt, deliver, dan no_agent.

Schedule: Kapan Cron Berjalan

Format schedule di Hermes mengikuti syntax cron standar, tapi dengan sedikit penyederhanaan. Contoh:

  • 0 7 * * * = setiap hari jam 7 pagi.
  • */30 * * * * = setiap 30 menit sekali.
  • 0 0 * * 1 = setiap Senin jam 12 malam.

Hermes mendukung timezone, jadi set timezone yang benar di pengaturan proyek. Salah timezone bisa bikin cron berjalan di waktu yang salah.

Prompt: Apa yang Dikerjakan

Prompt adalah instruksi yang bakal dieksekusi saat cron berjalan. Ini bisa berupa:

  • Perintah untuk menjalankan skrip Python, Bash, atau Node.js.
  • Pemicu untuk pipeline Hermes yang sudah terdefinisi.
  • Query database atau API call.

Contoh prompt sederhana:

python3 /path/to/your_script.py --date $(date +%Y-%m-%d)

Prompt ini menjalankan skrip Python dengan argumen tanggal hari ini.

Deliver: Kemana Hasil Dikirim

Hasil eksekusi cron job bisa dikirim ke berbagai tujuan:

  • Local: Simpan output ke file atau database.
  • Slack: Kirim notifikasi atau file ke channel Slack.
  • Telegram: Kirim pesan atau dokumen ke grup/channel Telegram.

Setiap opsi punya trade-off. Slack bagus untuk tim yang sudah aktif di sana, tapi punya batasan ukuran file. Telegram lebih fleksibel untuk file besar, tapi tim kamu perlu punya akses. Local paling aman tapi butuh setup tambahan untuk akses tim.

no_agent vs Agent Mode

Ini salah satu yang sering bikin bingung. no_agent berarti cron job berjalan tanpa intervensi agen Hermes. Skrip dijalankan langsung di server, seperti layaknya cron di Linux. Cocok untuk tugas ringan yang tidak butuh konteks atau memory lama, misal ngumpulin data atau backup.

Agent mode berarti cron job berjalan dengan agen Hermes yang aktif. Agen bisa menyimpan state, punya memory, dan bisa melanjutkan tugas yang terinterupsi. Cocok untuk tugas kompleks yang butuh konteks, misal analisis data bertahap atau interaksi dengan user.

Kapan pakai yang mana?

  • no_agent: Tugas sederhana, tidak saling bergantung, dan tidak butuh state. Contoh: backup database harian.
  • Agent mode: Tugas yang butuh memory, saling bergantung, atau interaktif. Contoh: pipeline yang ngolah data dari hari ke hari dan butuh referensi ke hasil hari sebelumnya.

---

Step-by-Step: Setup Cron Job Pertamamu

Langkah 1: Buat Skrip Sederhana

Sebelum setup cron, kamu perlu skrip yang mau dijalankan. Contoh, buat skrip Python sederhana untuk morning briefing:

# morning_briefing.py
import datetime

def generate_briefing():
    today = datetime.date.today().strftime("%A, %d %B %Y")
    briefing = f"Morning Briefing - {today}\n\n"
    briefing += "- Cuaca hari ini: Cerah\n"
    briefing += "- Tugas prioritas: Review PR, Standup jam 10\n"
    briefing += "- Catatan: Jangan lupa minum air!"
    return briefing

if __name__ == "__main__":
    print(generate_briefing())

Simpan di /scripts/morning_briefing.py. Test dulu skrip bisa jalan manual dengan:

python3 /scripts/morning_briefing.py

Langkah 2: Definisikan Cron Job di Hermes

Di dashboard Hermes, buka menu Cron Jobs > Create New Cron Job. Isi formulirnya:

  • Name: morning-briefing
  • Schedule: 0 7 * * * (setiap hari jam 7 pagi)
  • Prompt:

```bash python3 /scripts/morning_briefing.py > /output/briefing_$(date +%Y-%m-%d).txt ```

  • Deliver: Pilih Local (simpan ke file)
  • Mode: no_agent (karena tugas sederhana)
  • Output Path: /output/briefing_$(date +%Y-%m-%d).txt

Simpan. Sekarang cron job sudah terdefinisi, tapi belum aktif.

Langkah 3: Test Cron Job

Sebelum mengaktifkan, test dulu dengan menjalankan manual. Di Hermes, ada tombol Run Now di detail cron job. Klik, lalu cek apakah file output terbuat di /output/.

Jika file tidak muncul, cek:

  • Apakah path skrip benar?
  • Apakah Python terinstall di lingkungan Hermes?
  • Apakah direktori /output/ punya permission tulis?

Langkah 4: Aktifkan Cron Job

Jika test berhasil, aktifkan cron job dengan toggle Enable. Mulai besok pagi jam 7, skrip akan berjalan otomatis.

Langkah 5: Deliver ke Slack (Opsional)

Jika mau kirim ke Slack, ubah Deliver ke Slack dan isi:

  • Webhook URL: URL webhook Slack channel kamu.
  • Message:

```text Morning Briefing untuk *$(date +%A, %d %B %Y)*: $(cat /output/briefing_$(date +%Y-%m-%d).txt) ```

Cek format message valid. Slack butuh format yang rapi agar pesan terlihat bagus.

--- ---

Guard Pattern: Cegah Double-Run

Salah satu masalah umum cron job adalah double-run: skrip berjalan dua kali dalam waktu bersamaan. Ini bisa terjadi karena:

  • Server restart dan cron job terpicu ulang.
  • Timezone change yang bikin jadwal overlap.
  • Bug di Hermes yang nge-trigger cron ganda.

Untuk cegah ini, gunakan guard pattern dengan file lock. Modifikasi skrip morning_briefing.py:

# morning_briefing.py
import datetime
import os
import sys

LOCK_FILE = "/tmp/morning_briefing.lock"

def is_running():
    return os.path.exists(LOCK_FILE)

def create_lock():
    with open(LOCK_FILE, "w") as f:
        f.write(str(os.getpid()))

def remove_lock():
    if os.path.exists(LOCK_FILE):
        os.remove(LOCK_FILE)

def generate_briefing():
    today = datetime.date.today().strftime("%A, %d %B %Y")
    briefing = f"Morning Briefing - {today}\n\n"
    briefing += "- Cuaca hari ini: Cerah\n"
    briefing += "- Tugas prioritas: Review PR, Standup jam 10\n"
    briefing += "- Catatan: Jangan lupa minum air!"
    return briefing

if __name__ == "__main__":
    if is_running():
        print("Cron job sudah berjalan. Skip.")
        sys.exit(0)

    try:
        create_lock()
        briefing = generate_briefing()
        print(briefing)
    finally:
        remove_lock()

Dengan ini, kalau cron job berjalan ganda, yang kedua akan terblokir oleh lock file.

--- ---

Debug: Cron Silent atau Gagal

Cron job yang gagal seringkali silent—tidak keluar error, cuma diam. Ini bikin susah debug. Beberapa cara untuk debug:

1. Cek Log Hermes

Di dashboard Hermes, setiap cron job punya log eksekusi. Buka Cron Jobs > pilih cron job > tab Logs. Di sini kamu bisa lihat:

  • Kapan cron berjalan.
  • Output stdout/stderr.
  • Exit code (0 = sukses, non-zero = gagal).

Jika log kosong, kemungkinan cron job belum terpicu atau gagal sebelum sempat tulis log.

2. Redirect Output ke File

Selalu redirect output cron job ke file, biar bisa dicek nanti. Contoh prompt:

python3 /scripts/morning_briefing.py > /logs/briefing_$(date +%Y-%m-%d).log 2>&1

2>&1 berarti stderr ikut diarahkan ke file yang sama.

3. Test di Lingkungan yang Sama

Kadang cron gagal karena lingkungan yang berbeda. Misal, skrip butuh environment variable yang cuma ada di shell interaktif. Solusinya:

  • Definisikan environment variable di pengaturan Hermes.
  • Atau, tambahkan di prompt:

```bash export MY_VAR=value && python3 /scripts/morning_briefing.py ```

4. Gunakan Health Check

Tambahkan health check di skrip untuk cek semuanya berjalan. Contoh:

# Tambahan di morning_briefing.py
import requests

def health_check():
    try:
        response = requests.get("https://healthcheck.example.com", timeout=5)
        if response.status_code != 200:
            print("Health check failed!")
            sys.exit(1)
    except requests.RequestException:
        print("Health check timeout!")
        sys.exit(1)

if __name__ == "__main__":
    health_check()
    # ... sisa kode

5. Notifikasi Gagal

Aktifkan notifikasi gagal di Hermes. Di pengaturan cron job, ada opsi Notify on Failure. Pilih Email atau Slack untuk dapat pemberitahuan kalau cron gagal.

--- ---

Deliver: Slack vs Telegram vs Local

Pilihan deliver punya trade-off masing-masing. Berikut breakdown untuk bantu kamu pilih:

Slack

Kelebihan:

  • Terintegrasi dengan baik untuk tim yang sudah pakai Slack.
  • Bisa format pesan dengan Markdown.
  • Support attachment (file, gambar) langsung di pesan.

Kekurangan:

  • Batasan ukuran file (10MB untuk free tier, 1GB untuk paid).
  • Webhook bisa kadaluarsa kalau tidak dipakai lama.
  • Notifikasi bisa terlalu banyak kalau channel sibuk.

Kapan pakai:

  • Tim kecil hingga menengah.
  • Tugas yang outputnya ringan (text, small files).
  • Butuh interaksi langsung (misal, tim perlu balas pesan).

Telegram

Kelebihan:

  • Batasan file lebih besar (2GB).
  • Bisa kirim ke grup, channel, atau private message.
  • Lebih fleksibel untuk format pesan (HTML, Markdown).

Kekurangan:

  • Tim perlu punya Telegram dan bergabung di grup/channel.
  • Kurang integrasi dengan tools bisnis lain (dibanding Slack).
  • Bot API butuh setup tambahan.

Kapan pakai:

  • Tim yang sudah aktif di Telegram.
  • Output cron job berupa file besar (report, dataset).
  • Butuh privasi lebih (Telegram punya secret chat).

Local

Kelebihan:

  • Tidak tergantung platform eksternal.
  • Data tersimpan di server kamu, lebih aman.
  • Tidak ada batasan ukuran (tergantung storage server).

Kekurangan:

  • Tim butuh akses ke server untuk ambil output.
  • Tidak ada notifikasi otomatis (harus setup sendiri).
  • Riskan kalau server down atau storage penuh.

Kapan pakai:

  • Data sensitif yang tidak boleh keluar server.
  • Tugas yang outputnya cuma perlu disimpan, tidak perlu langsung dilihat tim.
  • Lingkungan dengan storage besar dan aman.

Pertanyaan Umum

Cron job adalah fitur penjadwalan di Hermes yang bisa jalankan skrip atau pipeline secara otomatis sesuai jadwal yang kamu tentukan, misal setiap hari jam 7 pagi.

Gunakan tombol Run Now di dashboard Hermes, lalu cek apakah output sesuai ekspektasi sebelum kamu aktifkan toggle Enable.

no_agent menjalankan skrip langsung di server tanpa agen Hermes, cocok untuk tugas sederhana. agent mode memakai agen Hermes yang bisa simpan state dan memory, cocok untuk tugas kompleks yang butuh konteks.

Cek log Hermes di dashboard, redirect output ke file, test di lingkungan yang sama, tambahkan health check, dan aktifkan notifikasi gagal.

Pakai guard pattern dengan file lock. Buat file lock saat cron mulai, hapus saat selesai. Kalau cron berjalan ganda, yang kedua akan terblokir.

Pakai Slack untuk tim kecil dengan output ringan, Telegram untuk file besar atau privasi lebih, dan Local untuk data sensitif yang tidak boleh keluar server.

Butuh Bantuan Implementasi?

Saya membantu founder dan tim membangun sistem operasi yang bisa jalan tanpa pengawasan konstan.

Hubungi Saya