Files
senboost/.github/workflows/ci.yml
T
maeneko beced42f2f Создавать релиз до сборки: чинит гонку двух publisher'ов
electron-builder заливает .exe и .blockmap параллельно, оба проверяют наличие
релиза, оба видят «нет» и оба его создают — второй падает с 422 already_exists
и уносит с собой свой файл. На v0.5.0 так потерялся сам .exe.
2026-09-03 08:06:31 +03:00

113 lines
4.8 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: CI
on:
push:
branches: [main]
tags: ['v*']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
check:
name: Линт и типы
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
- run: npm ci
- run: npm run lint
- run: npm run typecheck
- run: npm run format:check
build:
name: Сборка (Windows)
needs: check
runs-on: windows-latest
# На тег vX.Y.Z нужен contents: write — electron-builder публикует релиз через GH_TOKEN.
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
# fetch-depth: 0 — шагу «Описание релиза» ниже нужны вся история и теги,
# чтобы найти предыдущий vX.Y.Z и собрать список коммитов после него.
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
- run: npm ci
# Без этого шага Windows-сборка уезжает без winws.exe: extraResources в
# electron-builder.yml просто копирует resources/zapret, а он у чистого чекаута пуст.
- run: node scripts/fetch-zapret.mjs
# electron-builder заливает .exe и .blockmap двумя параллельными publisher'ами: оба
# проверяют, есть ли релиз с этим тегом, оба видят «нет» и оба лезут его создавать —
# второй падает с 422 already_exists и уносит с собой свой файл (на v0.5.0 так потерялся
# сам .exe). Создаём релиз заранее, тогда обоим остаётся только залить в готовый.
# Описание пустое — его заполняет шаг «Описание релиза» после сборки.
- name: Заготовка релиза
if: startsWith(github.ref, 'refs/tags/v')
shell: bash
run: |
gh release view "$GITHUB_REF_NAME" >/dev/null 2>&1 ||
gh release create "$GITHUB_REF_NAME" --title "${GITHUB_REF_NAME#v}" --notes ''
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Подпись не настроена: артефакты неподписанные.
# Чтобы подписывать — добавьте секреты CSC_LINK, CSC_KEY_PASSWORD и передайте их в env.
#
# На пуш тега vX.Y.Z (см. on.push.tags выше) electron-builder заливает .exe в релиз,
# заготовленный шагом выше, используя repository из package.json.
# На push в main/PR публикации нет — только упаковка и загрузка в Artifacts ниже.
- name: Build
run: npx --no-install electron-vite build && npx --no-install electron-builder --publish ${{ startsWith(github.ref, 'refs/tags/v') && 'always' || 'never' }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Релиз создан с пустым описанием, поэтому список изменений дописываем сами:
# коммиты между предыдущим тегом vX.Y.Z и текущим.
- name: Описание релиза
if: startsWith(github.ref, 'refs/tags/v')
shell: bash
run: |
set -euo pipefail
TAG="$GITHUB_REF_NAME"
# Предыдущий тег vX.Y.Z, начиная от родителя текущего. Пусто, если релиз первый.
PREV="$(git describe --tags --abbrev=0 --match 'v*' "$TAG^" 2>/dev/null || true)"
NOTES="$RUNNER_TEMP/release-notes.md"
{
if [ -n "$PREV" ]; then
echo "## Изменения с $PREV"
echo
git log --no-merges --pretty=format:'- %s (%h)' "$PREV..$TAG"
echo
echo
echo "**Полный diff:** https://github.com/$GITHUB_REPOSITORY/compare/$PREV...$TAG"
else
echo "## Изменения"
echo
git log --no-merges --pretty=format:'- %s (%h)' "$TAG"
echo
fi
} > "$NOTES"
gh release edit "$TAG" --notes-file "$NOTES"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/upload-artifact@v4
with:
name: rknboost-windows
path: release/*.exe
if-no-files-found: error
retention-days: 7