Przeglądaj źródła

ci: per-APK manager artifacts without transport blobs

TheWildJames 3 tygodni temu
rodzic
commit
9e25e7e0f7
1 zmienionych plików z 82 dodań i 52 usunięć
  1. 82 52
      .github/workflows/main.yml

+ 82 - 52
.github/workflows/main.yml

@@ -376,77 +376,107 @@ jobs:
           if-no-files-found: error
           compression-level: 9
 
-  stage-manager-zips:
+  list-manager-apks:
     needs: resolve-sources
     if: ${{ needs.resolve-sources.outputs.manager_list != '' }}
     runs-on: ubuntu-latest
-    strategy:
-      fail-fast: false
-      matrix:
-        manager: ${{ fromJson(needs.resolve-sources.outputs.manager_list) }}
-    steps:
-      - uses: actions/checkout@v7
-      - name: Fetch manager APKs for ${{ matrix.manager.repo }}
-        uses: ./.github/actions/fetch-root-managers
-        with:
-          owner: ${{ matrix.manager.owner }}
-          repo: ${{ matrix.manager.repo }}
-          source: ${{ matrix.manager.source }}
-          run_id: ${{ matrix.manager.run_id }}
-          want: ${{ matrix.manager.want }}
-          token: ${{ secrets.MY_GITHUB_TOKEN }}
-          output_dir: ${{ github.workspace }}/manager-zips/${{ matrix.manager.repo }}
-      - name: Upload staged manager zips for ${{ matrix.manager.repo }}
-        uses: actions/upload-artifact@v4
-        with:
-          name: manager-zip-${{ matrix.manager.repo }}
-          path: manager-zips/${{ matrix.manager.repo }}/
-          if-no-files-found: error
-
-  upload-manager-artifacts:
-    needs: stage-manager-zips
-    if: ${{ always() && needs.stage-manager-zips.result == 'success' }}
-    runs-on: ubuntu-latest
     outputs:
-      zip_list: ${{ steps.list.outputs.zip_list }}
+      apk_list: ${{ steps.scan.outputs.apk_list }}
     steps:
       - uses: actions/checkout@v7
-      - name: Download all staged manager zips
-        uses: actions/download-artifact@v7
-        with:
-          path: manager-zips
-          pattern: 'manager-zip-*'
-          merge-multiple: true
-      - name: List all manager APK files
-        id: list
+
+      - name: Download and scan all manager APKs
+        id: scan
         shell: bash
+        env:
+          MANAGER_LIST: ${{ needs.resolve-sources.outputs.manager_list }}
+          TOKEN: ${{ secrets.MY_GITHUB_TOKEN }}
         run: |
           set -euo pipefail
-          APKS="$(find manager-zips -type f -iname '*.apk' -printf '%f\n' \
-            | jq -R -s -c 'split("\n") | map(select(. != ""))')"
-          echo "zip_list=${APKS}" >> "$GITHUB_OUTPUT"
+          APK_JSON="[]"
+          echo "$MANAGER_LIST" | jq -c '.[]' | while read -r M; do
+            OWNER=$(echo "$M" | jq -r .owner)
+            REPO=$(echo "$M" | jq -r .repo)
+            SRC=$(echo "$M" | jq -r .source)
+            RUN_ID=$(echo "$M" | jq -r .run_id)
+            WANT=$(echo "$M" | jq -r '.want // ""')
+            DLDIR="dl_${REPO}"
+            mkdir -p "$DLDIR"
+            (
+              cd "$DLDIR"
+              if [ "$SRC" = "release" ]; then
+                curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors \
+                  "https://api.github.com/repos/${OWNER}/${REPO}/releases/latest" > rel.json
+                for URL in $(jq -r '.assets[] | select(.name | endswith(".apk")) | .browser_download_url' rel.json); do
+                  NAME="${URL##*/}"
+                  curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors -o "$NAME" "$URL"
+                  APK_JSON=$(echo "$APK_JSON" | jq -c --arg o "$OWNER" --arg r "$REPO" --arg n "$NAME" \
+                    '. + [{owner:$o,repo:$r,source:"release",run_id:"",want:"",apk:$n}]')
+                  echo "$APK_JSON" > /tmp/apk_json_tmp
+                done
+              else
+                AJSON=$(curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors \
+                  -H "Authorization: Bearer $TOKEN" \
+                  "https://api.github.com/repos/${OWNER}/${REPO}/actions/runs/${RUN_ID}/artifacts")
+                if [ -z "$WANT" ]; then
+                  ART_IDS=$(echo "$AJSON" | jq -r '.artifacts[].id')
+                else
+                  ART_IDS=$(echo "$AJSON" | jq -r --arg want "$WANT" '
+                    ($want | split(",")) as $wl |
+                    .artifacts[] | select(.name as $n | any($wl[]; $n == .)) | .id')
+                fi
+                echo "$ART_IDS" | while read -r AID; do
+                  [ -n "$AID" ] || continue
+                  curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors \
+                    -H "Authorization: Bearer $TOKEN" \
+                    -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"
+                  for apk in _${AID}/*.apk; do
+                    [ -f "$apk" ] || continue
+                    NAME="$(basename "$apk")"
+                    APK_JSON=$(echo "$APK_JSON" | jq -c --arg o "$OWNER" --arg r "$REPO" --arg i "$RUN_ID" --arg w "$WANT" --arg n "$NAME" \
+                      '. + [{owner:$o,repo:$r,source:"run",run_id:$i,want:$w,apk:$n}]')
+                    echo "$APK_JSON" > /tmp/apk_json_tmp
+                  done
+                  rm -rf "_${AID}"
+                done
+              fi
+            )
+            # re-read the inner-subshell-updated apk list
+            [ -f /tmp/apk_json_tmp ] && APK_JSON="$(cat /tmp/apk_json_tmp)"
+          done
+          echo "apk_list=${APK_JSON}" >> "$GITHUB_OUTPUT"
 
   publish-manager-artifacts:
-    needs: upload-manager-artifacts
-    if: ${{ needs.upload-manager-artifacts.result == 'success' }}
+    needs: list-manager-apks
+    if: ${{ needs.list-manager-apks.outputs.apk_list != '' }}
     runs-on: ubuntu-latest
     strategy:
       fail-fast: false
       matrix:
-        zip: ${{ fromJson(needs.upload-manager-artifacts.outputs.zip_list) }}
+        item: ${{ fromJson(needs.list-manager-apks.outputs.apk_list) }}
     steps:
       - uses: actions/checkout@v7
-      - name: Download manager-zips bundle
-        uses: actions/download-artifact@v7
+
+      - name: Fetch and extract ${{ matrix.item.apk }}
+        uses: ./.github/actions/fetch-root-managers
         with:
-          path: manager-zips
-          pattern: 'manager-zip-*'
-          merge-multiple: true
-      - name: Upload ${{ matrix.zip }} as its own artifact
+          owner: ${{ matrix.item.owner }}
+          repo: ${{ matrix.item.repo }}
+          source: ${{ matrix.item.source }}
+          run_id: ${{ matrix.item.run_id }}
+          want: ${{ matrix.item.want }}
+          token: ${{ secrets.MY_GITHUB_TOKEN }}
+          output_dir: ${{ github.workspace }}/mgr-apk
+
+      - name: Upload ${{ matrix.item.apk }} as its own artifact
         uses: actions/upload-artifact@v4
         with:
-          name: manager-apk-${{ matrix.zip }}
-          path: manager-zips/${{ matrix.zip }}
+          name: manager-apk-${{ matrix.item.repo }}-${{ matrix.item.apk }}
+          path: mgr-apk/${{ matrix.item.apk }}
           if-no-files-found: error
 
   build-nomount-module:
@@ -927,7 +957,7 @@ jobs:
     - build-android15-6-6
     - build-android16-6-12
     - build-nomount-module
-    - upload-manager-artifacts
+    - publish-manager-artifacts
 
     env:
       GH_TOKEN: ${{ github.token }}