Browse Source

ci: make each manager APK its own zip

TheWildJames 2 weeks ago
parent
commit
2811c83661
1 changed files with 49 additions and 35 deletions
  1. 49 35
      .github/workflows/main.yml

+ 49 - 35
.github/workflows/main.yml

@@ -335,51 +335,65 @@ jobs:
               OWNER=$(echo "$M" | jq -r .owner)
               REPO=$(echo "$M" | jq -r .repo)
               SRC=$(echo "$M" | jq -r .source)
-              mkdir -p "release-assets/manager/$REPO"
-              cd "release-assets/manager/$REPO"
-              # Keep each manager artifact as its own zip, named after the manager it
-              # represents (e.g. KernelSU-Next_manager.zip, ReSukiSU_<artifact>.zip).
-              if [ "$SRC" = "release" ]; then
-                echo "Downloading all $REPO manager APKs from latest release"
-                curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors \
-                  "https://api.github.com/repos/${OWNER}/${REPO}/releases/latest" \
-                  > /tmp/manager-rel.json
-                for URL in $(jq -r '.assets[] | select(.name | endswith(".apk")) | .browser_download_url' /tmp/manager-rel.json); do
-                  NAME="${URL##*/}"
-                  curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors -o "${NAME}" "$URL"
-                done
-              else
-                RUN_ID=$(echo "$M" | jq -r .run_id)
-                echo "Downloading $REPO manager from run $RUN_ID"
-                ARTIFACTS_JSON=$(curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors \
-                  -H "Authorization: Bearer ${{ secrets.MY_GITHUB_TOKEN }}" \
-                  "https://api.github.com/repos/${OWNER}/${REPO}/actions/runs/${RUN_ID}/artifacts")
-                # Include either the `want` name-list or every artifact. Preserve each artifact
-                # zip under its own name rather than unzipping them.
-                WANT="$(echo "$M" | jq -r '.want | if . then join(",") else "" end')"
-                if [ -z "$WANT" ]; then
-                  echo "$ARTIFACTS_JSON" | jq -r '.artifacts[] | (.id|tostring) + " " + (.name|gsub(" "; "_"))' \
-                  | while read -r AID ART_NAME; do
-                    curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors \
-                      -H "Authorization: Bearer ${{ secrets.MY_GITHUB_TOKEN }}" \
-                      -o "${REPO}_${ART_NAME}.zip" \
-                      "https://api.github.com/repos/${OWNER}/${REPO}/actions/artifacts/${AID}/zip"
+              dldir="release-assets/manager/_download"
+              outdir="release-assets/manager/$REPO"
+              mkdir -p "$dldir" "$outdir"
+              (
+                cd "$dldir"
+                if [ "$SRC" = "release" ]; then
+                  echo "Downloading all $REPO manager APKs from latest release"
+                  curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors \
+                    "https://api.github.com/repos/${OWNER}/${REPO}/releases/latest" \
+                    > /tmp/manager-rel.json
+                  OUT_ABS="${GITHUB_WORKSPACE:-$PWD}/release-assets/manager/$REPO"
+                  for URL in $(jq -r '.assets[] | select(.name | endswith(".apk")) | .browser_download_url' /tmp/manager-rel.json); do
+                    NAME="${URL##*/}"
+                    curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors -o "${NAME}" "$URL"
+                    # Each APK becomes its own zip, named after that APK (prefixed with the manager).
+                    base="${NAME%.apk}"
+                    ( zip -qr "${OUT_ABS}/${REPO}_${base}.zip" "${NAME}" )
                   done
                 else
-                  echo "$ARTIFACTS_JSON" | jq -r --arg want "$WANT" '
-                    ($want | split(",")) as $wl |
-                    .artifacts[] | select(.name as $n | any($wl[]; $n == .)) | (.id|tostring) + " " + (.name|gsub(" "; "_"))' \
-                  | while read -r AID ART_NAME; do
+                  RUN_ID=$(echo "$M" | jq -r .run_id)
+                  echo "Downloading $REPO manager from run $RUN_ID"
+                  ARTIFACTS_JSON=$(curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors \
+                    -H "Authorization: Bearer ${{ secrets.MY_GITHUB_TOKEN }}" \
+                    "https://api.github.com/repos/${OWNER}/${REPO}/actions/runs/${RUN_ID}/artifacts")
+                  WANT="$(echo "$M" | jq -r '.want | if . then join(",") else "" end')"
+                  if [ -z "$WANT" ]; then
+                    ARTIFACT_IDS=$(echo "$ARTIFACTS_JSON" | jq -r '.artifacts[].id')
+                  else
+                    ARTIFACT_IDS=$(echo "$ARTIFACTS_JSON" | jq -r --arg want "$WANT" '
+                      ($want | split(",")) as $wl |
+                      .artifacts[] | select(.name as $n | any($wl[]; $n == .)) | .id')
+                  fi
+                  echo "$ARTIFACT_IDS" | while read -r AID; do
+                    [ -n "$AID" ] || continue
+                    ART=$(echo "$ARTIFACTS_JSON" | jq -r --arg id "$AID" '.artifacts[] | select(.id == ($id|tonumber)) | .name | gsub(" "; "_")')
                     curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors \
                       -H "Authorization: Bearer ${{ secrets.MY_GITHUB_TOKEN }}" \
-                      -o "${REPO}_${ART_NAME}.zip" \
+                      -o "_${AID}.zip" \
                       "https://api.github.com/repos/${OWNER}/${REPO}/actions/artifacts/${AID}/zip"
+                    mkdir -p "_${AID}"
+                    unzip -o -q "_${AID}.zip" -d "_${AID}" || true
+                    rm -f "_${AID}.zip"
+                    # Each APK becomes its own zip, named after that APK (prefixed with the manager).
+                    OUT_ABS="${GITHUB_WORKSPACE:-$PWD}/release-assets/manager/$REPO"
+                    for apk in _${AID}/*.apk; do
+                      [ -f "$apk" ] || continue
+                      base="${apk##*/}"
+                      ( cd "_${AID}" && zip -qr "${OUT_ABS}/${REPO}_${base%.apk}.zip" "${base}" )
+                    done
+                    rm -rf "_${AID}"
                   done
                 fi
-              fi
+              )
               cd "${GITHUB_WORKSPACE:-$HOME}"
               find "release-assets/manager/$REPO" -type f -iname '*.zip' -print
             done
+          rm -rf release-assets/manager/_download
+          echo "--- final manager zips ---"
+          find release-assets/manager -type f -iname '*.zip' -print
           ls -la release-assets/manager
 
       - name: Upload manager APK as artifact