110 lines
3.9 KiB
YAML
110 lines
3.9 KiB
YAML
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: Verify generated developer Wiki
|
|
run: ./scripts/docs/generate-wiki.py --check
|
|
- 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
|