9
Deploy dan CI
Repository ini menerbitkan API statis lewat GitHub Actions, bukan lewat server. Ada dua workflow: deploy yang membangun website dan seluruh berkas JSON lalu menerbitkannya ke branch gh-pages, dan ci yang hanya memverifikasi build website beserta go vet ./.... Keduanya memakai node-version: 22 dan go-version: "1.25" dengan cache aktif (.github/workflows/deploy.yml:18-351, .github/workflows/ci.yml:14-192).
Pemicu workflow deploy
deploy menyala lewat tiga jalan: jadwal mingguan, tombol manual, dan push yang menyentuh berkas tertentu.
| Pemicu | Nilai | Artinya |
|---|---|---|
schedule | cron: "0 0 * * 0" | data ditarik ulang tiap Minggu 00:00 UTC |
workflow_dispatch | {} | job bisa dijalankan manual dari tab Actions |
push | branch [master, v2], path web/**, tools/**, go.mod, .github/workflows/deploy.yml | perubahan kode memicu rebuild penuh |
(.github/workflows/deploy.yml:1-103)
Dua pengaman dipasang di level workflow. concurrency memakai group deploy dengan cancel-in-progress: false, jadi run yang sedang jalan tidak pernah dibatalkan dan run berikutnya menunggu giliran. permissions: contents: write dibutuhkan karena job membuat commit baru di branch gh-pages (.github/workflows/deploy.yml:9-104).
Tahapan job deploy
Seluruh langkah berada dalam satu job deploy di ubuntu-latest tanpa needs antar job, sehingga step berjalan serial di satu runner dan kegagalan satu step menghentikan step berikutnya (.github/workflows/deploy.yml:12-155). Urutan itu penting: setiap step membaca artefak yang ditulis step sebelumnya di dalam direktori kerja yang sama.
gantt
title Urutan step job deploy
dateFormat HH:mm
axisFormat %H:%M
section web
"actions/checkout@v4" :s1, 00:00, 1m
"Setup Node 22" :s2, after s1, 1m
"npm ci + npm run build" :s3, after s2, 1m
section api
"Setup Go 1.25" :s4, after s3, 1m
"extract-csv 3 SQL dump" :s5, after s4, 1m
"generate-static-api -v" :s6, after s5, 1m
"cache boundaries zip" :s7, after s6, 1m
"generate-boundaries -v" :s8, after s7, 1m
"add-has-path -v" :s9, after s8, 1m
"generate-missings -v" :s10, after s9, 1m
"update-stats -v" :s11, after s10, 1m
section publish
"Assemble publish dir" :s12, after s11, 1m
"actions-gh-pages@v4" :s13, after s12, 1m
%% fig: Urutan step job deploy
%% desc: Setiap step berjalan setelah step sebelumnya karena memakai artefak yang baru ditulis. Panjang bar diseragamkan dan hanya penanda urutan, bukan durasi terukur.Website dibangun lebih dulu dari web/ dengan npm ci lalu npm run build, memakai cache npm yang dikunci ke web/package-lock.json (.github/workflows/deploy.yml:25-296). Isi direktori web/ sendiri dibahas di Website dan Playground.
Setelah itu enam tool Go dijalankan berurutan, masing-masing diikuti perintah pemeriksaan yang mencetak ukuran atau isi artefaknya ke log. Rincian per tahap, termasuk flag tiap tool, ada di usage tools/main.go (tools/main.go:8-237) dan di Pipeline Generate dengan Go Tools.
| Step | Perintah utama | Yang dicetak ke log | Rujukan |
|---|---|---|---|
Extract CSV (ephemeral) | go run ./tools extract-csv untuk tiga URL SQL cahyadsn | tidak ada | .github/workflows/deploy.yml:37-418 |
Generate API | go run ./tools generate-static-api -v | du -sh api dan find api -type f | wc -l | .github/workflows/deploy.yml:43-499 |
Generate Boundaries | actions/cache@v4 key wilayah-boundaries-zip-v1, lalu go run ./tools generate-boundaries -v | du -sh api/paths dan jumlah file | .github/workflows/deploy.yml:51-6310 |
Add has_path | go run ./tools add-has-path -v | grep -c '"has_path":true' dan "has_path":false | .github/workflows/deploy.yml:65-7011 |
Generate missings | go run ./tools generate-missings -v | 2000 byte pertama api/missings.json dan ls -lh | .github/workflows/deploy.yml:72-7812 |
Update stats | go run ./tools update-stats -v | jq atas total_endpoints, total_filesize_human, total_disk_usage_human | .github/workflows/deploy.yml:80-9013 |
Menggabungkan artefak lalu push ke gh-pages
graph LR
dist["web/dist"] --> deploy["deploy/"]
api["api/"] --> v2["deploy/v2/"]
deploy --> pages["branch gh-pages"]
v2 --> pages
style dist fill:#8b5cf6,color:#fff
style api fill:#8b5cf6,color:#fff
style deploy fill:#f59e0b,color:#000
style v2 fill:#f59e0b,color:#000
style pages fill:#336791,color:#fff
%% fig: Komposisi direktori publish
%% desc: Hasil build Astro ditaruh di akar deploy sedangkan berkas JSON API ditaruh di subdirektori v2, lalu keduanya di-push ke branch gh-pages.Step Assemble publish dir membuat deploy/, menyalin isi web/dist/* ke akarnya, menyentuh berkas deploy/.nojekyll, lalu menyalin api/* ke deploy/v2/ (.github/workflows/deploy.yml:92-10414). Karena API bersarang di subpath v2, base URL publiknya berakhiran /v2 (README.md:915).
Step terakhir memakai peaceiris/actions-gh-pages@v4 dengan publish_dir: ./deploy, publish_branch: gh-pages, dan keep_files: true (.github/workflows/deploy.yml:106-11516). README menjelaskan rangkaian yang sama: api/ disalin ke deploy/v2/ bersama hasil build web/dist lalu di-push ke gh-pages (README.md:41-4217).
⚠️ Nama step-nya sendiri adalah
Deploy to gh-pages (keep old api/)(.github/workflows/deploy.yml:10618), dankeep_files: truemempertahankan berkas yang sudah ada di branch tujuan (README.md:59219). Artinya penerbitan bersifat menambah, bukan menyamakan: berkas JSON lama yang tidak lagi dihasilkan generator tetap tersaji digh-pagessampai dihapus manual.
⚠️
commit_messagedi-hardcodedeploy: ${{ github.sha }} [cron](.github/workflows/deploy.yml:11520), sehinggacommithasilpushbiasa tetap berlabel[cron].
Workflow ci.yml
ci bekerja jauh lebih ringan. Ia menyala pada pull_request dan push ke main/v2 dengan path filter web/**, tools/**, go.mod, memiliki satu job build, dan hanya menjalankan npm ci --prefix web, npm run build --prefix web, lalu go vet ./... (.github/workflows/ci.yml:1-2021). Tidak ada langkah generate, tidak ada go build, tidak ada test, dan tidak ada deploy.
Konsekuensinya, kesalahan pada tools/ hanya tertangkap sebagai error kompilasi atau temuan vet, bukan sebagai data yang salah bentuk. Data yang benar-benar tersaji baru terverifikasi saat deploy berjalan dan mencetak ukuran artefak di log.
⚠️ Branch yang dipantau kedua workflow tidak sama.
deploymenunggupushkemasterdanv2(.github/workflows/deploy.yml:5-722), sedangkancimenunggupushkemaindanv2(.github/workflows/ci.yml:5-723). README sendiri menyebutpushkemain/v2sebagai pemicu (README.md:66324). Akibatnyapushkemasterbisa memicu deploy tanpa CI, danpushkemainbisa memicu CI tanpa deploy.