147 lines
5.1 KiB
YAML
147 lines
5.1 KiB
YAML
name: Firmware build
|
|
|
|
# Сборка прошивок на своём Gitea-раннере (метка ubuntu-latest, см. ci/README.md).
|
|
#
|
|
# push в main — собрать набор прошивок и выгрузить артефакты
|
|
# push тега — то же плюс черновик релиза с прикреплёнными файлами
|
|
# вручную — можно задать targets / match / version
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
tags:
|
|
- 'v*'
|
|
- '*-v*'
|
|
paths-ignore:
|
|
- '**/*.md'
|
|
- '.preview/**'
|
|
- 'ci/**'
|
|
workflow_dispatch:
|
|
inputs:
|
|
targets:
|
|
description: 'env через запятую (пусто — набор по умолчанию)'
|
|
required: false
|
|
default: ''
|
|
match:
|
|
description: 'подстрока имени env, например heltec_t096'
|
|
required: false
|
|
default: ''
|
|
version:
|
|
description: 'FIRMWARE_VERSION (по умолчанию ci)'
|
|
required: false
|
|
default: ''
|
|
|
|
permissions:
|
|
contents: write
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 300
|
|
steps:
|
|
- name: Клонирование
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Кэш PlatformIO
|
|
uses: actions/cache@v4
|
|
continue-on-error: true # сервер кэша может быть недоступен — сборку это ломать не должно
|
|
with:
|
|
path: |
|
|
~/.cache/pip
|
|
~/.platformio
|
|
~/.platformio-venv
|
|
key: pio-${{ runner.os }}-v1
|
|
restore-keys: |
|
|
pio-${{ runner.os }}-
|
|
|
|
- name: PlatformIO
|
|
run: |
|
|
# отдельное venv: на свежих Debian/Ubuntu pip в систему запрещён (PEP 668)
|
|
python3 -m venv "$HOME/.platformio-venv"
|
|
"$HOME/.platformio-venv/bin/pip" install --upgrade pip platformio
|
|
echo "$HOME/.platformio-venv/bin" >> "$GITHUB_PATH"
|
|
|
|
- name: Версия прошивки
|
|
run: |
|
|
# тег вида companion-v1.2.3 даёт версию v1.2.3; иначе — значение из запуска
|
|
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
|
|
TAG="${GITHUB_REF#refs/tags/}"
|
|
VERSION="${TAG##*-}"
|
|
else
|
|
VERSION="${{ github.event.inputs.version }}"
|
|
[[ -z "$VERSION" ]] && VERSION="ci"
|
|
fi
|
|
echo "FIRMWARE_VERSION=$VERSION" >> "$GITHUB_ENV"
|
|
echo "версия: $VERSION"
|
|
|
|
- name: Сборка прошивок
|
|
env:
|
|
TARGETS: ${{ github.event.inputs.targets }}
|
|
MATCH: ${{ github.event.inputs.match }}
|
|
run: bash ci/build-firmwares.sh
|
|
|
|
- name: Выгрузка артефактов
|
|
uses: actions/upload-artifact@v4
|
|
if: always()
|
|
with:
|
|
name: firmware
|
|
path: out/
|
|
if-no-files-found: warn
|
|
|
|
release:
|
|
needs: build
|
|
if: startsWith(github.ref, 'refs/tags/')
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 30
|
|
steps:
|
|
- name: Скачивание артефактов
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
name: firmware
|
|
path: out
|
|
|
|
- name: Черновик релиза
|
|
env:
|
|
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
set -euo pipefail
|
|
TAG="${GITHUB_REF#refs/tags/}"
|
|
API="${{ github.server_url }}/api/v1/repos/${{ github.repository }}"
|
|
|
|
if [[ -z "${TOKEN:-}" ]]; then
|
|
echo "Нет токена для Gitea API (secrets.GITHUB_TOKEN пуст)" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "файлы к релизу:"
|
|
ls -1 out
|
|
|
|
# черновик: релиз создаётся, но не публикуется — проверить и нажать Publish
|
|
RESPONSE=$(curl -fsS -X POST "$API/releases" \
|
|
-H "Authorization: token $TOKEN" \
|
|
-H 'Content-Type: application/json' \
|
|
-d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"draft\":true,\"prerelease\":false,\"target_commitish\":\"$GITHUB_SHA\"}")
|
|
|
|
# id разбираем питоном: в ответе есть и другие поля id (автор, вложения)
|
|
RELEASE_ID=$(printf '%s' "$RESPONSE" | python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')
|
|
|
|
if [[ -z "$RELEASE_ID" ]]; then
|
|
echo "Не удалось создать релиз для тега $TAG" >&2
|
|
exit 1
|
|
fi
|
|
echo "релиз #$RELEASE_ID создан (черновик)"
|
|
|
|
for f in out/*; do
|
|
[[ -f "$f" ]] || continue
|
|
name="$(basename "$f")"
|
|
echo " прикрепляю $name"
|
|
curl -fsS -X POST "$API/releases/$RELEASE_ID/assets?name=$name" \
|
|
-H "Authorization: token $TOKEN" \
|
|
-F "attachment=@$f" > /dev/null
|
|
done
|
|
|
|
echo "готово: ${{ github.server_url }}/${{ github.repository }}/releases"
|