Skip to content
Apothem
Referensi

Manifes Penyematan Dependensi

Kebijakan deklarasi dependensi yang mencakup rentang runtime Python, perkakas pengembangan, berkas kunci perkakas rilis, dan batas bawah versi yang diratifikasi untuk setiap permukaan build.

Sikap yang diratifikasi tentang cara Apothem mendeklarasikan, menyematkan, dan mengunci dependensi. Audiens: kontributor dan konsumen hilir yang perlu memahami model reproduktibilitas.

Sikap

Apothem adalah CLI Python dengan kumpulan dependensi runtime yang kecil ditambah rantai perkakas pengembangan, audit, rilis, dan dokumentasi yang lebih besar. Dependensi runtime menggunakan batas bawah yang konservatif di pyproject.toml; situs web meng-commit site/package-lock.json; GitHub Actions disematkan oleh SHA yang tak dapat diubah dengan komentar versi dan ditingkatkan oleh Dependabot.

KelasDeklarasiKebijakan penguncian
Dependensi runtime Python[project.dependencies] di pyproject.tomlRentang batas bawah untuk pengguna; tidak ada kunci runtime Python yang dikirim bersama paket. CI memasang penutupan dependensi tersebut yang dikunci hash (lihat Kunci dependensi CI)
Perkakas pengembangan / keamananextras [project.optional-dependencies]Rentang batas bawah, kecuali ruff dan mypy, yang disematkan secara eksak oleh extra dev ke versi yang dijalankan CI (untuk ruff, lihat Kunci perkakas CI); CI memasang extra dev dari penutupan yang dikunci hash (lihat Kunci dependensi CI)
Perkakas rilisscripts/release/requirements-build-linux.txt untuk alur kerja rilis; extra release di [project.optional-dependencies] untuk build lokalDikunci hash untuk alur kerja rilis; dihasilkan dari penutupan perkakas rilis. Extra release adalah rentang batas bawah
pip CIscripts/ci/requirements-ci-pip.txtDikunci hash: satu penyematan pip==X.Y.Z beserta hash wheel dan sdist-nya, yang dipasang dengan --require-hashes -r oleh setiap alur kerja yang meningkatkan pip. Dependabot mengusulkan peningkatannya dan menulis ulang hash-nya; scripts/dev/check_pip_pin_drift.py menahan penyematan di pip 26.2 atau lebih baru
Kunci dependensi CIscripts/ci/requirements-ci-dev.txt, -runtime.txt, -test.txt, dan -prereqs.txtPenutupan universal yang dikunci hash, dikompilasi dengan uv pip compile dari pyproject.toml (atau, untuk -prereqs.txt, dari prasyarat host milik mesin) per tanggal penguncian dikurangi masa tunggu 7 hari, keduanya dicatat di setiap berkas, dan dipasang dengan --require-hashes -r (paketnya sendiri dengan --no-deps -e .). CI menguji versi yang dikunci sampai scripts/dev/refresh_ci_locks.py membuatnya ulang; pip-audit.yml setiap minggu mengaudit versi terbaru yang diizinkan dan juga kuncinya. tests/scripts/test_ci_locks_fresh.py gagal jika sebuah kunci tidak lagi memenuhi masukannya
Kunci perkakas CIscripts/ci/requirements-ci-ruff.txt, -bandit.txt, -pip-audit.txt, -pip-licenses.txt, dan -pre-commit.txtSatu penutupan yang dikunci hash untuk setiap perkakas yang dijalankan alur kerja, dikompilasi oleh skrip yang sama dari spesifikasi eksak di scripts/dev/ci_lock_table.py, dengan tanggal penguncian dan masa tunggu yang sama, dan dipasang dengan --require-hashes -r. Tidak ada alur kerja yang menuliskan versi perkakas. pre-commit membutuhkan Python 3.11 atau lebih baru, sehingga kuncinya juga, dan kunci pip-audit juga dikompilasi untuk 3.11 karena filelock terbaru yang mendukung 3.10 memiliki advisori keamanan yang belum diperbaiki. Hanya kunci pip CI yang menyematkan pip
Situs dokumentasisite/package.jsonsite/package-lock.json di-commit dan dikonsumsi oleh npm ci
Pengemas VS Codetools/vsce/package.jsontools/vsce/package-lock.json di-commit; job rilis dan publikasi menjalankan npm ci --ignore-scripts
CLI harness channel-smoketools/channel-smoke/package.jsontools/channel-smoke/package-lock.json di-commit dan dikonsumsi oleh npm ci
GitHub ActionsReferensi uses: yang disematkan SHA dengan komentar versiDependabot mengusulkan pembaruan mingguan; pengecualian membawa penanda action-pinning-exempt:

Ratifikasi rilis

PermukaanStatus yang diratifikasiRasionel
Dependensi runtimeBatas bawah saat ini berada di pyproject.toml [project.dependencies]Batas bawah stabil saat ini diratifikasi sebelum rilis; tidak ada penghalang CVE runtime yang diketahui
Perkakas pengembanganBatas bawah saat ini berada di extra dev dari pyproject.toml; ruff dan mypy adalah penyematan eksak di sanaBatas bawah stabil terbaru diratifikasi sebelum rilis; ruff dan mypy masing-masing disematkan ke satu versi untuk hook, CI, dan kontributor, hook mypy menyematkan pustaka yang didaftarkannya ke versi dari kunci dev, dan tests/scripts/test_ci_tool_locks.py gagal jika versinya berbeda
Perkakas keamananBatas bawah saat ini berada di extra security dari pyproject.tomlBatas bawah pemindai saat ini diratifikasi sebelum rilis
Perkakas rilisPenutupan yang dikunci hash berada di scripts/release/requirements-build-linux.txtAlur kerja rilis memasang dengan --require-hashes; skrip lokal mensyaratkan build sudah ada alih-alih diam-diam memasang dependensi yang bergerak
pip CIPenyematan yang dikunci hash berada di scripts/ci/requirements-ci-pip.txtpip 26.2 atau lebih baru menutup CVE-2026-13346; alur kerja memasangnya dengan --require-hashes, sehingga unduhannya diperiksa terhadap hash yang dipublikasikan
Kunci dependensi CIPenutupan yang dikunci hash berada di scripts/ci/requirements-ci-{dev,runtime,test,prereqs}.txtAlur kerja memasangnya dengan --require-hashes; setiap berkas mencatat tanggal penguncian, masa tunggu, dan tanggal batasnya, dan uji kesegaran menjaganya tetap selaras dengan pyproject.toml
Kunci perkakas CIPenutupan yang dikunci hash berada di scripts/ci/requirements-ci-{ruff,bandit,pip-audit,pip-licenses,pre-commit}.txtAlur kerja memasangnya dengan --require-hashes dan tidak mencantumkan versi perkakas; spesifikasinya berada di scripts/dev/ci_lock_table.py, dan tanggal penguncian, masa tunggu, serta tanggal batasnya sama dengan milik kunci dependensi
Perkakas dokumentasiRentang saat ini berada di site/package.json; resolusi eksak berada di site/package-lock.jsonnpm outdated tidak mengembalikan dependensi dokumentasi yang usang setelah penyegaran berkas kunci
GitHub ActionsPenyematan SHA yang ada dipertahankan untuk rilis saat ini; alur kerja SLSA yang dapat dipakai ulang tetap menjadi pengecualian yang disematkan dengan tag dan didokumentasikan, ditandai dengan komentar action-pinning-exempt: di release.ymlEksekusi ulang CI publik hijau; peningkatan versi mayor action yang luas sengaja diserahkan ke PR otomasi dependensi untuk menghindari gejolak pada permukaan rilis
Pengemasan npmAlur kerja publish-npm.yml berjalan pada push tag v*.*.*, dengan workflow_dispatch sebagai cadanganSatu-satunya paket npm publik adalah @ahmed-g-gad/apothem; publikasi menunggu persetujuan operator atas environment release, yang diberikan setelah scripts/release/check-release-ready.sh lolos

Penguncian

Berkas kunci Python milik kontributor sendiri dihasilkan sesuai permintaan dan tidak di-commit: penutupan runtime Apothem kecil dan CLI mendukung beberapa versi minor Python. CI adalah pengecualiannya. CI memasang berkas yang dikunci hash di scripts/ci/: empat kunci dependensi (requirements-ci-dev.txt, -runtime.txt, -test.txt, dan -prereqs.txt) dan satu kunci untuk setiap perkakas yang dijalankan alur kerja (-ruff.txt, -bandit.txt, -pip-audit.txt, -pip-licenses.txt, dan -pre-commit.txt). python scripts/dev/refresh_ci_locks.py mengompilasi kesembilannya per tanggal penguncian dikurangi masa tunggu 7 hari yang sama dengan milik Dependabot, sehingga CI menguji rilis yang sudah berumur setidaknya satu minggu pada tanggal penguncian, dan penyegaran berkas memajukannya. Setiap berkas mencatat tanggal penguncian, masa tunggu, dan tanggal batas yang dihasilkan, dan --check mereproduksi tanggal batas itu. Perbaikan keamanan mendesak yang lebih baru daripada masa tunggu memerlukan penyegaran dengan --cooldown-days 0, atau pengecualian masa tunggu untuk paketnya di scripts/dev/ci_lock_table.py, yang mencabut masa tunggu hanya untuk paket itu. Eksekusi mingguan pip-audit.yml mengaudit versi terbaru yang diizinkan pyproject.toml serta kesembilan kunci, dengan menanyakan advisori keamanan ke layanan OSV. Kontributor tetap memasang dengan pip install -e ".[dev]".

# Astral uv:
uv pip install -e ".[dev,security,release]"
uv pip freeze > requirements.dev.lock

# pip-tools:
pip-compile --extra=dev --extra=security --extra=release -o requirements.dev.lock pyproject.toml

# Plain pip:
pip install -e ".[dev,security,release]"
pip freeze > requirements.dev.lock

Situs web berbeda: site/package-lock.json di-commit dan CI menggunakan npm ci, sehingga situs dokumentasi yang dirender memiliki penutupan Node yang dapat direproduksi.

Rasionel

  • Mengapa penyematan rentang untuk Python? CLI mendukung matriks Python yang luas, sehingga pyproject.toml mempertahankan batas bawah yang konservatif. CI memasang penutupan yang dikunci hash dari rentang tersebut, yang disegarkan pemelihara dengan scripts/dev/refresh_ci_locks.py (iramanya direncanakan mingguan), dan eksekusi mingguan pip-audit.yml me-resolve versi terbaru yang diizinkan untuk mengungkap masalah dengan perkakas saat ini.
  • Mengapa kunci Node yang di-commit? Situs web adalah artefak statis yang di-deploy; berkas kunci memberikan build npm ci yang deterministik untuk permukaan publik tersebut.
  • Mengapa Actions yang disematkan SHA? Tag dapat diubah; SHA tidak dapat diubah. Dependabot mengusulkan peningkatan SHA dan menulis ulang setiap komentar versi, sementara gerbang rilis mencatat setiap penahanan yang disengaja.
  • Apa yang tidak disentuh bot pembaruan. Pembaruan versi Dependabot (.github/dependabot.yml) mencakup penyematan GitHub Actions, berkas kunci situs web, berkas kunci pengemas vsce (tools/vsce), berkas kunci CLI harness yang dipasang oleh channel smoke (tools/channel-smoke), pip yang dikunci hash yang dipasang CI (scripts/ci/requirements-ci-pip.txt), dan hook pre-commit. Sembilan berkas lainnya di scripts/ci adalah penutupan yang dibuat ulang secara utuh dengan scripts/dev/refresh_ci_locks.py; tidak satu pun menyematkan pip, dan pembaruan versi Dependabot untuk folder itu dibatasi pada pip. Batas bawah runtime di pyproject.toml, persyaratan rilis yang dikunci hash, penutupan vendor di src/apothem/_vendor/vendor.txt, dan hook pre-commit yang disematkan seiring dengan pyproject.toml diubah secara manual, karena peningkatan satu penyematan saja akan merusak berkas-berkas yang harus selaras dengannya. Hook ruff dan mypy termasuk di antaranya: tests/scripts/test_ci_tool_locks.py gagal sampai penyematan eksak ruff di pyproject.toml, rev hook, kunci ruff, dan kunci dev memuat satu versi yang sama, dan sampai penyematan eksak mypy, rev hook mypy, dan pustaka yang didaftarkan hook itu cocok dengan kunci dev. Karena itu, pull request keamanan Dependabot untuk salah satu perkakas itu disesuaikan secara manual. Versi mayor @types/node situs web mengikuti batas bawah Node-nya (engines dan .nvmrc, Node 22), sehingga Dependabot hanya mengusulkan pembaruan minor dan patch-nya; naikkan versi mayor tersebut bersamaan dengan batas bawahnya. Pembaruan versi tidak menyentuh blok overrides npm. Pembaruan keamanan Dependabot tetap mencakup setiap manifes, sehingga pull request keamanan dapat mengusulkan salah satu penyematan ini, atau memindahkan sebuah override; sesuaikan secara manual atau tutup pull request tersebut.
  • Menggabungkan pull request Dependabot. Default squash repositori mengambil judul PR. Beberapa judul Dependabot, kebanyakan judul berkelompok yang menyebut sebuah direktori, melampaui batas 72 karakter subjek squash; pemeriksaan PR Title menyebutkannya, dan penggantian judul memperbaikinya. Pull request yang mengubah berkas kunci perkakas tidak menjalankan job ci.yml apa pun, sehingga alur kerja audit npm mengaudit dan memasangnya, mengemas ekstensi VS Code untuk berkas kunci vsce dan menjalankan pengujian rilis vsce, dan alur kerja channel smoke berjalan untuk berkas kunci channel-smoke. Alur kerja Markdown Lint menjalankan hook markdownlint pada pull request hook pre-commit; hook lainnya tidak dijalankan di CI, jadi jalankan pre-commit run --all-files pada branch-nya sebelum menggabungkannya.

On this page