75 lines
4.5 KiB
YAML
75 lines
4.5 KiB
YAML
# На каждый пуш: только мод (.hmod, один для всех ОС) и релиз build-<номер> с ним.
|
||
# Раннер живёт на одной машине с Gitea и другими сервисами (2 ядра, 4 ГБ): сборка мода лёгкая —
|
||
# один поток компиляции, низший приоритет, без системных пакетов и без кэша target.
|
||
# Игра-форк здесь не собирается: только по тегу версии (release.yml, Windows) и вручную (game.yml Linux, desktop.yml macOS).
|
||
name: build
|
||
|
||
on:
|
||
# Branches only: the release's own tag (build-N) mustn't start another build.
|
||
push:
|
||
branches: ['**']
|
||
workflow_dispatch:
|
||
|
||
env:
|
||
CARGO_TERM_COLOR: never
|
||
CARGO_BUILD_JOBS: "1"
|
||
CARGO_INCREMENTAL: "0"
|
||
|
||
jobs:
|
||
mod:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
submodules: recursive
|
||
- name: Rust
|
||
run: |
|
||
curl -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --target wasm32-unknown-unknown
|
||
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
||
# Без actions/cache: кэш-сервер раннера из контейнеров задач недоступен — восстановление
|
||
# падало по таймауту, а сохранение вешало «Complete job» на пару минут. Инструмент собирается заново.
|
||
- name: Форк Horizon
|
||
run: nice -n 19 python3 tools/airdef.py fork
|
||
- name: Проверка закреплённого checkout
|
||
run: python3 -m unittest discover -s tools -p test_engine_checkout.py
|
||
- name: Проверка generated assets
|
||
run: |
|
||
python3 -m pip install --user -r tools/requirements.txt
|
||
python3 tools/gen_models.py --check
|
||
python3 -m unittest discover -s tools -p test_model_bounds.py
|
||
- name: Тесты ядра без SDK
|
||
working-directory: airdef-core
|
||
run: |
|
||
HOST=$(rustc -vV | sed -n 's/^host: //p')
|
||
nice -n 19 cargo test --target "$HOST"
|
||
- name: Тесты мода
|
||
working-directory: airdef-mod
|
||
run: |
|
||
HOST=$(rustc -vV | sed -n 's/^host: //p')
|
||
nice -n 19 cargo test --target "$HOST"
|
||
- name: Мод
|
||
run: nice -n 19 python3 tools/airdef.py mod
|
||
- name: Релиз
|
||
if: github.ref == 'refs/heads/main'
|
||
env:
|
||
TOKEN: ${{ secrets.RELEASE_TOKEN || gitea.token }}
|
||
API: ${{ github.server_url }}/api/v1/repos/${{ github.repository }}
|
||
TAG: build-${{ github.run_number }}
|
||
SHA: ${{ github.sha }}
|
||
run: |
|
||
set -e
|
||
mkdir -p out
|
||
cp airdef-mod/target/horizon-mod/airdef.hmod out/airdef.hmod
|
||
cp airdef-mod/target/horizon-mod/build-identity.json out/build-identity.json
|
||
BODY=$(printf 'Сборка %s (%s).\n\n- airdef.hmod — мод, для всех ОС.\n\nИгра-форк Horizon (нужна для мода): собрать у себя — python3 tools/airdef.py all, или скачать из большого релиза v* (Windows), или запустить вручную workflow game (Linux) / desktop (macOS) с этим тегом.\nКак запускать: docs/INSTALL.md.' "$TAG" "$SHA")
|
||
DATA=$(BODY="$BODY" python3 -c 'import json,os;print(json.dumps({"tag_name":os.environ["TAG"],"target_commitish":os.environ["SHA"],"name":os.environ["TAG"],"body":os.environ["BODY"]}))')
|
||
if [ -z "$TOKEN" ]; then echo "::error::нет токена: добавь секрет RELEASE_TOKEN"; exit 1; fi
|
||
CODE=$(curl -sS -o release.json -w '%{http_code}' -X POST -H "Authorization: token $TOKEN" -H "Content-Type: application/json" "$API/releases" -d "$DATA")
|
||
if [ "$CODE" != "201" ]; then
|
||
echo "::error::Gitea не создала релиз (HTTP $CODE): $(cat release.json). Проверь секрет RELEASE_TOKEN (токен с правом записи в репозиторий)."
|
||
exit 1
|
||
fi
|
||
ID=$(python3 -c 'import json;print(json.load(open("release.json"))["id"])')
|
||
curl -sf -X POST -H "Authorization: token $TOKEN" -F "attachment=@out/airdef.hmod" "$API/releases/$ID/assets?name=airdef.hmod" > /dev/null
|
||
curl -sf -X POST -H "Authorization: token $TOKEN" -F "attachment=@out/build-identity.json" "$API/releases/$ID/assets?name=build-identity.json" > /dev/null
|