workflow patch
This commit is contained in:
1 parent
645c461d2a
commit
f1e7ba0b94
1 file changed
+258
-19
+258
-19
@@ -1,4 +1,4 @@
|
|||||||
name: Build OpenWrt packages
|
name: Build and Release OpenWrt packages
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
@@ -9,6 +9,12 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
# Gitea's built-in GITEA_TOKEN needs release write permission for tag releases.
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
actions: read
|
||||||
|
releases: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -39,6 +45,25 @@ jobs:
|
|||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Resolve package version
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
if [ "${GITHUB_REF_TYPE}" = "tag" ]; then
|
||||||
|
VERSION="${GITHUB_REF_NAME#v}"
|
||||||
|
else
|
||||||
|
VERSION="$(sed -n 's/^PKG_VERSION:=//p' Makefile | head -n1)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${VERSION}" ]; then
|
||||||
|
echo "Unable to resolve package version"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "PACKAGE_VERSION=${VERSION}" >> "${GITHUB_ENV}"
|
||||||
|
echo "Package version: ${VERSION}"
|
||||||
|
|
||||||
- name: Install build dependencies
|
- name: Install build dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
@@ -50,8 +75,8 @@ jobs:
|
|||||||
SUDO=
|
SUDO=
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$SUDO apt-get update
|
${SUDO} apt-get update
|
||||||
$SUDO env DEBIAN_FRONTEND=noninteractive apt-get install -y \
|
${SUDO} env DEBIAN_FRONTEND=noninteractive apt-get install -y \
|
||||||
build-essential \
|
build-essential \
|
||||||
clang \
|
clang \
|
||||||
flex \
|
flex \
|
||||||
@@ -72,29 +97,35 @@ jobs:
|
|||||||
zlib1g-dev \
|
zlib1g-dev \
|
||||||
zstd
|
zstd
|
||||||
|
|
||||||
- name: Download and verify SDK
|
- name: Download and verify OpenWrt SDK
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
set -eux
|
set -eux
|
||||||
|
|
||||||
wget -O "${{ matrix.sdk_file }}" "${{ matrix.sdk_url }}"
|
wget -O "${{ matrix.sdk_file }}" "${{ matrix.sdk_url }}"
|
||||||
echo "${{ matrix.sdk_sha256 }} ${{ matrix.sdk_file }}" | sha256sum -c -
|
echo "${{ matrix.sdk_sha256 }} ${{ matrix.sdk_file }}" | sha256sum -c -
|
||||||
|
|
||||||
- name: Extract SDK
|
- name: Extract OpenWrt SDK
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
set -eux
|
set -eux
|
||||||
|
|
||||||
rm -rf _sdk
|
rm -rf _sdk
|
||||||
mkdir _sdk
|
mkdir -p _sdk
|
||||||
|
|
||||||
case "${{ matrix.sdk_file }}" in
|
case "${{ matrix.sdk_file }}" in
|
||||||
*.tar.zst)
|
*.tar.zst)
|
||||||
tar --zstd -xf "${{ matrix.sdk_file }}" --strip-components=1 -C _sdk
|
tar --zstd -xf "${{ matrix.sdk_file }}" \
|
||||||
|
--strip-components=1 \
|
||||||
|
-C _sdk
|
||||||
;;
|
;;
|
||||||
*.tar.xz)
|
*.tar.xz)
|
||||||
tar -xJf "${{ matrix.sdk_file }}" --strip-components=1 -C _sdk
|
tar -xJf "${{ matrix.sdk_file }}" \
|
||||||
|
--strip-components=1 \
|
||||||
|
-C _sdk
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Unsupported SDK archive"
|
echo "Unsupported SDK archive: ${{ matrix.sdk_file }}"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -104,6 +135,7 @@ jobs:
|
|||||||
working-directory: _sdk
|
working-directory: _sdk
|
||||||
run: |
|
run: |
|
||||||
set -eux
|
set -eux
|
||||||
|
|
||||||
./scripts/feeds update luci
|
./scripts/feeds update luci
|
||||||
./scripts/feeds install luci-base
|
./scripts/feeds install luci-base
|
||||||
|
|
||||||
@@ -111,9 +143,11 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
set -eux
|
set -eux
|
||||||
|
|
||||||
PKG="_sdk/package/luci-app-led-scheduler"
|
PKG="_sdk/package/luci-app-led-scheduler"
|
||||||
rm -rf "$PKG"
|
|
||||||
mkdir -p "$PKG"
|
rm -rf "${PKG}"
|
||||||
|
mkdir -p "${PKG}"
|
||||||
|
|
||||||
cp -a \
|
cp -a \
|
||||||
Makefile \
|
Makefile \
|
||||||
@@ -121,7 +155,15 @@ jobs:
|
|||||||
README.md \
|
README.md \
|
||||||
htdocs \
|
htdocs \
|
||||||
root \
|
root \
|
||||||
"$PKG/"
|
"${PKG}/"
|
||||||
|
|
||||||
|
# For tag builds, package version follows the Git tag.
|
||||||
|
# Example: v0.3.1 -> PKG_VERSION:=0.3.1
|
||||||
|
sed -i \
|
||||||
|
"s/^PKG_VERSION:=.*/PKG_VERSION:=${PACKAGE_VERSION}/" \
|
||||||
|
"${PKG}/Makefile"
|
||||||
|
|
||||||
|
grep '^PKG_VERSION:=' "${PKG}/Makefile"
|
||||||
|
|
||||||
- name: Configure SDK
|
- name: Configure SDK
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -130,31 +172,228 @@ jobs:
|
|||||||
set -eux
|
set -eux
|
||||||
make defconfig
|
make defconfig
|
||||||
|
|
||||||
- name: Build
|
- name: Build package
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: _sdk
|
working-directory: _sdk
|
||||||
run: |
|
run: |
|
||||||
set -eux
|
set -eux
|
||||||
make -j"$(nproc)" package/luci-app-led-scheduler/compile V=s
|
|
||||||
|
make -j"$(nproc)" \
|
||||||
|
package/luci-app-led-scheduler/compile \
|
||||||
|
V=s
|
||||||
|
|
||||||
- name: Collect package
|
- name: Collect package
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
set -eux
|
set -eux
|
||||||
|
|
||||||
mkdir -p artifacts
|
mkdir -p artifacts
|
||||||
|
|
||||||
find _sdk/bin -type f \
|
FILE="$(find _sdk/bin -type f \
|
||||||
-name "luci-app-led-scheduler*.${{ matrix.format }}" \
|
-name "luci-app-led-scheduler*.${{ matrix.format }}" \
|
||||||
-exec cp -v {} artifacts/ \;
|
-print -quit)"
|
||||||
|
|
||||||
test -n "$(find artifacts -type f -name "luci-app-led-scheduler*.${{ matrix.format }}" -print -quit)"
|
if [ -z "${FILE}" ]; then
|
||||||
|
echo "No ${{ matrix.format }} package found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
echo "Built for OpenWrt ${{ matrix.openwrt }}:"
|
ORIGINAL_NAME="$(basename "${FILE}")"
|
||||||
|
RELEASE_NAME="openwrt-${{ matrix.openwrt }}-${ORIGINAL_NAME}"
|
||||||
|
|
||||||
|
cp -v "${FILE}" "artifacts/${RELEASE_NAME}"
|
||||||
|
|
||||||
|
echo "Built package:"
|
||||||
ls -lh artifacts/
|
ls -lh artifacts/
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload Actions artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: luci-app-led-scheduler-openwrt-${{ matrix.openwrt }}-${{ matrix.format }}
|
name: luci-app-led-scheduler-openwrt-${{ matrix.openwrt }}-${{ matrix.format }}
|
||||||
path: artifacts/*
|
path: artifacts/*
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
|
release:
|
||||||
|
# Ordinary pushes only build artifacts.
|
||||||
|
# A tag such as v0.3.1 additionally creates/updates a Gitea Release.
|
||||||
|
if: ${{ gitea.ref_type == 'tag' }}
|
||||||
|
needs:
|
||||||
|
- build
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
actions: read
|
||||||
|
releases: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download all build artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
pattern: luci-app-led-scheduler-openwrt-*
|
||||||
|
path: release-assets
|
||||||
|
merge-multiple: true
|
||||||
|
|
||||||
|
- name: Show release files
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
find release-assets -maxdepth 1 -type f -print
|
||||||
|
test -n "$(find release-assets -maxdepth 1 -type f -print -quit)"
|
||||||
|
|
||||||
|
- name: Create or update Gitea Release
|
||||||
|
id: release
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
TAG="${GITHUB_REF_NAME}"
|
||||||
|
VERSION="${TAG#v}"
|
||||||
|
API="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}"
|
||||||
|
|
||||||
|
BODY="$(cat <<EOF
|
||||||
|
luci-app-led-scheduler ${VERSION}
|
||||||
|
|
||||||
|
OpenWrt compatibility:
|
||||||
|
|
||||||
|
- OpenWrt 25.12.0: APK
|
||||||
|
- OpenWrt 24.10.8: IPK
|
||||||
|
- OpenWrt 23.05.5: IPK
|
||||||
|
- Package architecture: all
|
||||||
|
|
||||||
|
The package version is derived from Git tag \`${TAG}\`.
|
||||||
|
EOF
|
||||||
|
)"
|
||||||
|
|
||||||
|
export TAG VERSION BODY
|
||||||
|
|
||||||
|
PAYLOAD="$(python3 - <<'PY'
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
|
print(json.dumps({
|
||||||
|
"tag_name": os.environ["TAG"],
|
||||||
|
"name": f"luci-app-led-scheduler {os.environ['VERSION']}",
|
||||||
|
"body": os.environ["BODY"],
|
||||||
|
"draft": False,
|
||||||
|
"prerelease": False,
|
||||||
|
}))
|
||||||
|
PY
|
||||||
|
)"
|
||||||
|
|
||||||
|
# Make reruns of the same tag safe:
|
||||||
|
# reuse the release if it already exists, otherwise create it.
|
||||||
|
HTTP_CODE="$(curl -sS \
|
||||||
|
-o /tmp/existing-release.json \
|
||||||
|
-w '%{http_code}' \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
"${API}/releases/tags/${TAG}")"
|
||||||
|
|
||||||
|
if [ "${HTTP_CODE}" = "200" ]; then
|
||||||
|
RELEASE_ID="$(python3 - <<'PY'
|
||||||
|
import json
|
||||||
|
with open("/tmp/existing-release.json", "r", encoding="utf-8") as f:
|
||||||
|
print(json.load(f)["id"])
|
||||||
|
PY
|
||||||
|
)"
|
||||||
|
|
||||||
|
curl -fsS \
|
||||||
|
-X PATCH \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "${PAYLOAD}" \
|
||||||
|
"${API}/releases/${RELEASE_ID}" \
|
||||||
|
>/tmp/release.json
|
||||||
|
elif [ "${HTTP_CODE}" = "404" ]; then
|
||||||
|
curl -fsS \
|
||||||
|
-X POST \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "${PAYLOAD}" \
|
||||||
|
"${API}/releases" \
|
||||||
|
>/tmp/release.json
|
||||||
|
|
||||||
|
RELEASE_ID="$(python3 - <<'PY'
|
||||||
|
import json
|
||||||
|
with open("/tmp/release.json", "r", encoding="utf-8") as f:
|
||||||
|
print(json.load(f)["id"])
|
||||||
|
PY
|
||||||
|
)"
|
||||||
|
else
|
||||||
|
echo "Failed to query existing release, HTTP ${HTTP_CODE}"
|
||||||
|
cat /tmp/existing-release.json || true
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Release ID: ${RELEASE_ID}"
|
||||||
|
echo "RELEASE_ID=${RELEASE_ID}" >> "${GITHUB_ENV}"
|
||||||
|
|
||||||
|
- name: Remove duplicate release attachments
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
API="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}"
|
||||||
|
|
||||||
|
curl -fsS \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
"${API}/releases/${RELEASE_ID}/assets" \
|
||||||
|
>/tmp/assets.json
|
||||||
|
|
||||||
|
python3 - <<'PY' >/tmp/delete-assets.txt
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
wanted = {p.name for p in Path("release-assets").iterdir() if p.is_file()}
|
||||||
|
|
||||||
|
with open("/tmp/assets.json", "r", encoding="utf-8") as f:
|
||||||
|
assets = json.load(f)
|
||||||
|
|
||||||
|
for asset in assets:
|
||||||
|
if asset.get("name") in wanted:
|
||||||
|
print(asset["id"])
|
||||||
|
PY
|
||||||
|
|
||||||
|
while IFS= read -r ASSET_ID; do
|
||||||
|
[ -n "${ASSET_ID}" ] || continue
|
||||||
|
|
||||||
|
echo "Removing existing attachment ID ${ASSET_ID}"
|
||||||
|
|
||||||
|
curl -fsS \
|
||||||
|
-X DELETE \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
"${API}/releases/${RELEASE_ID}/assets/${ASSET_ID}" \
|
||||||
|
>/dev/null
|
||||||
|
done </tmp/delete-assets.txt
|
||||||
|
|
||||||
|
- name: Upload packages to Gitea Release
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
API="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}"
|
||||||
|
|
||||||
|
for FILE in release-assets/*; do
|
||||||
|
[ -f "${FILE}" ] || continue
|
||||||
|
|
||||||
|
NAME="$(basename "${FILE}")"
|
||||||
|
echo "Uploading ${NAME}"
|
||||||
|
|
||||||
|
# Multipart upload is compatible with Gitea release attachments.
|
||||||
|
curl -fsS \
|
||||||
|
-X POST \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-F "attachment=@${FILE}" \
|
||||||
|
"${API}/releases/${RELEASE_ID}/assets?name=${NAME}" \
|
||||||
|
>/dev/null
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Release assets uploaded:"
|
||||||
|
find release-assets -maxdepth 1 -type f -printf ' %f\n'
|
||||||
Reference in new issue
Block a user