Web Autodeploy dengan Rendering Lokal

Dalam artikel ini akan dibahas proses deploy web statik yang lebih umum. Rendering dilakukan di mesin lokal. Begitu selesai, hasilnya diarsip menjadi berkas tunggal, kemudian dipindahkan ke mesin remote. Setelah itu, berkas di-expand ke direktori publik yang digunakan oleh web server.
Sepertinya biasa saja, dimana auto-deploy-nya?
Betul. Tidak ada git push
, tidak ada hook. Hanya saja proses yg semua disebutkan di atas dilakukan
dengan satu perintah melalui shell script.
Mengapa tidak auto-build dengan commit kode sumber? Nah..
Ada saatnya server yang digunakan hitting the wall, karena sumber-daya yang terbatas dipakai untuk melakukan proses yang cukup intensif, misalnya karena jumlah halaman yang harus di-render sudah mencapai ratusan atau ribuan. Umumnya remote server relatif lebih terbatas dalam hal kapasitas, dibandingkan dengan komputer kerja lokal. Jadi kalau menggunakan strategi remote rendering opsinya adalah melakukan upgrading (yang artinya juga membayar lebih mahal) atau memindahkan proses rendering ke mesin lokal.
Walaupun demikian, sisi negatif dari metode seperti ini adalah bandwidth
yang diperlukan untuk transfer data lebih besar dari pada menggunakan version control kode sumber
seperti git
. Kalau menggunakan git
, data yang dikirim hanya data yg berubah/ berbeda (diff
) dari versi
sebelumnya, sehingga bisa lebih efisien. Trade-off yang dapat dilakukan untuk metoda
ini adalah dengan mengoptimalkan perioda pembaruan konten, misalnya dengan melakukan pooling sehingga tidak
terlalu sering melakukan update ke remote server.
Pembahasan selanjutnya menggunakan skenario seperti diilustrasikan dalam gambar di atas.
Di mesin lokal, ada dua direktori source
dan render
, masing-masing berisi konten sumber (raw) dan hasil
rendernya. Semua berkas dalam direktori render
akan dipindahkan ker remote server ke dalam folder
web
. Tanda panah menunjukan alur. Label mewakili perintah yang dipakai. Seperti terlihat, beberapa
perintah yang digunakan adalah: hugo
, tar
, sftp
, ssh
, cp
atau rsync
.
Eksekusi per Langkah
Berikut urutan langkah yang harus dilakukan, sebelum diakhir nanti, digabungkan menjadi script tunggal.
(1) Menghapus isi direktori render
, untuk memastikan hasil yang tidak bercampur dengan hasil eksekusi sebelumnya.
rm -rf ./render/*
(2) Masuk ke direktori source
dan menjalankan hugo
dengan mengarahkan output ke direktori render
. Tanda kurung digunakan
supaya direktori kerja tidak berubah (walaupun menggunakan perintah cd
).
(cd source && hugo -d ../render)
(3) Masuk ke direktori render
dan melakukan pengarsipan melalui perintah tar
dengan output berkas tertentu, misalnya contents.tar.gz
.
(cd render && tar -czvf ../contents.tar.gz .)
(4) Melakukan koneksi sftp
ke remote server, kemudian langsung diikuti dengan perintah transfer berkas eg. put contents.tar.gz
. Perintah sftp
dan ssh
yang digunakan via script, akan lebih elegan bila digunakan secara non-interaktif (menggunakan ssh-key).
printf "progress\nput contents.tar.gz" | sftp -oPort=22 -b- unyil@192.168.1.2:
(5) Menghapus berkas contents.tar.gz
untuk menghemat storage.
rm -rf contents.tar.gz
(6) Melakukan koneksi ssh
ke remote server, diikuti dengan perintah / script untuk melakukan proses selanjutnya di remote server.
Untuk contoh di bawah, digunakan script torg-update.sh
yang akan di bahas kemudian.
printf "./torg-update.sh" | ssh -p 22 unyil@192.168.1.2
Script Lokal
Langkah (1-6) di atas dapat digabungkan menjadi script tunggal berikut, sehingga proses updating konten ke remote server tinggal menjalankan satu baris perintah.
#!/bin/bash
rm -rf ./render/*
(cd local-torg-source && hugo)
(cd render && tar -czvf ../contents.tar.gz .)
printf "progress\nput contents.tar.gz" | sftp -oPort=22 -b- unyil@192.168.1.2:
rm -rf contents.tar.gz
printf "./torg-update.sh" | ssh -p 22 unyil@192.168.1.2
Kalau script ini kita namakan torg-deploy.sh
, rangkaian proses render dan pemindahan berkas dapat dijalankan dengan:
./torg-deploy.sh
Pastikan bahwa script dapat dieksekusi (executable) via chmod +x torg-deploy.sh
Script Remote
Seperti yang sudah disinggung pada langkah ke (6), pada remote server digunakan script torg-update.sh
untuk
menjalankan serangkaian proses setelah berkas gabungan contents.tar.gz
dipindahkan ke mesin remote.
#!/bin/bash
rm -rf ~/server/telematika.org/*
tar -xzvf ~/contents.tar.gz -C ~/server/telematika.org/
rm -rf ~/contents.tar.gz
Seperti ditampilkan pada snippet di atas, script ini menjalankan tiga proses:
- Menghapus direktori tujuan (untuk konsistensi dan menghindari konflik)
- Melakukan ekstraksi berkas gabungan (
contents.tar.gz
) ke folder tujuan - Menghapus berkas gabungan yang sudah selesai di-ekstraksi
Penggabungan Konten
Apabila presensi webnya merupakan gabungan beberapa konten statik, penggabungan konten dapat dilakukan
dengan beberapa cara. Seperti dapat dilihat pada gambar di atas, penggabungan bisa dilakukan pada mesin
lokal, atau mesin remote, apabila konten statik yang dimaksud sudah tersedia di remote. Berikut contoh script
torg-update.sh
apabila proses merging konten statik dilakukan di mesin remote.
#!/bin/bash
rm -rf ~/server/telematika.org/*
cp -R ~/torg-static/remark ~/server/telematika.org/
tar -xzvf ~/contents.tar.gz -C ~/server/telematika.org/
rm -rf ~/contents.tar.gz
Jika penggabungan konten dilakukan lokal, script torg-deploy.sh
menjadi:
#!/bin/bash
rm -rf ./render/*
(cd local-torg-source && hugo)
(cp -R local-torg-static/remark render/)
(cd render && tar -czvf ../contents.tar.gz .)
printf "progress\nput contents.tar.gz" | sftp -oPort=22 -b- unyil@192.168.1.2:
rm -rf contents.tar.gz
printf "./torg-update.sh" | ssh -p 22 unyil@192.168.1.2