|
@@ -376,77 +376,107 @@ jobs:
|
|
|
if-no-files-found: error
|
|
if-no-files-found: error
|
|
|
compression-level: 9
|
|
compression-level: 9
|
|
|
|
|
|
|
|
- stage-manager-zips:
|
|
|
|
|
|
|
+ list-manager-apks:
|
|
|
needs: resolve-sources
|
|
needs: resolve-sources
|
|
|
if: ${{ needs.resolve-sources.outputs.manager_list != '' }}
|
|
if: ${{ needs.resolve-sources.outputs.manager_list != '' }}
|
|
|
runs-on: ubuntu-latest
|
|
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:
|
|
outputs:
|
|
|
- zip_list: ${{ steps.list.outputs.zip_list }}
|
|
|
|
|
|
|
+ apk_list: ${{ steps.scan.outputs.apk_list }}
|
|
|
steps:
|
|
steps:
|
|
|
- uses: actions/checkout@v7
|
|
- 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
|
|
shell: bash
|
|
|
|
|
+ env:
|
|
|
|
|
+ MANAGER_LIST: ${{ needs.resolve-sources.outputs.manager_list }}
|
|
|
|
|
+ TOKEN: ${{ secrets.MY_GITHUB_TOKEN }}
|
|
|
run: |
|
|
run: |
|
|
|
set -euo pipefail
|
|
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:
|
|
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
|
|
runs-on: ubuntu-latest
|
|
|
strategy:
|
|
strategy:
|
|
|
fail-fast: false
|
|
fail-fast: false
|
|
|
matrix:
|
|
matrix:
|
|
|
- zip: ${{ fromJson(needs.upload-manager-artifacts.outputs.zip_list) }}
|
|
|
|
|
|
|
+ item: ${{ fromJson(needs.list-manager-apks.outputs.apk_list) }}
|
|
|
steps:
|
|
steps:
|
|
|
- uses: actions/checkout@v7
|
|
- 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:
|
|
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
|
|
uses: actions/upload-artifact@v4
|
|
|
with:
|
|
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
|
|
if-no-files-found: error
|
|
|
|
|
|
|
|
build-nomount-module:
|
|
build-nomount-module:
|
|
@@ -927,7 +957,7 @@ jobs:
|
|
|
- build-android15-6-6
|
|
- build-android15-6-6
|
|
|
- build-android16-6-12
|
|
- build-android16-6-12
|
|
|
- build-nomount-module
|
|
- build-nomount-module
|
|
|
- - upload-manager-artifacts
|
|
|
|
|
|
|
+ - publish-manager-artifacts
|
|
|
|
|
|
|
|
env:
|
|
env:
|
|
|
GH_TOKEN: ${{ github.token }}
|
|
GH_TOKEN: ${{ github.token }}
|