Files
senboost/.github/workflows/ci.yml
T
maeneko c71a27c9a3 Переименование проекта: RKNboost → SenBoost
Затрагивает не только видимые строки, но и системные идентификаторы: appId
(com.senboost.app), служба Windows (senboost-zapret) и её каталог в %ProgramData%,
LaunchDaemon и pf-якорь на macOS (com.senboost.zapret, com.apple/senboost),
каталог /run/senboost и таблица nftables на Linux, маркер стратегии в strategy.cfg
(--comment=senboost:<id>:<hash>), а также каталог userData, который Electron
выводит из имени приложения.
2026-09-04 14:41:56 +03:00

198 lines
9.1 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 заливает артефакты несколькими параллельными publisher'ами внутри
# этой же джобы, а с приходом Linux-сборки (отдельная джоба ниже) к этому добавилась
# ещё и гонка МЕЖДУ джобами: обе проверяют, есть ли релиз с этим тегом, обе видят «нет»
# и обе лезут его создавать — вторая падает с 422 already_exists (на v0.5.0 так
# потерялся сам .exe, когда конкурентами были два publisher'а внутри одной джобы).
# `|| true` — проигравшая гонку джоба не должна из-за этого падать целиком: релиз
# к моменту upload всё равно уже существует, просто создала его не она.
- 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 '' || true
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 --win --publish ${{ startsWith(github.ref, 'refs/tags/v') && 'always' || 'never' }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# differentialPackage: false и publishAutoUpdate: false в electron-builder.yml убирают
# .blockmap и latest.yml из ассетов (electron-updater в приложении нет — они были бы
# мёртвым грузом). В релизе должен остаться только .exe и контрольная сумма к нему.
- name: Контрольная сумма
if: startsWith(github.ref, 'refs/tags/v')
shell: bash
run: |
set -euo pipefail
exe="$(ls release/*.exe)"
md5sum "$exe" | awk '{ print $1 }' > "$exe.md5"
gh release upload "$GITHUB_REF_NAME" "$exe.md5" --clobber
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Релиз создан с пустым описанием, поэтому список изменений дописываем сами:
# коммиты между предыдущим тегом vX.Y.Z и текущим. Только в этой джобе — если то же
# самое сделает ещё и Linux-сборка, они просто перезапишут результат друг друга.
- 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: senboost-windows
path: release/*.exe
if-no-files-found: error
retention-days: 7
build-linux:
name: Сборка (Linux)
needs: check
runs-on: ubuntu-latest
# На тег vX.Y.Z нужен contents: write — electron-builder публикует релиз через GH_TOKEN.
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
- run: npm ci
# Без этого шага сборка уезжает без nfqws: extraResources в electron-builder.yml
# просто копирует resources/zapret, а он у чистого чекаута пуст.
- run: node scripts/fetch-zapret.mjs
# Та же гонка «кто первый создаст релиз», что и в джобе Windows выше — эта джоба
# с ней конкурирует наравне (обе стартуют параллельно после check), отсюда и тот же
# `|| true`. Комментарий с полным объяснением — в джобе Windows.
- 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 '' || true
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Подпись/нотаризация не при чём здесь — это Linux, .AppImage и .deb неподписанные
# в любом случае. На push в main/PR публикации нет — только упаковка и Artifacts ниже.
- name: Build
run: npx --no-install electron-vite build && npx --no-install electron-builder --linux --publish ${{ startsWith(github.ref, 'refs/tags/v') && 'always' || 'never' }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Тот же мотив, что у Windows-джобы: в релизе должны остаться только сами артефакты
# и контрольная сумма к каждому — никаких .blockmap/latest-linux.yml.
- name: Контрольная сумма
if: startsWith(github.ref, 'refs/tags/v')
shell: bash
run: |
set -euo pipefail
shopt -s nullglob
files=(release/*.AppImage release/*.deb)
if [ "${#files[@]}" -eq 0 ]; then
echo "не нашлось ни .AppImage, ни .deb в release/" >&2
exit 1
fi
for file in "${files[@]}"; do
md5sum "$file" | awk '{ print $1 }' > "$file.md5"
gh release upload "$GITHUB_REF_NAME" "$file.md5" --clobber
done
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/upload-artifact@v4
with:
name: senboost-linux
path: |
release/*.AppImage
release/*.deb
if-no-files-found: error
retention-days: 7