Files
syshelper/.gitea/workflows/ci.yml
T

137 lines
6.4 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: ["**"]
tags: ["v*"]
pull_request:
workflow_dispatch:
env:
TARGET: x86_64-pc-windows-msvc
# Адрес, который вшивается в программу как источник обновлений. Берётся из
# самого Gitea, так что при переезде инстанса менять ничего не нужно.
# Контекст github, а не gitea: Gitea Actions заполняет его ради
# совместимости, и он поддерживается всеми версиями.
SYSHELPER_UPDATE_BASE: ${{ github.server_url }}
jobs:
build:
runs-on: ubuntu-latest
# Debian с node: node нужен самому Gitea Actions, чтобы запускать
# JS-действия вроде actions/checkout внутри контейнера.
container:
image: node:20-bookworm
steps:
- uses: actions/checkout@v4
# Windows-сборка идёт кросс-компиляцией:
# clang/lld — компилятор и компоновщик для MSVC-таргета;
# llvm — даёт llvm-lib; без него падает сборка ring, который
# компилирует свой C-код и требует архиватор (проверено);
# wine + i386 — под ним работает ISCC.exe, компилятор Inno Setup (он 32-битный);
# xvfb + xauth — Wine дёргает X даже там, где окно не показывает, а
# xvfb-run без xauth не стартует вовсе (проверено).
- name: Системные зависимости
run: |
set -eux
dpkg --add-architecture i386
apt-get update -qq
apt-get install -y -qq --no-install-recommends \
ca-certificates curl jq file \
clang lld llvm \
wine wine32:i386 wine64 xvfb xauth
- name: Rust и cargo-xwin
run: |
set -eux
# minimal не включает clippy — без явного компонента шаг проверки упадёт
curl -fsSL https://sh.rustup.rs | sh -s -- -y \
--profile minimal --component clippy --default-toolchain stable
. "$HOME/.cargo/env"
rustup target add "$TARGET"
cargo install cargo-xwin --locked
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
- name: Версия
id: meta
run: |
set -eu
case "$GITHUB_REF" in
refs/tags/v*) version="${GITHUB_REF#refs/tags/v}" ;;
*) version=$(grep -m1 '^version' Cargo.toml | cut -d'"' -f2) ;;
esac
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "версия: $version"
# Именно под Windows-таргетом: большая часть кода — служба и работа с
# процессами — скрыта за cfg(windows), и на линуксовой цели не проверится.
- name: Clippy
run: cargo xwin clippy --release --locked --target "$TARGET" -- -D warnings
- name: Сборка
run: cargo xwin build --release --locked --target "$TARGET"
# ISCC.exe — 32-битное приложение Windows, поэтому запускается под Wine.
# Версия закреплена: скрипту нужен минимум 6.1 (SaveStringsToUTF8File) и
# 6.3 (ArchitecturesAllowed=x64compatible). Качаем с GitHub — jrsoftware.org
# отдаёт по /download.php страницу, а не файл, а files.jrsoftware.org
# выкладывает только подписи (проверено).
- name: Inno Setup под Wine
env:
WINEPREFIX: /tmp/wine
WINEDEBUG: "-all"
INNO_URL: https://github.com/jrsoftware/issrc/releases/download/is-6_7_3/innosetup-6.7.3.exe
run: |
set -eux
xvfb-run -a wineboot --init
curl -fsSL -o /tmp/innosetup.exe "$INNO_URL"
xvfb-run -a wine /tmp/innosetup.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-
ls "$WINEPREFIX/drive_c/Program Files (x86)/Inno Setup 6/ISCC.exe"
- name: Установщик
env:
WINEPREFIX: /tmp/wine
WINEDEBUG: "-all"
run: |
set -eux
mkdir -p dist
xvfb-run -a wine "$WINEPREFIX/drive_c/Program Files (x86)/Inno Setup 6/ISCC.exe" \
"/DAppVersion=${{ steps.meta.outputs.version }}" \
"/DExeSource=..\\target\\$TARGET\\release\\syshelper.exe" \
installer/setup.iss
ls -la dist
# v3, а не v4: приём артефактов v4 умеют не все версии Gitea.
- uses: actions/upload-artifact@v3
with:
name: syshelper-${{ steps.meta.outputs.version }}-windows-x64
path: dist/*.exe
# Релиз создаём через API Gitea: он совместим с GitHub по формату, но
# готовых действий для него в самоподнятом инстансе может не оказаться.
- name: Релиз
if: startsWith(github.ref, 'refs/tags/v')
env:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
API: ${{ github.server_url }}/api/v1/repos/${{ github.repository }}
TAG: ${{ github.ref_name }}
run: |
# pipefail обязателен: без него провал curl потерялся бы за успешным
# jq, id стал бы null, и ассеты полетели бы в несуществующий релиз.
# Без -x: в команде участвует токен.
set -euo pipefail
id=$(curl -fsS -X POST "$API/releases" \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\"}" | jq -r .id)
echo "релиз $TAG (id $id)"
for file in dist/*.exe; do
echo "загружаю $(basename "$file")"
curl -fsS -X POST "$API/releases/$id/assets?name=$(basename "$file")" \
-H "Authorization: token $TOKEN" \
-F "attachment=@$file" > /dev/null
done