Pull Request
Halaman ini menjelaskan apa yang harus dibawa sebuah perubahan sebelum pull request dibuka, dan apa yang akan diperiksa saat review. Repository tidak memiliki pull request template dan tidak ada bot yang memberikan komentar otomatis. Enforcement berasal dari lima CI job dan seorang reviewer yang membaca diff. Dokumen ini menjelaskan apa yang diperiksa keduanya.
Contoh minimal
git switch -c fix/table-sort-whitelist
# ... lakukan perubahan, tambahkan test ...
composer ci # pint --test, phpstan, pest
npm run ci # prettier --check, eslint, vue-tsc, vite build
git add -A
git commit -m "Ignore a sort column the schema never declared sortable"
git push -u origin fix/table-sort-whitelist2
3
4
5
6
7
8
9
10
Setelah itu buka pull request ke main. main adalah default branch dan satu-satunya target CI: workflow menggunakan on: push: branches: [main] dan on: pull_request: branches: [main].
Jika kedua command lolos secara lokal, kegagalan CI biasanya berasal dari kombinasi versi: PHP minor berbeda, major Laravel berbeda, --prefer-lowest, atau Node berbeda. Gunakan CI matrix untuk membaca kegagalannya.
Checklist
Sepuluh pertanyaan berikut diurutkan berdasarkan masalah yang paling sering terjadi.
- Apakah ada test yang gagal tanpa perubahan ini? Fix tanpa test adalah bug yang berpeluang kembali. Lihat Running the tests untuk menentukan lokasi test.
- Apakah negative suite membutuhkan pasangan test? Perubahan pada authorization, query parameter, file download, atau schema whitelist juga harus masuk
tests/Feature/Panel/Negative/. Standard-nya: hapus guard dan test harus gagal. - Apakah
composer cilolos? Style, static analysis, dan test. - Apakah
npm run cilolos? Formatting, lint, type, dan build. Menganggap perubahan "hanya PHP" adalah salah satu cara published component berhenti compile tanpa diketahui. - Apakah sisi lain dari boundary ikut berubah? Column, field, entry, atau widget type baru berarti PHP class + enum case + branch di Vue renderer. Union bersifat exhaustive, tetapi manfaatnya hanya terasa jika typecheck benar-benar dijalankan.
- Apakah perubahan berada dalam fixed set yang harus bergerak bersama? Lihat tabel Coding standards: field
NavigationItem, keyPage::metadata(), lifecycle hook, icon name, asset entrypoint, dan CSS hook name. - Apakah sudah ada entry
CHANGELOG.md? Tambahkan di bawah## [Unreleased]pada section yang benar. Lihat Releases. - Apakah dokumentasi masih mengatakan hal yang benar?
docs/ditulis per topik dan saling terhubung. Grep method/default yang berubah sebelum menganggap dokumentasi tidak menyebutnya. - Apakah perubahan memerlukan edit di application? Jika ya, tambahkan juga ke
docs/upgrading/breaking-changes.mddengan fix terkecil yang harus dilakukan. Silent break — kode tetap berjalan tetapi behavior salah — diletakkan paling atas. - Apakah perubahan membutuhkan ADR? Gunakan tabel di Architecture decisions.
Apa yang dijalankan CI
Lima job dari .github/workflows/tests.yml:
| Job | Menjalankan | Matrix | Blocking |
|---|---|---|---|
test | vendor/bin/pest | PHP 8.2–8.4 × Laravel 12–13 × prefer-lowest/prefer-stable, kecuali PHP 8.2 + Laravel 13 | ya |
static-analysis | vendor/bin/phpstan analyse --memory-limit=1G --no-progress | Laravel 12 pada PHP 8.2, Laravel 13 pada PHP 8.4 | ya |
code-style | vendor/bin/pint --test | satu job, PHP 8.4 | ya |
frontend | format:check, lint, typecheck, build | Node 20, 22, 24 | ya |
frontend-latest | typecheck, build terhadap versi teratas setiap range | satu job, Node 22 | tidak — continue-on-error |
Setiap matrix menggunakan fail-fast: false. Jika satu kombinasi gagal, kombinasi lain tetap berjalan. Mengetahui tiga kombinasi mana yang gagal sering kali sudah menjadi sebagian besar diagnosis.
frontend-latest boleh gagal. Minor update dependency upstream yang memecahkan build adalah informasi penting, tetapi tidak seharusnya memblokir PR yang tidak terkait. Job merah yang non-blocking tetap harus diperhatikan.
Mereproduksi failure CI
Job test dapat direproduksi dengan mengganti range pada branch lokal. Ingat bahwa composer require mengubah composer.json, jadi restore setelah selesai:
composer require "laravel/framework:12.*" --no-interaction --no-update
composer require "orchestra/testbench:10.*" --dev --no-interaction --no-update
composer update --prefer-lowest --prefer-dist --no-interaction
vendor/bin/pest
git checkout composer.json && composer update2
3
4
5
6
7
Laravel 13 dipasangkan dengan Testbench 11. --prefer-lowest biasanya menjadi kombinasi pertama yang menemukan dependency range dengan floor yang belum pernah diuji.
Frontend:
npm ci && npm run ci # blocking job
npm install --no-package-lock && npm run build # non-blocking latest-range job2
Commit dan branch
Tidak ada enforced commit convention. Gunakan imperative subject line yang mengatakan apa yang berubah. Gunakan body untuk menjelaskan alasan jika alasan tersebut tidak terlihat jelas dari diff. Standard yang sama digunakan untuk code comment dan menjelaskan mengapa entry CHANGELOG.md ditulis sebagai prose, bukan daftar noun.
Branch dibuat dari main dan pull request ditujukan ke main. Tidak ada develop branch atau release branch; release adalah tag pada main.
Scope
Satu perubahan per pull request. "Satu perubahan" berarti satu alasan yang masuk akal untuk melakukan revert. Formatting sweep yang dicampur dengan bug fix membuat fix sulit direview; menjalankan composer format pada file tidak terkait termasuk formatting sweep.
Ada dua pengecualian karena bagian-bagiannya tidak dapat di-merge terpisah:
- Perubahan yang melintasi PHP/Vue boundary. Column type baru tetap satu perubahan walaupun menyentuh PHP, enum, TypeScript, dan test.
- Fix dan generated artifact yang harus ikut. Icon name baru dan output
panel:iconsadalah satu perubahan. Commit nama icon tanpa registry berarti mengirim button tanpa icon.
File yang tidak diedit manual
| File | Regenerasi dengan |
|---|---|
resources/js/panel/icons/registry.ts | php artisan panel:icons (--check gagal jika stale) |
package-lock.json | npm install setelah mengubah range — jangan diedit manual |
build/** | Scratch output; hapus dengan rm -rf build |
Header registry.ts juga menyatakan file tersebut generated. Edit manual hanya akan membuat file berbeda dari output command berikutnya.
Catatan
.github/berada di.gitignore. Perubahan workflow harus ditambahkan dengangit add -f .github/workflows/tests.yml.composer.locktidak di-commit. Jangan menambahkannya. Library diuji terhadap ranges dan CI melakukan fresh resolve.package-lock.jsondi-commit. Jika rangepackage.jsonberubah tanpa regenerasi lockfile,npm ciharus gagal — itu behavior yang diharapkan.composer requiresaat reproduksi CI mengubahcomposer.json. Walaupun memakai--no-update, file tetap berubah. Restore setelah selesai.- Job
code-stylemerah biasanya satu command fix. Jalankancomposer formatlalu commit. - PHP jobs tidak memakai dependency cache. Fresh resolve adalah tujuan test matrix; cache berbasis
composer.lockjustru menghilangkan manfaatnya. - Config file baru di repository root membutuhkan
export-ignorepada.gitattributesagar tidak ikut package pengguna. - Coverage tidak dijalankan workflow.
composer test-coveragehanya tool lokal; PHP CI menggunakancoverage: none.
Lihat juga
- Local development — command yang diasumsikan halaman ini
- Running the tests — apa yang harus ditambahkan sebuah perubahan
- Coding standards — termasuk fixed set yang tidak boleh berubah setengah
- Architecture decisions — kapan ADR diperlukan
- Security — vulnerability tidak dilaporkan melalui pull request
- Releases — apa yang terjadi setelah perubahan masuk
main - CI matrix — setiap job dan cara membaca failure
- Breaking changes — tempat mendokumentasikan breaking change