Kebijakan lencana
Menetapkan sumber lencana dinamis dan statis untuk README, mencakup status alur kerja native GitHub, JSON endpoint shields.io, dan bentuk lencana statis.
Dokumen ini adalah referensi kanonik untuk deretan lencana README dan infrastruktur yang memublikasikan sumber data dinamisnya. Setiap lencana di README proyek di-resolve melalui salah satu dari tiga bentuk yang ditetapkan di sini; lencana baru yang ditambahkan di masa mendatang mengikuti bentuk yang sama atau ditolak saat tinjauan.
1. Latar belakang
URL statis https://img.shields.io/badge/X-Y-Z tidak pernah berubah dengan
sendirinya, sehingga menyimpang dari keadaan proyek yang sebenarnya — lencana
release-vN-blue tetap menampilkan vN lama setelah vN+1 dirilis. Karena
itu, kebijakan ini mensyaratkan bentuk dinamis untuk setiap nilai yang berubah,
dan mencadangkan lencana statis untuk sekumpulan kecil nilai (lisensi, versi
target Python) yang jarang berubah, yang bentuk statisnya jujur.
2. Arsitektur
Empat bentuk mencakup setiap lencana dalam proyek:
- Lencana status alur kerja native GitHub. URL lencana sebuah alur kerja
berbentuk
https://github.com/<owner>/<repo>/actions/workflows/<file>/badge.svgdan mencerminkan eksekusi terbaru pada branch default. GitHub menyajikan lencana dari metadata publik repositori. - Lencana endpoint shields.io. Lencana endpoint shields.io me-resolve URL
https://img.shields.io/endpoint?url=<published-json>dengan JSON yang mematuhi skema endpoint shields.io (schemaVersion,label,message,color). JSON yang dipublikasikan berada diapothem.ahmedgad.com/badges/*.json; isinya dihasilkan oleh alur kerja CI pada setiap eksekusi CI yang berhasil. Lencana endpoint menjaga metrik di bawah publikasi yang dikendalikan proyek, bukan di penyimpanan pihak ketiga yang dapat diubah. - Lencana statis shields.io. Lencana statis berbentuk
https://img.shields.io/badge/<label>-<message>-<color>tanpa sumber data reaktif. Dicadangkan untuk nilai yang memang jarang berubah (pengenal lisensi, versi target Python). - Lencana registri dan scorecard. Lencana yang nilainya dihitung pihak ketiga dari data publik yang sudah dimilikinya: registri npm (versi dan unduhan, dirender oleh shields.io) dan API OpenSSF Scorecard. Proyek tidak memublikasikan apa pun untuk lencana ini; pihak ketiga itulah sumbernya.
Publikasi metrik proyek melalui Gist publik dikecualikan secara desain. Endpoint shields.io di atas domain yang dikendalikan proyek adalah pengganti kanoniknya.
3. Spesifikasi per lencana
Tabel ini mencantumkan deretan lencana README secara berurutan. Kolom terakhir menandai lencana yang gambarnya hanya dirender selama repositori bersifat publik: GitHub menyajikan lencana alur kerja untuk repositori privat hanya kepada anggota yang masuk, dan Scorecard hanya memindai repositori publik.
| Lencana | Bentuk | Sumber | Bentuk URL | Memerlukan repositori publik |
|---|---|---|---|---|
| Rilis terbaru | endpoint shields.io | badges/release.json | https://img.shields.io/endpoint?url=https%3A%2F%2Fapothem.ahmedgad.com%2Fbadges%2Frelease.json | Tidak |
| Status CI | native GitHub | .github/workflows/ci.yml | https://github.com/ahmed-g-gad/apothem/actions/workflows/ci.yml/badge.svg?branch=main | Ya |
| Lisensi | statis shields.io | LICENSE (MIT) | https://img.shields.io/badge/license-MIT-0F172A | Tidak |
| Versi npm | registri | registri npm | https://img.shields.io/npm/v/%40ahmed-g-gad%2Fapothem?color=10B981&label=npm | Tidak |
| Gerbang cakupan | statis shields.io | pyproject.toml fail_under = 80 | https://img.shields.io/badge/coverage%20gate-%E2%89%A580%25-2563EB | Tidak |
| OpenSSF Scorecard | scorecard | hasil .github/workflows/scorecard.yml | https://api.securityscorecards.dev/projects/github.com/ahmed-g-gad/apothem/badge | Ya |
| Umpan balik | statis shields.io | GitHub Issues | https://img.shields.io/badge/feedback-GitHub%20issues-7C3AED | Tidak |
| Dokumentasi | statis shields.io | situs dokumentasi | https://img.shields.io/badge/docs-Fumadocs-0F172A | Tidak |
| Unduhan npm | registri | registri npm | https://img.shields.io/npm/dm/%40ahmed-g-gad%2Fapothem?color=10B981&label=downloads | Tidak |
Setiap target tautan lencana di github.com (rilis, alur kerja, berkas lisensi,
isu) hanya terbuka selama repositori bersifat publik.
Alur kerja badges juga memublikasikan berkas endpoint coverage.json,
security.json, supply-chain.json, dan docs.json untuk lencana di masa
mendatang; README saat ini tidak menampilkannya.
CodeQL berjalan sebagai alur kerja khusus .github/workflows/codeql.yml yang
menganalisis permukaan Python dan Actions; job security-scan di ci.yml
hanya menjalankan bandit, dan menyerahkan publikasi SARIF CodeQL kepada
codeql.yml. Lencana keamanan mengonsumsi JSON endpoint yang dipublikasikan
oleh alur kerja badges alih-alih lencana alur kerja native GitHub, sehingga
lencana tetap stabil terlepas dari topologi pemindai yang mendasarinya.
4. Mekanisme publikasi JSON
JSON endpoint dihasilkan oleh .github/workflows/badges.yml. Alur kerja
tersebut:
- Dipicu oleh
workflow_runsetelah alur kerjaciselesai (dan olehworkflow_dispatchmanual untuk publikasi ulang tanpa eksekusi CI). - Me-resolve tag rilis terbaru dengan
git describe --tags --abbrev=0 --match 'v[0-9]*.[0-9]*.[0-9]*'pada checkout dengan riwayat penuh (fetch-depth: 0; pada checkout dengan kedalaman 1, tidak ada commit bertag yang dapat dijangkau dan lencana menampilkanunreleased), serta kesimpulan CI induk dari peristiwaworkflow_run. - Menghasilkan setiap JSON melalui
jq -nsehingga keluarannya cocok secara ketat dengan skema endpoint shields.io (schemaVersion: 1, ditambahlabel,message,color). - Memvalidasi setiap JSON yang dikeluarkan dengan
jq -esebelum diunggah. - Mengunggah direktori sebagai artefak alur kerja bernama
badges.
Penerapan artefak ke apothem.ahmedgad.com/badges/ ditangani oleh
.github/workflows/publish-static-site.yml. Selama build situs, alur kerja
tersebut mengunduh artefak badges terbaru yang berhasil dan menempatkannya di
bawah site/dist/badges/. Jika artefak tidak ada atau telah kedaluwarsa, situs
tetap diterapkan dan mencatat artefak lencana yang hilang di log alur kerja
alih-alih memublikasikan JSON yang rusak.
5. Protokol pemeliharaan
Tambahkan lencana baru dengan memutuskan bentuknya terlebih dahulu:
- Jika lencana mencerminkan status eksekusi sebuah alur kerja CI, utamakan bentuk native GitHub. URL lencana ditetapkan oleh berkas alur kerja; tidak diperlukan infrastruktur publikasi.
- Jika lencana mencerminkan metrik (hitungan, persentase, string versi, label
bergradasi) yang diperbarui seiring waktu, gunakan bentuk endpoint
shields.io. Tambahkan langkah pembuatan JSON ke
.github/workflows/badges.ymldi samping lima langkah yang sudah ada dan tambahkan URL konsumenapothem.ahmedgad.com/badges/<name>.jsonke deretan lencana README. - Jika lencana mencerminkan nilai yang memang jarang berubah (lisensi, target bahasa, mode tata kelola), gunakan bentuk statis shields.io. Dokumentasikan irama perubahannya dalam tabel per lencana di berkas ini saat menambahkan lencana tersebut.
Pensiunkan lencana dengan terlebih dahulu menghapusnya dari README, lalu menghapus langkah pembuatan JSON-nya dari alur kerja badges, lalu menghapus barisnya dari tabel per lencana di atas. Jaga agar penghapusan tetap atomik sehingga README tidak pernah merujuk artefak JSON yang tidak dihasilkan alur kerja.
6. Referensi silang
- Alur kerja CI yang status eksekusinya dicerminkan oleh lencana CI native
GitHub:
.github/workflows/ci.yml. - Alur kerja badges yang memublikasikan JSON endpoint:
.github/workflows/badges.yml. - Domain situs statis yang menyajikan JSON tersebut:
apothem.ahmedgad.com. - Referensi skema endpoint shields.io: https://shields.io/badges/endpoint-badge.