Руководство по циклу выпуска
Полный рабочий процесс выпуска от локальных шлюзов через подписанный GitHub Release до необязательного запуска публикации в npm.
Это руководство проводит выпуск vX.Y.Z для apothem от чистого
рабочего дерева до проверенных поверхностей распространения. Процедура
написана для сопровождающего, владеющего gh, git и консолью
релиз-уровня; она завершается проверенной страницей Release, заполненным
CHANGELOG и проверкой пути установки, подтверждающей, что каждая
пользовательская поверхность отвечает на канонической команде установки.
Форма выпуска — один тег, два этапа. Один подписанный тег выпуска на
main запускает .github/workflows/release.yml, который собирает,
подписывает, аттестует и публикует GitHub Release с полным набором
артефактов — sdist, wheel, CycloneDX SBOM, бандлы Sigstore cosign,
происхождение SLSA-3 и архивы платформенной среды выполнения. Необязательный
второй этап — ручной запуск publish-npm.yml, который публикует
@ahmed-g-gad/apothem на npmjs.com после того, как
scripts/release/check-release-ready.sh становится зелёным. Версионный
раздел CHANGELOG создаётся вместе с коммитом тега; оператор запускает
проверку пути установки после того, как оба этапа завершены.
1. Предварительные условия
Сопровождающий подтверждает следующее перед тегированием:
-
Рабочее дерево. Чистое (
git statusне показывает ничего отложенного). Вся работа над функциями для выпуска находится наmain. -
CI зелёный. Последний
maingh run list --branch=main --limit=1 --json conclusion --jq '.[0].conclusion'возвращаетsuccess. -
Инструментарий.
gh(GitHub CLI) версии 2.40 или новее, авторизованный вahmed-g-gad;git2.40 или новее с загруженным подключом подписи GPG; привязка доверенного издателя npm для@ahmed-g-gad/apothemдействует (проверено согласно руководству по настройке аккаунта издателя). -
Якоря версий выровнены. Строка версии, объявленная в
pyproject.toml, совпадает с планируемым тегом без префиксаv. Проверьте:grep '^version' pyproject.tomlОжидаемый вывод (для выпуска
vX.Y.Z; заполнители обозначают выпускаемый тег):version = "X.Y.Z" -
Раздел CHANGELOG подготовлен.
CHANGELOG.mdсодержит версионный раздел под заголовками Keep-a-Changelog. Сопровождающий обновляет дату и релизные пункты в том же коммите, который содержит тег.
2. Тегирование и запуск
2.1 Создание релизного коммита
Релизный коммит содержит два изменения:
- Версионный раздел
CHANGELOG.mdс указанием фактической даты выпуска по UTC. - Версия
pyproject.tomlподнята до новой версии (только когда предыдущий коммит наmainуже содержит закрепление предыдущей версии и требуется свежее поднятие; коммит также может произойти во время цикла поднятия версии за несколько дней до времени тегирования).
Пример коммита:
git checkout main
git pull --ff-only origin main
# Author CHANGELOG and pyproject.toml edits via Edit tool, then:
git add CHANGELOG.md pyproject.toml
git commit -S -m "chore(release): cut vX.Y.Z"
git push origin mainФлаг -S подписывает коммит ключом GPG. Push запускает стандартную
матрицу CI (lint, test, build); дождитесь зелёного перед тегированием.
2.2 Подпись и push тега
git tag -a -s vX.Y.Z -m "vX.Y.Z"
git push origin vX.Y.ZКомбинация -a -s создаёт аннотированный тег с подписью GPG. Push
запускает .github/workflows/release.yml, который собирает, подписывает,
аттестует и публикует.
2.3 Подтверждение завершения релизного рабочего процесса
gh run watch $(gh run list --workflow=release.yml --limit=1 --json databaseId --jq '.[0].databaseId')Рабочий процесс выполняет сборку (sdist + wheel), генерацию
SBOM (CycloneDX), безключевую подпись cosign, генерацию и проверку
происхождения SLSA-3, сборку платформенных архивов (darwin / linux /
windows), подпись архивов с агрегированным манифестом SHA256SUMS и
финальную публикацию GitHub Release. Сопровождающий просматривает журнал
задания publish GitHub Release на предмет подтверждений загрузки активов.
2.4 Запуск публикации в npm (необязательный этап)
После того как GitHub Release и шлюз готовности стали зелёными:
bash scripts/release/check-release-ready.sh vX.Y.Z
gh workflow run publish-npm.yml --field tag=vX.Y.ZОдобрите развёртывание среды npmjs, когда будет предложено. Рабочий
процесс публикует @ahmed-g-gad/[email protected] на npmjs.com через npm
Trusted Publishing (OIDC); в репозитории не хранится токен реестра.
3. Поверхности распространения
У каждой поверхности есть команда проверки, отвечающая на вопрос «приземлился ли выпуск здесь?»:
| # | Поверхность | Артефакт | Проверка |
|---|---|---|---|
| 1 | GitHub Release (дистрибутивы Python) | apothem-X.Y.Z.tar.gz (sdist) + apothem-X.Y.Z-py3-none-any.whl | gh release view vX.Y.Z --json assets --jq '.assets[].name' включает оба имени файлов |
| 2 | GitHub Release (SBOM) | sbom.cdx.json | как в строке 1; список активов включает CycloneDX SBOM |
| 3 | GitHub Release (подписи) | *.cosign.bundle для каждого артефакта дистрибутива; *.sig для каждого архива; SHA256SUMS + SHA256SUMS.sig | cosign verify-blob --bundle <artifact>.cosign.bundle <artifact> завершается с кодом 0 (с флагами идентичности рабочего процесса) |
| 4 | GitHub Release (происхождение) | provenance.intoto.jsonl | bash scripts/release/verify-provenance.sh vX.Y.Z завершается с кодом 0 |
| 5 | GitHub Release (платформенные архивы) | apothem-vX.Y.Z-darwin.tar.gz, apothem-vX.Y.Z-linux.tar.gz, apothem-vX.Y.Z-windows.zip | список активов включает каждый архив плюс SHA256SUMS |
| 6 | npmjs.com | @ahmed-g-gad/[email protected] | npm view @ahmed-g-gad/apothem version возвращает X.Y.Z; npx @ahmed-g-gad/[email protected] --version печатает apothem X.Y.Z |
| 7 | Pages (скриптовые установщики) | install.sh / install.ps1 на сайте документации | curl -fsSL https://apothem.ahmedgad.com/install.sh | head -n 1 возвращает заголовок скрипта |
GitHub Release — это каноническая поверхность артефактов; пакет npm и скриптовые установщики — это пути установки, наложенные поверх него. Публикация в npm намеренно является последним этапом.
4. Дисциплина CHANGELOG
CHANGELOG.md содержит один раздел на выпуск согласно соглашению
Keep-a-Changelog. Правка CHANGELOG в релизном коммите:
- Подтверждает, что версионный раздел использует заголовок
## [X.Y.Z] — YYYY-MM-DD. - Подтверждает, что стандартные заголовки — Added, Changed, Deprecated, Removed, Fixed, Security — используются там, где это применимо. Пустые заголовки удаляются из отрендеренного файла.
- Фиксирует возможности, а не реализацию. Только доменный язык; никаких внутриплановых ссылок; никаких хешей коммитов; никаких идентификаторов плана или фазы.
Раздел CHANGELOG, переживший проверку сопровождающего, читается как якорь релизных заметок для нарратива анонса.
5. Проверка пути установки
После завершения обоих этапов сопровождающий запускает проверку. Проверка — это каноническое подтверждение того, что пользовательские команды установки отвечают.
5.1 Плагин Claude Code
/plugin marketplace add ahmed-g-gad/apothem
/plugin install apothem@apothemОжидается: плагин устанавливается, и команды apothem доступны внутри
Claude Code.
5.2 Node.js (npx)
npx @ahmed-g-gad/[email protected] --versionОжидаемый вывод: apothem X.Y.Z.
5.3 Одношаговый скриптовый установщик (POSIX)
curl -fsSL https://apothem.ahmedgad.com/install.sh | sh
apothem --versionОжидаемый вывод: apothem X.Y.Z.
5.4 Одношаговый скриптовый установщик (Windows)
irm https://apothem.ahmedgad.com/install.ps1 | iex
apothem --versionОжидаемый вывод: apothem X.Y.Z.
5.5 Проверка артефактов (свидетельство цепочки поставок)
gh release download vX.Y.Z --pattern 'apothem-X.Y.Z*' --pattern '*.cosign.bundle'
cosign verify-blob \
--bundle apothem-X.Y.Z-py3-none-any.whl.cosign.bundle \
--certificate-identity-regexp 'github.com/ahmed-g-gad/apothem' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
apothem-X.Y.Z-py3-none-any.whl
bash scripts/release/verify-provenance.sh vX.Y.ZОжидается: обе проверки завершаются с кодом 0.
Проверка выдаёт по одной строке PASS / FAIL на поверхность; записывайте строки в релизный журнал сопровождающего.
6. Восстановление после сбоев
У релизного рабочего процесса есть задокументированные режимы сбоев для релизного движка и издателя npm:
| Сбой | Диагностика | Восстановление |
|---|---|---|
| Push тега отклонён (сбой подписи) | git push origin vX.Y.Z возвращает error: failed to push some refs с сообщением, связанным с GPG | Проверьте, что подключ GPG загружен (gpg --list-secret-keys --keyid-format=long); пере-тегируйте локально с -s после исправления связки ключей; повторите push |
Задание release.yml падает на одном этапе | gh run view <run-id> --log называет упавшее задание (build / sbom / sign / provenance / archive / publish) | Перезапустите только упавшее задание через gh run rerun <run-id> --failed; если сбой повторяется, исправьте вход задания в источнике перед повторным тегированием |
| Проверка происхождения SLSA не проходит | Задание verify SLSA provenance artifact завершается с ненулевым кодом | Проверьте артефакт происхождения на несоответствие дайджеста субъекта; пересоберите из того же тега — происхождение привязано к точным дайджестам артефактов, поэтому любая регенерация артефакта требует полного перезапуска рабочего процесса |
| Публикация на npmjs.com отклонена | Задание npm завершается с ненулевым кодом во время npm publish; ошибка реестра 404 во время PUT — это несоответствие авторизации / доверенного издателя, а не доказательство отсутствия кода пакета | Проверьте, что npm Trusted Publishing для @ahmed-g-gad/apothem называет владельца ahmed-g-gad, репозиторий apothem, рабочий процесс publish-npm.yml и разрешённое действие npm publish; убедитесь, что задание выполняется с версией Node и минимальным уровнем OIDC npm CLI, закреплёнными в рабочем процессе |
| Тег виден, но активы отсутствуют | gh release view vX.Y.Z возвращает заглушку выпуска | Перезапустите задание публикации релизного рабочего процесса; если заглушка сохраняется, удалите страницу выпуска (gh release delete vX.Y.Z --cleanup-tag) и пере-тегируйте из того же SHA |
Если цикл восстановления не приземляет поверхность за один диагностический проход, поверхность регистрируется как известный сбой в релизных заметках со ссылкой на открытую задачу; пользователи направляются на рабочие поверхности, пока сломанная исправляется в патч-выпуске.
7. Перекрёстные ссылки
- Настройка издателя. Руководство по настройке аккаунта издателя устанавливает привязку доверенного издателя npm и предварительные условия на стороне GitHub, которые предполагает это руководство.
- Поток восстановления. Руководство по восстановлению выпуска
(
site/content/docs/runbooks/release-recovery.mdx) управляет межэтапным путём сбоя во время перехода выпуска, а не сбоями отдельных поверхностей, названными в §6. - Включение Pages. Рабочий процесс
publish-static-site.ymlпроверяет и развёртывает сайт проекта на пользовательском домене; руководство по включению Pages (site/content/docs/runbooks/pages-enablement.mdx) — это вышестоящая процедура, которая изначально установила пользовательский домен. - Политика версионирования.
site/content/docs/governance/release-engineering-policy.mdxсодержит политику SemVer + подписи + устаревания, которую соблюдает это руководство.
Руководства по эксплуатации
Руководства по эксплуатации Apothem — пошаговые операционные процедуры для выпусков, настройки публикатора, включения Pages, восстановления и создания адаптеров.
Контрольный список развёртывания
Контрольный список предварительной проверки для развёртывания или совместного использования экосистемы Apothem