Руководство по восстановлению релиза
Процедуры восстановления для релиза, который дал сбой на полпути в рамках аддитивной модели релизов, — поэтапно, без перезаписи опубликованной истории.
Это руководство восстанавливает рабочее состояние, когда релиз vX.Y.Z
репозитория ahmed-g-gad/apothem даёт сбой на полпути. Оно следует той же
модели релизов, что и руководство по циклу релиза:
аддитивной модели. Каждый релиз добавляет один коммит в main и один
подписанный аннотированный тег; push тега запускает рабочие процессы релиза и
npm. Ничего не отправляется через force-push, и история в main никогда не
перезаписывается.
Опубликованная история постоянна. Каждый тег релиза, GitHub Release и версия
npm, которые проект опубликовал, остаются опубликованными. Версии
npm неизменяемы: опубликованный name@version никогда не может быть заменён, а
номер версии, публикация которой была отозвана, никогда не может быть
использован повторно. Поэтому восстановление движется вперёд с новым
патч-релизом; оно не удаляет и не перенаправляет ничего, что пользователь мог
уже установить.
1. Таксономия этапов
| Этап | Действие | Режим сбоя | Путь восстановления |
|---|---|---|---|
| 1 | Поместить коммит релиза в main (§2.1 руководства по циклу релиза) | CI не проходит на коммите релиза | Исправьте вперёд ещё одним коммитом в main; не ставьте тег, пока CI не станет зелёным |
| 2 | Отправить подписанный аннотированный тег | Push отклонён, либо тег не подписан или стоит не на том коммите | §2 ниже |
| 3 | release.yml собирает, подписывает и публикует GitHub Release | Задание даёт сбой, или ресурсы отсутствуют | §3 ниже |
| 4 | publish-npm.yml публикует @ahmed-g-gad/apothem (запускается тем же push тега) | Публикация даёт сбой | §3 ниже |
| 5 | Pages и метаданные репозитория | Сайт или метаданные устарели | §3 ниже |
Каждое действие восстановления идемпотентно. Его запуск на чистом состоянии — это no-op; его запуск на частичном состоянии восстанавливает ожидаемое состояние после этапа.
2. Восстановление тега
Продиагностируйте тег:
git fetch origin --tags
git ls-remote origin refs/tags/vX.Y.Z
git cat-file -t vX.Y.Z # "tag" for an annotated tag
git tag -v vX.Y.Z # signature checkЧто делать, зависит от того, было ли что-либо опубликовано из этого тега:
-
Ещё ничего не опубликовано (рабочий процесс релиза дал сбой до своего задания публикации, и
publish-npm.ymlничего не опубликовал): удалите тег и заново поставьте тег на тот же коммит с-a -s.git push --delete origin vX.Y.Z git tag -d vX.Y.Z git tag -a -s vX.Y.Z -m "vX.Y.Z" <release-commit-sha> git push origin vX.Y.Z -
Что-либо опубликовано (GitHub Release с ресурсами или версия npm): никогда не перемещайте, не удаляйте и не используйте тег повторно. Исправьте вперёд с помощью
vX.Y.(Z+1).
Имя тега никогда не используется повторно для другого коммита.
3. Восстановление публикаторов
Каждый публикатор перезапускается отдельно:
| Поверхность | Диагностика | Восстановление |
|---|---|---|
| Рабочий процесс релиза | gh run view <run-id> --log называет сбойное задание | gh run rerun <run-id> --failed. Сбой на Check the plugin version changed with the plugin означает, что версия не была повышена: см. таблицу сбоев руководства по циклу релиза |
| GitHub Release | gh release view vX.Y.Z --json tagName,isDraft,isPrerelease,assets | Перезапустите задание publish GitHub Release; оно редактирует существующий релиз и повторно загружает ресурсы с --clobber |
| npm | npm view @ahmed-g-gad/apothem version и npx @ahmed-g-gad/[email protected] --version | Перезапустите publish-npm.yml для vX.Y.Z (gh workflow run publish-npm.yml --field tag=vX.Y.Z) после подтверждения доверенной публикации npm для пакета. Если версия уже есть в реестре, рабочий процесс пропускает публикацию, поскольку версии npm неизменяемы |
| Pages | gh run list --workflow=publish-static-site.yml --limit=1 и curl -sSI https://apothem.ahmedgad.com/ | Перезапустите publish-static-site.yml; проверьте, что CNAME всё ещё разрешается в ahmed-g-gad.github.io |
| Метаданные репозитория | gh repo view ahmed-g-gad/apothem --json description,homepageUrl,repositoryTopics,visibility | Исправьте описание, домашнюю страницу и темы на месте; никогда не пересоздавайте репозиторий |
4. Откат
Плохой релиз откатывается выпуском его исправления, а не его удалением:
-
Отмените проблемные коммиты в
main(обычный коммит revert). -
Выпустите
vX.Y.(Z+1)по руководству по циклу релиза. -
Пометьте плохую версию: добавьте заметку
### Yankedв её разделCHANGELOG.md, отредактируйте заметки её GitHub Release так, чтобы они указывали на исправление, и пометьте её как устаревшую в npm:npm deprecate @ahmed-g-gad/[email protected] "Contains <defect>; use X.Y.(Z+1)"
Плохой тег, GitHub Release и версия npm остаются опубликованными, поэтому закреплённые установки и воспроизводимые сборки продолжают разрешаться. Зафиксируйте откат как инцидент релиза.
5. Правило фасада релиза
Правило фасада релиза репозитория (раздел «Release Facade» инструкций для участников) излагает описанную выше аддитивную модель: каждый опубликованный тег, GitHub Release и версия npm остаются опубликованными. Его требование показывать только текущую версию относится к тому, что говорят публичные поверхности. Это руководство никогда не удаляет и не перезаписывает опубликованный тег, GitHub Release или версию npm.
6. Перекрёстные ссылки
- Процедура релиза: руководство по циклу релиза.
- Политика релизов: политика инженерии релизов.
- Объекты тегов и способ проверки каждого из них: раздел о подписи релизов в SECURITY.md.
- Конфигурация Pages:
site/content/docs/runbooks/pages-enablement.mdx.
Контрольный список развёртывания
Контрольный список предварительной проверки для развёртывания или совместного использования экосистемы Apothem
Руководство по включению Pages
Пошаговое руководство по запуску GitHub Pages с пользовательским доменом на apothem.ahmedgad.com через настройку DNS-записи CNAME.