⚠️ Build and Deploy to Clean Branch
Alur Dibalik: cek perubahan dulu, baru rsync + deployIntinya: sebelum melakukan rsync dan deploy, workflow ini membandingkan isi daftar file yang diizinkan dengan versi sebelumnya di branch site. Kalau tidak ada perubahan, langkah rsync dan deploy dilewati.
Konsep alur yang dibalik
- Inti: Cek perubahan dulu. Bandingkan hasil seleksi file dari branch main dengan isi branch site.
- Langkah 1: Checkout main sebagai sumber, dan site sebagai target.
- Langkah 2: Ekstrak file terizinkan ke direktori sementara (deploy_dir).
- Langkah 3: Gunakan rsync --dry-run untuk membandingkan deploy_dir vs site.
- Keputusan: Jika ada perubahan → lanjutkan rsync + deploy. Jika tidak → skip deploy.
Pendekatan ini menghemat waktu, mengurangi commit “kosong”, dan menjaga branch site tetap bersih dan akurat.
Tips praktis biar workflow makin mantap
- Logging: Simpan hasil perbandingan ke diff.log dan upload sebagai artifact agar gampang audit.
- Ekstensi file: Pastikan pola --include konsisten dengan kebutuhanmu (HTML, XML, TXT, ikon, manifest).
- Kebersihan: Gunakan --delete untuk memastikan target selalu mirror dari sumber terpilih.
- Stabilitas: Tetap pakai actions/checkout@v4 dua kali: sekali untuk main, sekali untuk site.
- Ekstra aman: Jika ada build step, jalankan sebelum seleksi file, supaya yang dibandingkan sudah final.
Contoh implementasi (YAML)
name: ⚠️ Build and Deploy to Clean Branch
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# Checkout branch main (source)
- name: Checkout source branch
uses: actions/checkout@v4
with:
ref: main
path: source
# Checkout branch site (target)
- name: Checkout site branch
uses: actions/checkout@v4
with:
ref: site
path: site
# Buat direktori sementara
- name: Create clean directory
run: mkdir deploy_dir
# Salin hanya file yang diizinkan dari source
- name: Sync allowed files to deploy directory
run: |
rsync -a --delete \
--include='artikel/*' \
--include='ext/*' \
--include='img/*' \
--include='artikel.json' \
--include='_redirects' \
--include='_headers' \
--include='*.html' \
--include='*.xml' \
--include='*.txt' \
--include='favicon.*' \
--include='icon.*' \
--include='logo.*' \
--include='thumbnail.*' \
--include='*.webmanifest' \
--exclude='*' \
source/ deploy_dir/
# Bandingkan dengan branch site
- name: Check for changes
id: check_changes
run: |
rsync -a --dry-run --delete deploy_dir/ site/ > diff.log
if [ -s diff.log ]; then
echo "changed=true" >> $GITHUB_OUTPUT
else
echo "changed=false" >> $GITHUB_OUTPUT
fi
# [Opsional] Upload diff.log untuk audit
- name: Upload diff artifact
if: steps.check_changes.outputs.changed == 'true'
uses: actions/upload-artifact@v4
with:
name: deploy-diff
path: diff.log
# Deploy hanya jika ada perubahan
- name: Deploy to site branch
if: steps.check_changes.outputs.changed == 'true'
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./deploy_dir
publish_branch: site
user_name: 'github-actions[bot]'
user_email: 'github-actions[bot]@users.noreply.github.com'
force_orphan: true
Kalau kamu ingin lebih ketat, tambahkan validasi checksum (misalnya dengan sha256sum) untuk mendeteksi perubahan yang halus.
Penjelasan singkat dan alasan desain
- Checkout dua cabang: Kita butuh snapshot main (sumber) dan site (target) agar bisa membandingkan keadaan terakhir yang ter-deploy.
- Seleksi file: rsync dengan kombinasi --include/--exclude membuat direktori bersih (deploy_dir) berisi hanya file yang “diizinkan”.
- Dry-run: rsync --dry-run --delete menghasilkan daftar perubahan tanpa benar-benar menyalin; jika ada isi diff.log, berarti perlu deploy.
- Conditional deploy: Langkah deploy memakai kondisi if sehingga hanya berjalan bila ada perbedaan; ini mencegah commit kosong.
- Artifact: Opsi upload diff.log membantu audit dan debugging—praktis kalau suatu saat hasil tidak sesuai ekspektasi.
Opsi lanjutan dan penguatan
- Proteksi pola: Simpan pola include/exclude di file terpisah (misalnya sync.rules) dan panggil dengan --filter='merge sync.rules' agar mudah dirawat.
- Pre-build: Jika ada proses build (minify, generate, bundling), jalankan sebelum seleksi agar yang dibandingkan benar-benar output final.
- Cache: Tambah caching untuk dependency build agar job makin cepat, tanpa mengubah mekanisme cek perubahan.
- Notifikasi: Kirim notifikasi (mis. ke Slack) hanya saat changed == true supaya tim dapat sinyal relevan.
- Keamanan: Pastikan tidak ada file sensitif yang lolos: validasi dengan skrip audit (regex nama file, ekstensi, path).