name: Build and publish release on: push: branches: [main] workflow_dispatch: concurrency: group: openunifi-release cancel-in-progress: false permissions: code: read releases: write jobs: metadata: runs-on: ubuntu-latest outputs: version: ${{ steps.release.outputs.version }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Validate documentation generator run: | mkdir -p "$RUNNER_TEMP/openuf-wiki" python3 ./scripts/docs/generate-wiki.py --output "$RUNNER_TEMP/openuf-wiki" python3 ./scripts/docs/generate-wiki.py --check --output "$RUNNER_TEMP/openuf-wiki" - name: Install metadata dependencies run: sudo apt-get update && sudo apt-get install --yes jq - name: Read release configuration id: release shell: bash run: | set -euo pipefail major="$(jq -er '.version.major | select(type == "number" and floor == . and . >= 0)' .gitea/release-targets.json)" minor="$(jq -er '.version.minor | select(type == "number" and floor == . and . >= 0)' .gitea/release-targets.json)" tag_prefix="v${major}.${minor}." latest_patch=-1 while IFS= read -r tag; do candidate="${tag#"$tag_prefix"}" if [[ $candidate =~ ^(0|[1-9][0-9]*)$ ]] && (( candidate > latest_patch )); then latest_patch=$candidate fi done < <(git tag --list "${tag_prefix}*") patch=$((latest_patch + 1)) version="${major}.${minor}.${patch}" jq -e ' (.targets | length > 0) and ([.targets[].architecture] | length == (unique | length)) and all(.targets[]; (.architecture | type == "string" and test("^[A-Za-z0-9_-]+$"))) ' .gitea/release-targets.json >/dev/null printf 'version=%s\n' "$version" >>"$GITHUB_OUTPUT" create-release: needs: metadata runs-on: ubuntu-latest outputs: release-id: ${{ steps.create.outputs.release-id }} steps: - uses: actions/checkout@v4 - name: Install release dependencies run: sudo apt-get update && sudo apt-get install --yes curl jq - name: Create draft release id: create env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} VERSION: ${{ needs.metadata.outputs.version }} run: | release_id="$(scripts/ci/gitea-release.sh create)" printf 'release-id=%s\n' "$release_id" >>"$GITHUB_OUTPUT" build: needs: [metadata, create-release] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install SDK build dependencies shell: bash run: | sudo apt-get update packages=(build-essential clang flex bison g++ gawk gettext git libncurses-dev libssl-dev python3 rsync unzip zlib1g-dev file wget patch time curl jq zstd) case "$(uname -m)" in aarch64|arm64|armv7l|armv8l) packages+=(qemu-user-static) ;; esac sudo apt-get install --yes "${packages[@]}" - name: Build and upload configured packages env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} RELEASE_ID: ${{ needs.create-release.outputs.release-id }} VERSION: ${{ needs.metadata.outputs.version }} shell: bash run: | set -euo pipefail while IFS= read -r architecture; do scripts/ci/build-release.sh .gitea/release-targets.json "$architecture" "$VERSION" dist ASSET="dist/openUniFi-${architecture}-${VERSION}.apk" scripts/ci/gitea-release.sh upload done < <(jq -r '.targets[].architecture' .gitea/release-targets.json) publish-release: needs: [metadata, create-release, build] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Publish completed release env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} RELEASE_ID: ${{ needs.create-release.outputs.release-id }} run: scripts/ci/gitea-release.sh publish