From 4832838a0d81dfa485c8b27e9c87d73bd89aadf3 Mon Sep 17 00:00:00 2001 From: luochen570 <1160510664@qq.com> Date: Sat, 30 May 2026 14:11:23 +0800 Subject: [PATCH] ci: upload build outputs to repository release --- .../workflows/build-windows-cross-linux.yml | 91 +++++++++++++++---- 1 file changed, 74 insertions(+), 17 deletions(-) diff --git a/.gitea/workflows/build-windows-cross-linux.yml b/.gitea/workflows/build-windows-cross-linux.yml index d58f67f..025ce13 100644 --- a/.gitea/workflows/build-windows-cross-linux.yml +++ b/.gitea/workflows/build-windows-cross-linux.yml @@ -43,6 +43,7 @@ jobs: ninja-build \ p7zip \ p7zip-plugins \ + python3 \ mingw64-gcc-c++ \ mingw64-qt6-qtbase \ mingw64-opencv @@ -128,35 +129,91 @@ jobs: dist-windows-cross/chengnan-windows-x86_64-cross.zip.sha256 if-no-files-found: error - - name: Upload package to Gitea Packages + - name: Upload package to repository release if: ${{ github.event_name != 'pull_request' }} env: - PACKAGE_TOKEN: ${{ secrets.PACKAGE_TOKEN }} + RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }} run: | set -euo pipefail PACKAGE_NAME="chengnan-windows-x86_64-cross" - VERSION="${GITHUB_SHA:-manual}" - VERSION="${VERSION:0:10}" - OWNER="${GITHUB_REPOSITORY%%/*}" - API_BASE="${GITHUB_SERVER_URL:-https://git.luochen570.cn}/api/packages/${OWNER}/generic/chengnan/${VERSION}" - TOKEN="${PACKAGE_TOKEN:-${GITHUB_TOKEN:-}}" + SERVER_URL="${GITHUB_SERVER_URL:-https://git.luochen570.cn}" + REPOSITORY="${GITHUB_REPOSITORY}" + API_BASE="${SERVER_URL}/api/v1/repos/${REPOSITORY}" + TOKEN="${RELEASE_TOKEN:-${GITHUB_TOKEN:-}}" test -n "$TOKEN" - upload_file() { + + if [ "${GITHUB_REF_TYPE:-}" = "tag" ]; then + TAG_NAME="${GITHUB_REF_NAME}" + RELEASE_NAME="${GITHUB_REF_NAME}" + PRERELEASE=false + else + TAG_NAME="build-${GITHUB_SHA:0:10}" + RELEASE_NAME="chengnan ${GITHUB_SHA:0:10}" + PRERELEASE=true + fi + + json_escape() { + python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))' + } + + release_payload="$(printf '{"tag_name":%s,"target_commitish":%s,"name":%s,"body":%s,"draft":false,"prerelease":%s}' \ + "$(printf '%s' "$TAG_NAME" | json_escape)" \ + "$(printf '%s' "${GITHUB_SHA}" | json_escape)" \ + "$(printf '%s' "$RELEASE_NAME" | json_escape)" \ + "$(printf 'Automated Windows x86_64 cross build from Gitea Actions.\n' | json_escape)" \ + "$PRERELEASE")" + + status="$(curl --show-error --silent --location \ + --header "Authorization: token ${TOKEN}" \ + --header 'Content-Type: application/json' \ + --data "$release_payload" \ + --write-out '%{http_code}' \ + --output /tmp/gitea-release-response.json \ + "${API_BASE}/releases")" + + if [ "$status" = "409" ] || [ "$status" = "422" ]; then + RELEASE_ID="$(curl --show-error --silent --location \ + --header "Authorization: token ${TOKEN}" \ + "${API_BASE}/releases/tags/${TAG_NAME}" \ + | python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')" + elif [ "$status" = "201" ] || [ "$status" = "200" ]; then + RELEASE_ID="$(python3 -c 'import json,sys; print(json.load(open("/tmp/gitea-release-response.json"))["id"])')" + else + echo "Create release failed with HTTP ${status}" >&2 + cat /tmp/gitea-release-response.json >&2 + exit 1 + fi + + upload_asset() { local src="$1" - local url="$2" + local name + local existing_id local status + name="$(basename "$src")" + existing_id="$(curl --show-error --silent --location \ + --header "Authorization: token ${TOKEN}" \ + "${API_BASE}/releases/${RELEASE_ID}/assets" \ + | ASSET_NAME="$name" python3 -c 'import json,os,sys; assets=json.load(sys.stdin); print(next((str(a["id"]) for a in assets if a.get("name")==os.environ["ASSET_NAME"]), ""))')" + if [ -n "$existing_id" ]; then + curl --show-error --silent --location \ + --request DELETE \ + --header "Authorization: token ${TOKEN}" \ + --output /tmp/gitea-release-asset-delete-response.json \ + "${API_BASE}/releases/${RELEASE_ID}/assets/${existing_id}" + fi status="$(curl --show-error --silent --location \ --header "Authorization: token ${TOKEN}" \ - --upload-file "$src" \ + --form "attachment=@${src};filename=${name}" \ --write-out '%{http_code}' \ - --output /tmp/gitea-upload-response.txt \ - "$url")" + --output /tmp/gitea-release-asset-response.json \ + "${API_BASE}/releases/${RELEASE_ID}/assets?name=${name}")" if [ "$status" != "201" ] && [ "$status" != "200" ]; then - echo "Upload failed with HTTP ${status}: ${url}" >&2 - cat /tmp/gitea-upload-response.txt >&2 + echo "Upload release asset failed with HTTP ${status}: ${name}" >&2 + cat /tmp/gitea-release-asset-response.json >&2 exit 1 fi } - upload_file "dist-windows-cross/${PACKAGE_NAME}.zip" "${API_BASE}/${PACKAGE_NAME}.zip" - upload_file "dist-windows-cross/${PACKAGE_NAME}.zip.sha256" "${API_BASE}/${PACKAGE_NAME}.zip.sha256" - echo "Package uploaded to: ${API_BASE}/" + + upload_asset "dist-windows-cross/${PACKAGE_NAME}.zip" + upload_asset "dist-windows-cross/${PACKAGE_NAME}.zip.sha256" + echo "Release assets uploaded to ${SERVER_URL}/${REPOSITORY}/releases/tag/${TAG_NAME}"