From 12b2555451dd0c1518130939a8a59e45f9748438 Mon Sep 17 00:00:00 2001 From: Hermes Date: Sat, 29 Aug 2026 18:27:19 -0500 Subject: [PATCH] ci: publish direct OTA files via package registry --- .gitea/workflows/ota-build.yml | 57 ++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/.gitea/workflows/ota-build.yml b/.gitea/workflows/ota-build.yml index b4643cf..6051819 100644 --- a/.gitea/workflows/ota-build.yml +++ b/.gitea/workflows/ota-build.yml @@ -1,5 +1,9 @@ name: OTA build +permissions: + contents: read + packages: write + on: push: branches: @@ -27,20 +31,53 @@ jobs: - name: Build OTA firmware binaries run: pio run - - name: Collect OTA artifacts + - name: Prepare direct OTA files run: | + set -eu + project_name="${GITHUB_REPOSITORY#*/}" + project_name="${project_name#PlatformIO_}" + timestamp="$(date -u +%Y-%m-%dT%H-%M-%SZ)" mkdir -p dist/ota - find .pio/build -type f -name 'firmware.bin' -exec cp {} dist/ota/ \; - count=$(find dist/ota -type f -name '*.bin' | wc -l) - if [ "$count" -eq 0 ]; then + found=0 + for fw in .pio/build/*/firmware.bin; do + [ -f "$fw" ] || continue + env_name="$(basename "$(dirname "$fw")")" + cp "$fw" "dist/ota/${project_name}_${env_name}_${timestamp}.bin" + found=1 + done + if [ "$found" -eq 0 ]; then echo 'No firmware.bin artifacts were produced.' >&2 exit 1 fi find dist/ota -maxdepth 1 -type f | sort - - name: Upload OTA artifacts - uses: actions/upload-artifact@v3 - with: - name: ota-binaries - path: dist/ota/*.bin - if-no-files-found: error + - name: Upload direct OTA files to Gitea Packages + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + run: | + set -eu + package_name="$(printf '%s' "${GITHUB_REPOSITORY#*/}" | tr '[:upper:]' '[:lower:]')-ota" + package_version="${GITHUB_SHA}" + base_url="${GITHUB_SERVER_URL}/api/packages/${GITHUB_REPOSITORY_OWNER}/generic/${package_name}/${package_version}" + for file in dist/ota/*; do + [ -f "$file" ] || continue + curl --fail --silent --show-error --user "${GITHUB_ACTOR}:${GITEA_TOKEN}" --upload-file "$file" "${base_url}/$(basename "$file")" + echo "Uploaded $(basename "$file")" + done + + - name: Verify uploaded OTA files + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + run: | + set -eu + package_name="$(printf '%s' "${GITHUB_REPOSITORY#*/}" | tr '[:upper:]' '[:lower:]')-ota" + package_version="${GITHUB_SHA}" + curl --fail --silent --show-error --user "${GITHUB_ACTOR}:${GITEA_TOKEN}" "${GITHUB_SERVER_URL}/api/v1/packages/${GITHUB_REPOSITORY_OWNER}/generic/${package_name}/${package_version}/files" > /tmp/package-files.json + python3 - <<'PY' +import json +from pathlib import Path +files=json.loads(Path('/tmp/package-files.json').read_text()) +assert files, 'no package files returned' +for item in files: + print(item.get('name') or item.get('file_name') or item) +PY