Процесс выпуска SafePass
Руководство описывает подготовку релиза по тегу, упаковку артефактов, проверку целостности и меры защиты цепочки поставок.
Обзор
Workflow .github/workflows/release.yml создаёт черновик GitHub Release. Перед публикацией команда проверяет сборки, заметки и результаты финального ревью. GitHub Actions в этом репозитории отключены, поэтому наличие workflow не означает, что релиз уже собран или доступен.
Запуск выпуска
- Отправка тега версии:
git push origin v0.1.0. Поддерживаются шаблоныv*.*.*иv*.*.*-*. - Ручной запуск через Actions → SafePass draft release → Run workflow (
workflow_dispatch). Выберите исходную ссылку и существующий тег версии, указывающий на тот же коммит.
Workflow проверяет тег перед сборкой и перед созданием релиза. Защитите теги от изменения и удаления. Проверки не блокируют тег на время сборки и не создают подписанное подтверждение происхождения.
Артефакты релиза
Workflow упаковывает перечисленные файлы и публикует контрольные суммы SHA-256. Подпись платформенных сборок и подписанное подтверждение происхождения пока не настроены.
| Платформа или цель | Файл | Содержимое |
|---|---|---|
| Linux | safepass-<version>-linux-x64.tar.gz |
Клиент Flutter для Linux x64 |
| Windows | safepass-<version>-windows-x64.zip |
Клиент Flutter для Windows x64 |
| macOS | safepass-<version>-macos-universal.zip |
Универсальный .app для Apple Silicon и Intel |
| Android | safepass-<version>-android.apk |
APK приложения |
| Chromium | safepass-<version>-browser-chromium.zip |
Расширение Manifest V3 для Chrome, Brave и Chromium |
| Firefox | safepass-<version>-browser-firefox.zip |
Расширение Manifest V3 для Firefox |
| Native Messaging | safepass-<version>-native-host-linux-x64.tar.gz и safepass-<version>-native-host-windows-x64.zip |
Необязательный нативный процесс и установщик регистрации |
| ASP.NET Core API | safepass-<version>-api-linux-x64.tar.gz |
Сервис синхронизации и OPAQUE |
| SPDX SBOM | dependencies.spdx.json |
Список зависимостей Cargo, npm, pub и NuGet в SPDX 2.3 |
| Отчёт об уязвимостях | osv-results.json |
Результаты OSV-Scanner |
| Отчёт о лицензиях | license-report.csv |
Проверка сторонних лицензий по правилам репозитория |
| Контрольные суммы | checksums.sha256 |
SHA-256 каждого файла релиза |
Локальная упаковка в Linux
Соберите доступные в Linux артефакты и проверьте упаковку без CI:
bash scripts/package-release-artifacts.sh --version 0.1.0-preview--output-dir <DIR>задаёт каталог архивов. По умолчанию это.artifacts/releaseотносительно корня репозитория. Указанный относительный путь отсчитывается от каталога запуска.--version <VER>задаёт тег или идентификатор версии.--skip-buildупаковывает уже собранные результаты.--components <LIST>ограничивает набор компонентов, напримерlinux,extensions,api,supply-chain.
Для упаковки API с --skip-build положите результат публикации в .artifacts/api-publish в корне репозитория. Пример:
dotnet publish services/api/SafePass.Api/SafePass.Api.csproj \
--configuration Release --output .artifacts/api-publish
bash scripts/package-release-artifacts.sh --version 0.1.0-preview \
--components api --skip-buildВторая команда архивирует результат без вызова dotnet и может работать без .NET SDK. При отсутствии каталога публикации упаковщик сообщает об этом и пропускает API. Отчёты о цепочке поставок генерируются отдельно от компиляции, если выбран соответствующий компонент.
Проверка контрольных сумм
Каждый релиз содержит манифест checksums.sha256. В Linux или macOS выполните:
sha256sum --check --ignore-missing checksums.sha256В Windows используйте PowerShell:
Get-FileHash -Algorithm SHA256 safepass-*-windows-x64.zipСверьте полученный хеш со значением из checksums.sha256.
Подпись кода и происхождение сборок
Когда будут настроены Android keystore, сертификат Apple Developer и notarization, а также Windows Authenticode, шаги подписи добавят в соответствующие задания до упаковки. Состояние этой работы отслеживается в TODO.md.
Входные данные подписи Android можно проверить до сборки:
python3 scripts/check-android-release-signing.py --require-keytoolПроверка завершается ошибкой при отсутствии переменной SAFEPASS_ANDROID_*, нечитаемом или неподдерживаемом хранилище, неверном пароле хранилища или ключа, псевдониме без закрытого ключа и сроке сертификата менее 25 лет для Google Play. Пароли поступают в keytool через окружение и не попадают в список процессов или журнал сборки.