name: CI # Spustí se při pushi do devel/release a jde i ručně spustit z GUI. on: push: branches: [devel, release] workflow_dispatch: jobs: test: runs-on: amd64 steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.12" - name: Instalace Poetry run: pip install poetry==2.4.1 - name: Instalace závislostí (vč. dev skupiny) run: poetry install --no-interaction - name: Ruff run: poetry run ruff check . - name: Mypy run: poetry run mypy src - name: Testy run: poetry run pytest -q # Každá architektura se staví NATIVNĚ na vlastním runneru (label = architektura): # amd64 -> srv2-amd64-runner (SRV2), arm64 -> srv1-arm64-runner (SRV1, RPi 4). # Žádná emulace (QEMU). Každý běh pushne image s příponou architektury. build: needs: test strategy: matrix: arch: [amd64, arm64] runs-on: ${{ matrix.arch }} steps: - uses: actions/checkout@v4 # Docker jméno musí být malými písmeny (Honza/Restreamer -> honza/restreamer) - name: Název image run: | echo "IMAGE=gitea.doubynet.eu/$(echo '${{ github.repository }}' \ | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV" # release -> latest (produkce), devel -> devel (staging) - name: Značka podle větve run: | if [ "${{ github.ref_name }}" = "release" ]; then echo "MOVING_TAG=latest" >> "$GITHUB_ENV" else echo "MOVING_TAG=devel" >> "$GITHUB_ENV" fi - name: Přihlášení do Gitea registry run: | echo '${{ secrets.REGISTRY_TOKEN }}' \ | docker login gitea.doubynet.eu -u '${{ github.actor }}' --password-stdin # --provenance=false: bez atestace je per-arch tag obyčejný obrázek. S ní by to byl # index (obrázek + atestace) a `docker manifest create` index do indexu nespojí. - name: Build image (${{ matrix.arch }}) run: | docker build --provenance=false \ -t "$IMAGE:$MOVING_TAG-${{ matrix.arch }}" \ -t "$IMAGE:${{ github.sha }}-${{ matrix.arch }}" . - name: Push image (${{ matrix.arch }}) run: | docker push "$IMAGE:$MOVING_TAG-${{ matrix.arch }}" docker push "$IMAGE:${{ github.sha }}-${{ matrix.arch }}" # Spojí obě architektury pod jedno jméno tagu. `docker pull ...:devel` pak na # amd64 i arm64 stroji sám vybere správnou variantu. manifest: needs: build runs-on: amd64 steps: - name: Název image a značka run: | echo "IMAGE=gitea.doubynet.eu/$(echo '${{ github.repository }}' \ | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV" if [ "${{ github.ref_name }}" = "release" ]; then echo "MOVING_TAG=latest" >> "$GITHUB_ENV" else echo "MOVING_TAG=devel" >> "$GITHUB_ENV" fi - name: Přihlášení do Gitea registry run: | echo '${{ secrets.REGISTRY_TOKEN }}' \ | docker login gitea.doubynet.eu -u '${{ github.actor }}' --password-stdin - name: Multi-arch manifest (moving tag + commit SHA) run: | for TAG in "$MOVING_TAG" "${{ github.sha }}"; do docker manifest create --amend "$IMAGE:$TAG" \ "$IMAGE:$TAG-amd64" "$IMAGE:$TAG-arm64" docker manifest push "$IMAGE:$TAG" done