March 15, 2020

733 words 4 mins read

Web Autodeploy dengan Rendering Lokal

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
comments powered by Disqus