Skip to content
Apothem
Руководства по эксплуатации

Руководство по восстановлению релиза

Процедуры восстановления для релиза, который дал сбой на полпути в рамках аддитивной модели релизов, — поэтапно, без перезаписи опубликованной истории.

Это руководство восстанавливает рабочее состояние, когда релиз 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 ниже
3release.yml собирает, подписывает и публикует GitHub ReleaseЗадание даёт сбой, или ресурсы отсутствуют§3 ниже
4publish-npm.yml публикует @ahmed-g-gad/apothem (запускается тем же push тега)Публикация даёт сбой§3 ниже
5Pages и метаданные репозиторияСайт или метаданные устарели§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 Releasegh release view vX.Y.Z --json tagName,isDraft,isPrerelease,assetsПерезапустите задание publish GitHub Release; оно редактирует существующий релиз и повторно загружает ресурсы с --clobber
npmnpm 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 неизменяемы
Pagesgh 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. Откат

Плохой релиз откатывается выпуском его исправления, а не его удалением:

  1. Отмените проблемные коммиты в main (обычный коммит revert).

  2. Выпустите vX.Y.(Z+1) по руководству по циклу релиза.

  3. Пометьте плохую версию: добавьте заметку ### 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. Перекрёстные ссылки

On this page