Apa itu Pulumi program, dalam satu paragraf
Pulumi program itu program beneran di bahasa beneran, bukan file markup. Lu nulis kode biasa yang manggilnew biznetgio.NeoliteVm(...) kayak manggil constructor biasa, dan engine Pulumi nyatet tiap resource di dalam graph, bukan ngejalanin side effects dari constructor-nya. Referensi antar resource, kayak keypair.keypairId yang dilewatin ke VM, jadi edge di graph itu, jadi engine tau harus bikin keypair dulu sebelum VM. Program-nya terus deklarasiin outputs, dan pulumi up ngejalanin graph itu lawan API Biznet GIO. Struktur program yang sama ada di keenam bahasa karena engine di bawahnya emang sama.
Anatomi sebuah project
Tiap folder itu Pulumi project independen.Pulumi.yaml deklarasiin identitasnya:
runtime milih engine bahasanya. Di sekitar file itu, tiap bahasa bawa file-nya sendiri, yang didaftarin di Gimana repo-nya diatur. Dua konsep muncul di program tiap bahasa:
- Config. Pengaturan stack, kayak
consolePassword, di-set denganpulumi config set --secret consolePassword <value>dan dibaca di program denganconfig.requireSecret("consolePassword"). State stack tinggal di filePulumi.<stack>.yaml, yang di-gitignore biar secret gak pernah masuk git. - Stacks.
pulumi stack init devbikin deployment target independen per folder. Stack satu contoh gak akan pernah nyentuh punya contoh lain.
Konvensi konversi id
Konvensi paling penting di repo ini adalah helpertoAccountId, dan dia ada karena ada ketidakcocokan tipe beneran antara Pulumi dan API upstream-nya:
idresource Pulumi selalu string.- Beberapa input Biznet GIO yang nerima id itu (
neoliteAccountId,snapshotId,metalAccountId,additionalIpId, danaccountIddi function GPU) di-typed sebagai number di SDK, karena API upstream kirim number.
id string ke input yang typed number itu compile error di semua bahasa typed, jadi tiap bahasa punya konversinya sendiri:
- TypeScript
- Python
- Go
- .NET
- Java
- YAML
GpuKeypairgak nge-expose propertikeypairId, cumaid, yang emang udah jadi id keypair-nya. Contoh GPU ngonversikeypair.iddengan helper yang sama dan bawa komentar yang ngejelasin kenapa, cocok sama referensi GPU Pulumi.- Field
accountIdObject Storage di-typed string, jadi gak ada konversi di mana pun diobject-storage/atau bagian storage daricomplete/. - YAML pake
fn::toNumber, function bawaan, bukan helper.
id ke mana pun, cek dulu tipe yang dimau input-nya sebelum nulis referensinya.
Component di complete/
complete/ nge-bundel “satu app” (VM NEO Lite Pro plus bucket dan credential Object Storage) jadi component reusable, padanan Pulumi dari module Terraform. Versi TypeScript-nya adalah appStack.ts:
AppStackArgsitu interface simpel yang nge-list input component-nya. Tiap field di-typedpulumi.Input<...>, yang artinya caller boleh ngelewatin nilai biasa atau output hidup dari resource lain.AppStackextendspulumi.ComponentResource, didaftarin dengan type string"biznetgio-example:index:AppStack"di panggilansuper(...)-nya.- Tiap child resource dibikin dengan
{ parent: this }di options-nya. Satu baris itu naro semua child di tree bawah component, dan itu yang bikinpulumi destroyngehancurin seluruh stack dalam urutan yang bener. - Outputs di-assign ke public fields, terus dipublish dengan
this.registerOutputs(...), yang bikin mereka muncul dipulumi stack output.
YAML gak bisa ngedefinein component, itu keterbatasan bahasa, jadi
yaml/complete/ nunjukin lima resource yang sama secara flat, dengan komentar yang ngejelasin bedanya. Tutorial modules and components ngajarin pattern-nya sendiri.
Pinning versi dan detail Go
Tiap bahasa nge-pin versi SDK dan provider yang dia dibangun lawan, yang didaftarin di tabel Konvensi. Satu pin perlu perhatian ekstra:go.mod SDK Go butuh toolchain yang relatif baru, makanya folder Go deklarasiin go 1.25.11 dan CI nginstall 1.25.x. Komen workflow bilang buat jaga biar sejalan dengan repo provider. Kalau update Go pernah ngerusak build, pin itu yang pertama dicek.
Nambah contoh baru
Langkahnya nyeremin langkah Terraform, plus matriks bahasa:1
Copy contoh yang paling deket di bahasa yang sama
Copy folder dari lini produk yang paling deket. Jaga format nama dan deskripsi
Pulumi.yaml, biznetgio-example-<example>.2
Tulis ulang program buat bentuk yang baru
Jaga banner dan komentar bilingual, helper
toAccountId di tempat yang butuh, dan default aman biaya (payWithCreditCard default ke false, opsi one-shot dikomen).3
Build
Jalanin command build bahasanya dari Local setup. Benerin type error sampe compile; type checker bakal nangkep semua konversi id yang lu kelewat.
4
Mirror ke lima bahasa lainnya
Tiap contoh harus ada di tiap bahasa, jadi kontribusinya enam program. Translate struktur TypeScript-nya, bukan komennya; komennya tetep format bilingual yang sama di tiap bahasa. YAML dapet versi flat dari apapun bentuk component-nya.
5
Update README dan CI
Update tabel README root dan README per folder, dan daftarin contoh baru di input options
example dan daftar job discover di workflow, kayak yang dijelasin Pipelines.6
Buka PR
Isi checklist template PR, yang nanya persis pertanyaan-pertanyaan ini.
Nambah bahasa baru seutuhnya
Pulumi dukung runtime lebih banyak dari enam yang ada di sini. Nambah satu berarti:- Copy enam contoh folder bahasa yang udah ada dan tulis ulang programnya di bahasa baru, jaga semua komen.
- Pin versi SDK dan provider di file dependency bahasa itu.
- Tambahin bahasa itu ke input options
languagedi CI, daftarlangsdi jobdiscover, dan leg build baru dengan setup action yang bener.
Jalanin contoh, buat referensi
preview itu plan; up itu apply. Walkthrough lengkap buat user adalah Pulumi quickstart, dan halaman contoh nge-list apa aja yang dicover tiap folder.
Buat referensi file per file yang lengkap, termasuk kode konversi persisnya di enam bahasa dan daftar lengkap input yang di-type number, liat Complete code walkthrough.