Workflow n8n adalah kode JSON yang layak diperlakukan seperti kode biasa. Di episode ini kita membawa workflow ke dalam Git, mengotomasi deployment lewat pipeline CI/CD, dan menambahkan lapisan testing agar setiap perubahan terverifikasi sebelum menyentuh produksi.

Di episode 17 kalian membuat custom node dan memasang ekstensi untuk kebutuhan yang tidak tersedia di node bawaan. Secara teknis workflow kalian sudah matang — tapi masih ada satu celah besar: perubahan workflow tidak terdokumentasi dan tidak terkontrol. Kalau dua orang mengedit workflow yang sama di instance produksi, siapa yang bertanggung jawab kalau tiba-tiba rusak? Perubahan mana yang menyebabkannya?
Jawabannya adalah membawa workflow ke dalam lifecycle pengembangan perangkat lunak yang sudah umum: version control, pipeline deployment, dan testing. Di episode ini kita membahas:
Setiap workflow n8n pada dasarnya adalah satu dokumen JSON. Ia berisi array nodes yang mendeskripsikan setiap node — tipe, posisi, parameter, dan kredensial yang dipakai — serta array connections yang menyimpan bagaimana node-node saling terhubung.
Karena formatnya berbasis teks, workflow bisa di-diff, di-review, dan di-versioning seperti file kode biasa:
{
"name": "Sales Lead Enrichment",
"nodes": [
{
"id": "abc-123",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [0, 0]
},
{
"id": "def-456",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"parameters": { "url": "https://api.example.com/enrich" }
}
],
"connections": {
"Webhook": { "main": [[{ "node": "HTTP Request", "type": "main", "index": 0 }]] }
}
}Baca dengan teliti: type menentukan node yang dipakai, parameters menyimpan konfigurasi, dan connections memetakan aliran data antar node. Karena semua ini teks, satu baris yang berubah di pull request sudah cukup untuk menunjukkan "hapus node ini, tambah node itu".
Info
Dalam export default, field kredensial hanya menyimpan ID referensi, bukan nilai rahasianya. Ini menguntungkan keamanan repositori — tapi berarti proses restore harus menyediakan kredensial yang sebenarnya dari vault, bukan dari Git.
Untuk membawa workflow ke Git, gunakan perintah export bawaan n8n. Arahkan ke folder proyek yang sudah diinisialisasi Git:
n8n export:workflow --all --output=./workflows --pretty --separate
git add workflows/
git commit -m "chore: sync workflow ke repository"Flag --separate membuat setiap workflow menjadi satu file JSON sendiri di dalam folder workflows, sehingga riwayat tiap file bisa ditelusuri terpisah. --pretty membuat JSON mudah dibaca saat code review. Setelah komit pertama ini, setiap perubahan di editor bisa disinkronkan ulang dan di-commit dengan pesan yang menjelaskan alasannya.
Beberapa kebiasaan yang membuat versioning lebih sehat:
fix: perbaiki mapping field di lead workflow atau feat: tambah cabang approval.credentials/ ke .gitignore bila ada file credential yang ikut tersinkron, dan jadikan repository hanya berisi definisi, bukan rahasia.--separate agar konflik merge tidak bergulir ke seluruh instance.Kredensial adalah satu-satunya hal yang tidak boleh ikut di-commit. n8n menyimpannya terenkripsi di database dengan kunci N8N_ENCRYPTION_KEY. Untuk backup atau migrasi, export credential secara terpisah dan simpan di vault:
n8n export:credential --all --output=./credentials --decryptedFile hasil export ini berisi rahasia dalam bentuk terdekripsi — jangan pernah masuk Git. Simpan di manager rahasia seperti Vault atau AWS Secrets Manager, lalu import kembali saat restore. Di repositori, cukup referensikan nama credential agar developer tahu koneksi mana yang dibutuhkan, tanpa nilai sebenarnya.
Repositori yang baik memisahkan environment. Satu pola umum: folder workflows berisi file .workflow.json versi sumber, sementara nilai environment-spesifik seperti base URL atau API key staging disuntikkan lewat environment variable saat runtime.
Struktur yang biasa dipakai tim produksi:
repo-automasi/
├── workflows/ # export n8n:workflow, satu file per workflow
│ ├── sales-lead-enrichment.workflow.json
│ └── order-fulfillment.workflow.json
├── credentials/ # tidak di-commit, hanya dipakai saat restore
├── tests/ # test definitions untuk n8n test
├── scripts/
│ └── deploy.sh # wrapper import untuk environment tertentu
└── .github/
└── workflows/ # pipeline CI/CDDengan struktur ini, tahap deploy cukup sederhana: import semua file workflow ke instance target. Skrip di bawah membaca env var N8N_BASE_URL dan N8N_USER_API_KEY agar menunjuk ke environment yang benar:
n8n import:workflow --separate --input=./workflows
n8n import:credential --all --input=./credentialsImport akan menggabungkan (upsert) workflow berdasarkan nama atau ID, sehingga workflow yang sudah tidak ada di repositori tidak akan terhapus otomatis — jadikan penghapusan itu bagian dari checklist deploy, bukan improvisasi.
Dengan semua versi di Git, pipeline CI/CD tinggal mengulang langkah yang sama di setiap push ke branch produksi. Contoh workflow GitHub Actions berikut men-deploy ke staging saat ada push ke main:
name: Deploy Workflows
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Pasang n8n CLI
run: npm install -g n8n
- name: Validasi JSON workflow
run: |
for f in workflows/*.json; do jq empty "$f"; done
- name: Import workflow ke n8n
run: n8n import:workflow --separate --input=./workflows
env:
N8N_BASE_URL: ${{ secrets.N8N_BASE_URL }}
N8N_USER_API_KEY: ${{ secrets.N8N_USER_API_KEY }}Yang patut diperhatikan:
jq empty menangkap file rusak sebelum import — murah, cepat, dan menyelamatkan dari error di tengah pipeline.tags dengan pola v*.Tim yang memakai mode queue dengan beberapa worker (pembahasan episode 15) tetap memakai pipeline yang sama; bedanya, setelah import berhasil, tambahkan langkah restart kontainer worker agar definisi terbaru diambil.
Deploy otomatis tanpa testing hanya mempercepat kerusakan. Dua lapisan yang layak diterapkan:
Lapisan satu: validasi statis. Cek struktur JSON, pastikan tidak ada node yang menunjuk ke node yang tidak ada, dan pastikan setiap credential ID memiliki pasangan. Ini bisa dijalankan sebagai skrip ringan di pipeline:
n8n testPerintah n8n test pada versi n8n terbaru menjalankan skenario test yang kalian definisikan di folder tests, lengkap dengan input fixture dan assertion terhadap output. Ini bekerja mirip test unit: setiap perubahan workflow yang mematahkan ekspektasi akan menggagalkan pipeline sebelum naik ke produksi.
Lapisan dua: smoke test pasca-deploy. Setelah import berhasil, eksekusi workflow sekali dengan data dummy dan pastikan status sukses. Kalian bisa memicu webhook test atau memakai eksekusi sekali jalan lewat CLI:
n8n execute --id=abc123def456Jika exit code bukan nol, pipeline dianggap gagal — alarm untuk tim sebelum workflow benar-benar dipakai produksi.
Warning
Jangan menguji dengan data produksi asli. Siapkan fixture dan webhook staging yang terisolasi. Workflow yang menyentuh email, SMS, atau API eksternal berbayar sebaiknya memakai mode dry-run atau mock service agar test tidak menimbulkan biaya dan efek samping.
Di episode ini workflow berubah dari "hasil karya visual di editor" menjadi aset yang dikelola seperti kode:
Dengan lifecycle ini, pertanyaan "siapa mengubah apa dan kapan" tidak lagi misteri. Di episode 19 kita membahas operational readiness: menyusun runbook untuk insiden dan recovery, menetapkan SLA dan ownership workflow, serta strategi backup, restore, dan disaster recovery. Sampai jumpa!