16. CI/CD и релизы
AstraCode использует GitLab CI/CD для автоматизации сборок и публикации релизов. Архитектура — двухпроектная: сборка в основном репо, бандлы собирает downstream-проект astracode/astra-code-build (его числовой project ID следует уточнить в UI GitLab — конкретное значение здесь приводится как пример).
1. Версионирование
SemVer: MAJOR.MINOR.PATCH. Версия хранится в двух местах и должна быть синхронизирована:
- astracode-rs/Cargo.toml ([workspace.package].version)
- astracode-cli/package.json ("version")
Job check:version-sync в CI падает, если версии разъехались, а при сборке по тегу — ещё и если тег не совпадает с версией Cargo.toml. Проверка реализована прямо в .gitlab-ci.yml (через awk), отдельного скрипта нет. Job записывает ASTRACODE_VERSION в version.env (dotenv-артефакт для downstream-джобов).
2. Триггеры pipeline
Файл .gitlab-ci.yml лежит в корне репозитория astracode/ (не в astracode-rs/). В нём заданы workflow rules:
workflow:
rules:
- if: '$CI_COMMIT_BRANCH == "main"' # пуш в main с изменением Cargo.toml
changes:
- astracode-rs/Cargo.toml
- if: '$CI_PIPELINE_SOURCE == "web"' # ручной запуск через UI
- if: '$CI_COMMIT_TAG =~ /^\d+\.\d+\.\d+$/' # тег SemVer
Pipeline срабатывает:
- При пуше SemVer-тега (например 0.4.11).
- При изменении astracode-rs/Cargo.toml в main (для проверки version-sync).
- Вручную из Web UI.
3. Стадии pipeline
check:version-sync # проверка синхронизации версий Cargo.toml ↔ package.json
↓
build:linux-gnu # cargo build --release --bin astracode
↓
publish:package-registry # PUT в Package Registry основного проекта
↓
trigger:astra-code-build # вызов downstream pipeline astracode/astra-code-build
check:version-sync
Сравнивает версию из [workspace.package].version (Cargo.toml) и "version" (package.json). Должны совпадать; при сборке по тегу тег тоже должен совпадать с версией.
build:linux-gnu
- Выполняется на default-runner'е (отдельный
image:в.gitlab-ci.ymlне задан); toolchain-checks печатают версииrustc/cargo/clang/curl. Сборка используетclang/clang++(переменныеCC/CXX). - Команда:
cd astracode-rs && cargo build --release --bin astracode(без--target— нативная сборка раннера). - Артефакт:
astracode-rs/target/release/astracode(сexpire_in: 1 week).
В будущем планируются параллельные сборки:
- build:linux-musl (статичный бинарник без glibc).
- build:macos-arm64.
- build:macos-x86_64.
- build:windows.
Сейчас macOS-сборки делаются локально и загружаются вручную в Package Registry.
publish:package-registry
Загружает собранный бинарь в Generic Package Registry основного проекта через HTTP PUT. Сначала проверяет, нет ли уже этой версии (HTTP 200 → пропускает), иначе грузит файл:
URL="$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/astracode/$ASTRACODE_VERSION/astracode"
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file astracode-rs/target/release/astracode \
"$URL"
trigger:astra-code-build
Запускает downstream pipeline в проекте astracode/astra-code-build (trigger.project, ветка main, strategy: depend), передавая ASTRACODE_VERSION и ASTRACODE_SOURCE_PROJECT_ID. Downstream:
1. Скачивает свежий бинарник из Package Registry.
2. Упаковывает в platform-specific bundle (с README, LICENSE, npm-wrapper'ом).
3. Загружает финальный бандл в свой Package Registry (откуда тянут пользователи и npm-обёртка).
4. Downstream проект «astra-code-build»
https://gitlab.prosto.aib.pro/astracode/astra-code-build (project ID уточнить в UI)
Это публичная точка распространения. У него есть свой Package Registry:
https://gitlab.prosto.aib.pro/astracode/astra-code-build/-/packages
Структура пакетов
Имена и версии пакетов ниже приведены как шаблон; актуальный список и платформенные триплеты см. в реальном Package Registry и в
scripts/build-release-binaries.py(триплеты:x86_64/aarch64-unknown-linux-musl,x86_64/aarch64-apple-darwin,x86_64/aarch64-pc-windows-msvc).
| Package | Файл |
|---|---|
astracode-linux-x86_64-gnu |
astracode-linux-x86_64-gnu-0.4.11.tar.gz |
astracode-macos (arm64) |
astracode-macos-0.4.11.zip |
astracode-macos-x86_64 |
astracode-macos-x86_64-0.4.11.zip |
astracode-linux-musl |
astracode-linux-musl-0.4.11.tar.gz |
astracode-windows-x86_64 |
astracode-windows-x86_64-0.4.11.zip |
5. Ручная загрузка в Package Registry
Когда CI не отрабатывает (например, для macOS сейчас сборки локальные), загрузка делается вручную:
# Получить персональный access token в Settings → Access Tokens (scope: api) TOKEN="glpat-..." # Загрузить файл (<project_id> — числовой ID проекта astra-code-build в GitLab) curl -k \ --header "PRIVATE-TOKEN: $TOKEN" \ --upload-file ./astracode-macos-0.4.11.zip \ "https://gitlab.prosto.aib.pro/api/v4/projects/<project_id>/packages/generic/astracode-macos/0.4.11/astracode-macos-0.4.11.zip"
Флаг -k — для self-signed certificate GitLab'а.
⚠️ Токены никогда не пушить в репо и сразу отзывать через UI после использования (Settings → Access Tokens → Revoke).
6. Процесс релиза
(пример: выпуск версии 0.4.11 поверх текущей 0.4.11)
1. Все правки в main, тесты зелёные
2. Bump версии:
- sed -i 's/0.4.11/0.4.11/' astracode-rs/Cargo.toml
- sed -i 's/0.4.11/0.4.11/' astracode-cli/package.json
- Обновить status snapshot'ы:
find astracode-rs/tui/src/status/snapshots -name '*.snap' \
| xargs sed -i 's/AstraCode (v0.4.11)/AstraCode (v0.4.12)/g'
3. git commit -m "Bump version to 0.4.11"
4. git tag 0.4.11
5. git push origin main
6. git push origin 0.4.11
7. Pipeline собирает Linux, публикует в Package Registry
8. Триггерит downstream → собирает финальный бандл
9. Для macOS — сборка локально:
cargo build --release --target aarch64-apple-darwin --bin astracode
10. Архивируем и грузим вручную (см. п.5)
11. Пишем release notes в CHANGELOG.md
12. (опционально) gh release create / GitLab Release
7. Release notes
В astracode/CHANGELOG.md (в корне репо) ведётся история по версиям на русском, секциями «Добавлено / Изменено / Удалено / Исправлено». Текущая незарелизенная работа — под заголовком «Не выпущено». Шаблон записи:
## 0.4.11 - <YYYY-MM-DD> ### Добавлено - ... ### Исправлено - ... ### Изменено - ...
См. astracode/CHANGELOG.md для актуальной истории.
8. CHANGELOG генерация
В корне репо есть cliff.toml — конфиг для git-cliff. Генерация:
git-cliff --tag 0.4.11 > CHANGELOG.md
git-cliff читает commit messages и группирует по типам (feat, fix, chore, …).
Conventional commits style:
feat(tui): add /help command with pager overlay fix(locale): allow /locale after /new and /clear chore(release): bump to 0.4.11
9. Голосование / одобрение релиза
Сейчас нет автоматических голосований — релиз помечает тегом сопровождающий. Для критичных релизов:
1. Создаётся ветка release/0.4.11.
2. PR в main.
3. Минимум 1 reviewer approval.
4. После merge — тегируется.
10. Откат релиза
Если в 0.4.11 нашли блокирующий баг:
# Удалить тег git tag -d 0.4.11 git push origin :refs/tags/0.4.11 # Удалить пакеты в Registry (через UI или API) curl -k --header "PRIVATE-TOKEN: $TOKEN" \ --request DELETE \ "https://gitlab.prosto.aib.pro/api/v4/projects/<project_id>/packages/<package_id>"
Затем выпустить патч-версию с фиксом и yank-уведомлением в CHANGELOG.
11. npm-пакет
astracode-cli/package.json определяет npm-обёртку. Реальная структура:
{
"name": "@astracode/astracode-cli",
"version": "0.4.11",
"license": "Apache-2.0",
"bin": { "astracode": "bin/astracode.js" },
"type": "module",
"files": ["bin", "vendor"]
}
Никакого scripts/postinstall и download-binary.js в обёртке нет. Точка входа — bin/astracode.js (ESM): по process.platform/arch она определяет target-triple, резолвит соответствующий платформенный npm-пакет (@astracode/astracode-cli-linux-x64, -darwin-arm64, -win32-x64, ...) и через spawn запускает вложенный нативный бинарь. То есть бинарники приезжают как зависимости-пакеты под конкретную платформу, а не докачиваются постинсталл-скриптом.
Публикация в npm:
cd astracode-cli npm publish --access public
(Для on-prem можно публиковать во внутренний Verdaccio.)
12. Безопасность CI
CI_JOB_TOKEN— короткоживущий, скоупится на текущий проект.- Личные токены (
glpat-...) не должны попадать в pipeline (только локально). - Подпись бинарников пока не выполняется (рассматривается minisign или GPG).
- SBOM (Software Bill of Materials) пока не генерируется (рассматривается
cargo cyclonedx).
13. Файлы CI
.gitlab-ci.yml(в корне репоastracode/) — основной pipeline; version-sync встроен в jobcheck:version-sync(черезawk), отдельных shell-скриптов нетscripts/build-release-binaries.py— сборка/стейджинг релизных бинарников по платформам (Python)scripts/stage_npm_packages.py— подготовка npm-пакетовastracode-rs/scripts/setup-windows.ps1— установка зависимостей для Windows-сборкиcliff.toml(в корне репо) — конфиг git-cliff для CHANGELOGastracode-cli/bin/astracode.js— точка входа npm-обёртки (резолвит платформенный пакет и спавнит бинарь)