main.yml 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. name: Build Kernels
  2. permissions:
  3. contents: write
  4. actions: write
  5. on:
  6. workflow_dispatch:
  7. inputs:
  8. release_type:
  9. description: "Choose Release Type"
  10. required: true
  11. type: choice
  12. options:
  13. - Actions
  14. - Pre-Release
  15. - Release
  16. default: Actions
  17. lto:
  18. description: "Choose LTO build"
  19. required: true
  20. type: choice
  21. options:
  22. - default
  23. - thin
  24. - full
  25. default: default
  26. commit_mode:
  27. description: "latest = branch tips, verified = audited pins, update = build latest then promote verified pins on success"
  28. required: false
  29. type: choice
  30. options:
  31. - latest
  32. - verified
  33. - update
  34. default: verified
  35. root_flavor:
  36. description: "Root Flavor"
  37. type: choice
  38. options:
  39. - none
  40. - KernelSU-Next
  41. - KernelSU
  42. - ReSukiSU
  43. - All
  44. default: All
  45. device:
  46. description: "Branch - All or comma list e.g. SM-S938B-Oneui8.5,SM-S928B-Oneui8 - branches: https://github.com/WildKernels/Samsung_Kernels/branches"
  47. required: false
  48. type: string
  49. default: All
  50. susfs:
  51. description: "SUSFS"
  52. required: false
  53. type: boolean
  54. default: true
  55. zeromount:
  56. description: "Zeromount"
  57. required: false
  58. type: boolean
  59. default: false
  60. nomount:
  61. description: "NoMount"
  62. required: false
  63. type: boolean
  64. default: true
  65. bbg:
  66. description: "BBG"
  67. required: false
  68. type: boolean
  69. default: true
  70. unicodefix:
  71. description: "Unicode fix"
  72. required: false
  73. type: boolean
  74. default: true
  75. droidspace:
  76. description: "Droidspaces"
  77. required: false
  78. type: boolean
  79. default: true
  80. ntsync:
  81. description: "NTsync"
  82. required: false
  83. type: boolean
  84. default: true
  85. bbrv3:
  86. description: "bbrv3"
  87. required: false
  88. type: boolean
  89. default: true
  90. ipv6_nat:
  91. description: "IPv6_NAT & IP-SET"
  92. required: false
  93. default: true
  94. type: boolean
  95. optimization:
  96. description: "optimization patches"
  97. required: false
  98. default: true
  99. type: boolean
  100. ttl:
  101. description: "TTL support"
  102. required: false
  103. default: true
  104. type: boolean
  105. cache:
  106. description: "CCache"
  107. required: false
  108. default: true
  109. type: boolean
  110. kpm:
  111. description: "kpm"
  112. required: false
  113. default: true
  114. type: boolean
  115. jobs:
  116. resolve-sources:
  117. runs-on: ubuntu-latest
  118. outputs:
  119. nomount_commit: ${{ steps.resolve.outputs.nomount_commit }}
  120. kernelsu_commit: ${{ steps.resolve.outputs.kernelsu_commit }}
  121. kernelsu_branch: ${{ steps.resolve.outputs.kernelsu_branch }}
  122. root_flavor: ${{ steps.resolve.outputs.root_flavor }}
  123. root_commit: ${{ steps.resolve.outputs.root_commit }}
  124. root_matrix: ${{ steps.resolve.outputs.root_matrix }}
  125. susfs_commit_android12_5_10: ${{ steps.resolve.outputs.susfs_commit_android12_5_10 }}
  126. susfs_commit_android13_5_10: ${{ steps.resolve.outputs.susfs_commit_android13_5_10 }}
  127. susfs_commit_android13_5_15: ${{ steps.resolve.outputs.susfs_commit_android13_5_15 }}
  128. susfs_commit_android14_5_15: ${{ steps.resolve.outputs.susfs_commit_android14_5_15 }}
  129. susfs_commit_android14_6_1: ${{ steps.resolve.outputs.susfs_commit_android14_6_1 }}
  130. susfs_commit_android15_6_6: ${{ steps.resolve.outputs.susfs_commit_android15_6_6 }}
  131. susfs_commit_android16_6_12: ${{ steps.resolve.outputs.susfs_commit_android16_6_12 }}
  132. susfs_commit_android12_5_10_resukisu: ${{ steps.resolve.outputs.susfs_commit_android12_5_10_resukisu }}
  133. susfs_commit_android13_5_10_resukisu: ${{ steps.resolve.outputs.susfs_commit_android13_5_10_resukisu }}
  134. susfs_commit_android13_5_15_resukisu: ${{ steps.resolve.outputs.susfs_commit_android13_5_15_resukisu }}
  135. susfs_commit_android14_5_15_resukisu: ${{ steps.resolve.outputs.susfs_commit_android14_5_15_resukisu }}
  136. susfs_commit_android14_6_1_resukisu: ${{ steps.resolve.outputs.susfs_commit_android14_6_1_resukisu }}
  137. susfs_commit_android15_6_6_resukisu: ${{ steps.resolve.outputs.susfs_commit_android15_6_6_resukisu }}
  138. susfs_commit_android16_6_12_resukisu: ${{ steps.resolve.outputs.susfs_commit_android16_6_12_resukisu }}
  139. ksu_commit: ${{ steps.resolve.outputs.ksu_commit }}
  140. resukisu_commit: ${{ steps.resolve.outputs.resukisu_commit }}
  141. steps:
  142. - name: Resolve pinned component commits
  143. id: resolve
  144. shell: bash
  145. run: |
  146. set -euo pipefail
  147. COMMIT_MODE="${{ inputs.commit_mode }}"
  148. echo "commit_mode=${COMMIT_MODE}"
  149. retry() {
  150. local n=0
  151. until [ "$n" -ge 5 ]; do
  152. "$@" && return 0
  153. n=$((n+1))
  154. echo "retry $n/5 failed for: $*" >&2
  155. sleep 5
  156. done
  157. return 1
  158. }
  159. resolve_sha() { retry git ls-remote "$1" "$2" | awk '{print $1; exit}'; }
  160. emit() {
  161. if [ -z "$2" ] || ! [[ "$2" =~ ^[0-9a-f]{40}$ ]]; then
  162. echo "Failed to resolve $1 (got: ${2:-empty})" >&2
  163. exit 1
  164. fi
  165. echo "$1=$2" >> "$GITHUB_OUTPUT"
  166. }
  167. # Audited pins - kept in sync with GKI_KernelSU_SUSFS dev
  168. PIN_NOMOUNT="9a1431782f390453de54610fb91bdad03eab5b43"
  169. PIN_KERNELSU="e38512f1255ea454d34cc2008d2ef7932547fad6"
  170. PIN_RESUKISU="0b5efe9e0102c43ca5c41174d500f5a7080cd0c7"
  171. declare -A PIN_SUSFS=(
  172. [susfs_commit_android12_5_10]="ec785f47d49f7b3871ca9356f450411020af7017"
  173. [susfs_commit_android13_5_10]="ed3d6d9c9a2652e1c70f153f5358701e996d646c"
  174. [susfs_commit_android13_5_15]="bca0d2333c1a7d717e7278b019d7af7ba1d16005"
  175. [susfs_commit_android14_5_15]="d54b51724afa912c4c99bb99731354ce934d1889"
  176. [susfs_commit_android14_6_1]="4fc9c1898ea66f51847cdbc0d1473ea4ef525a70"
  177. [susfs_commit_android15_6_6]="937215cb3a1b1f333d764c366c7a49972fa8e7a0"
  178. [susfs_commit_android16_6_12]="7d91da2d2ce056d1abf378d9199aaf1072d37ab0"
  179. )
  180. declare -A PIN_SUSFS_RESUKISU=(
  181. [susfs_commit_android12_5_10]="ec785f47d49f7b3871ca9356f450411020af7017"
  182. [susfs_commit_android13_5_10]="ed3d6d9c9a2652e1c70f153f5358701e996d646c"
  183. [susfs_commit_android13_5_15]="bca0d2333c1a7d717e7278b019d7af7ba1d16005"
  184. [susfs_commit_android14_5_15]="d54b51724afa912c4c99bb99731354ce934d1889"
  185. [susfs_commit_android14_6_1]="4fc9c1898ea66f51847cdbc0d1473ea4ef525a70"
  186. [susfs_commit_android15_6_6]="937215cb3a1b1f333d764c366c7a49972fa8e7a0"
  187. [susfs_commit_android16_6_12]="7d91da2d2ce056d1abf378d9199aaf1072d37ab0"
  188. )
  189. pick() {
  190. local pinned="$1" repo="$2" ref="$3"
  191. if [ "$COMMIT_MODE" = "verified" ] && [ -n "$pinned" ]; then
  192. echo "$pinned"
  193. else
  194. resolve_sha "$repo" "$ref"
  195. fi
  196. }
  197. emit nomount_commit "$(pick "$PIN_NOMOUNT" https://github.com/maxsteeel/nomount.git refs/heads/dev)"
  198. emit kernelsu_commit "$(resolve_sha https://github.com/KernelSU-Next/KernelSU-Next.git refs/heads/dev)"
  199. echo "kernelsu_branch=dev" >> "$GITHUB_OUTPUT"
  200. KERNELSU_COMMIT="$(pick "$PIN_KERNELSU" https://github.com/tiann/KernelSU.git refs/heads/main)"
  201. RESUKISU_COMMIT="$(pick "$PIN_RESUKISU" https://github.com/ReSukiSU/ReSukiSU.git refs/heads/main)"
  202. emit ksu_commit "$KERNELSU_COMMIT"
  203. emit resukisu_commit "$RESUKISU_COMMIT"
  204. if [ "${{ inputs.susfs }}" = "true" ]; then
  205. NEXT_COMMIT="$(resolve_sha https://github.com/pershoot/KernelSU-Next.git refs/heads/dev-susfs)"
  206. else
  207. NEXT_COMMIT="$(resolve_sha https://github.com/KernelSU-Next/KernelSU-Next.git refs/heads/dev)"
  208. fi
  209. mk_entry() { printf '{"root_flavor":"%s","variant":"%s","root_commit":"%s"}' "$1" "$2" "$3"; }
  210. case "${{ inputs.root_flavor }}" in
  211. KernelSU)
  212. echo "root_flavor=kernelsu" >> "$GITHUB_OUTPUT"
  213. emit root_commit "$KERNELSU_COMMIT"
  214. ROOT_MATRIX="[$(mk_entry kernelsu KernelSU "$KERNELSU_COMMIT")]"
  215. ;;
  216. KernelSU-Next)
  217. echo "root_flavor=next" >> "$GITHUB_OUTPUT"
  218. emit root_commit "$NEXT_COMMIT"
  219. ROOT_MATRIX="[$(mk_entry next KernelSU-Next "$NEXT_COMMIT")]"
  220. ;;
  221. ReSukiSU)
  222. echo "root_flavor=resukisu" >> "$GITHUB_OUTPUT"
  223. emit root_commit "$RESUKISU_COMMIT"
  224. ROOT_MATRIX="[$(mk_entry resukisu ReSukiSU "$RESUKISU_COMMIT")]"
  225. ;;
  226. All)
  227. ROOT_MATRIX="[$(mk_entry next KernelSU-Next "$NEXT_COMMIT"),$(mk_entry kernelsu KernelSU "$KERNELSU_COMMIT"),$(mk_entry resukisu ReSukiSU "$RESUKISU_COMMIT")]"
  228. echo "root_flavor=" >> "$GITHUB_OUTPUT"
  229. echo "root_commit=" >> "$GITHUB_OUTPUT"
  230. ;;
  231. *) echo "ERROR: unknown root_flavor '${{ inputs.root_flavor }}'" >&2; exit 1 ;;
  232. esac
  233. echo "root_matrix=$ROOT_MATRIX" >> "$GITHUB_OUTPUT"
  234. declare -A SUSFS_BRANCHES=(
  235. [susfs_commit_android12_5_10]="gki-android12-5.10"
  236. [susfs_commit_android13_5_10]="gki-android13-5.10"
  237. [susfs_commit_android13_5_15]="gki-android13-5.15"
  238. [susfs_commit_android14_5_15]="gki-android14-5.15"
  239. [susfs_commit_android14_6_1]="gki-android14-6.1"
  240. [susfs_commit_android15_6_6]="gki-android15-6.6"
  241. [susfs_commit_android16_6_12]="gki-android16-6.12"
  242. )
  243. for key in "${!SUSFS_BRANCHES[@]}"; do
  244. emit "$key" "$(pick "${PIN_SUSFS[$key]}" https://gitlab.com/simonpunk/susfs4ksu.git refs/heads/${SUSFS_BRANCHES[$key]})"
  245. emit "${key}_resukisu" "$(pick "${PIN_SUSFS_RESUKISU[$key]}" https://gitlab.com/simonpunk/susfs4ksu.git refs/heads/${SUSFS_BRANCHES[$key]})"
  246. done
  247. echo "Resolved:"
  248. env | grep -E '^(nomount_commit|kernelsu_commit|root_commit|susfs_commit_)' | sort || true
  249. build-samsung:
  250. needs: resolve-sources
  251. strategy:
  252. fail-fast: false
  253. matrix:
  254. include: ${{ fromJSON(needs.resolve-sources.outputs.root_matrix) }}
  255. uses: ./.github/workflows/kernel-samsung.yml
  256. secrets: inherit
  257. with:
  258. device: ${{ inputs.device }}
  259. root_flavor: ${{ matrix.root_flavor }}
  260. root_commit: ${{ matrix.root_commit }}
  261. variant: ${{ matrix.variant }}
  262. susfs_commit: ${{ matrix.root_flavor == 'resukisu' && needs.resolve-sources.outputs.susfs_commit_android14_6_1_resukisu || needs.resolve-sources.outputs.susfs_commit_android14_6_1 }}
  263. susfs_commit_android12_5_10: ${{ needs.resolve-sources.outputs.susfs_commit_android12_5_10 }}
  264. susfs_commit_android13_5_10: ${{ needs.resolve-sources.outputs.susfs_commit_android13_5_10 }}
  265. susfs_commit_android13_5_15: ${{ needs.resolve-sources.outputs.susfs_commit_android13_5_15 }}
  266. susfs_commit_android14_5_15: ${{ needs.resolve-sources.outputs.susfs_commit_android14_5_15 }}
  267. susfs_commit_android14_6_1: ${{ needs.resolve-sources.outputs.susfs_commit_android14_6_1 }}
  268. susfs_commit_android15_6_6: ${{ needs.resolve-sources.outputs.susfs_commit_android15_6_6 }}
  269. susfs_commit_android16_6_12: ${{ needs.resolve-sources.outputs.susfs_commit_android16_6_12 }}
  270. nomount_commit: ${{ needs.resolve-sources.outputs.nomount_commit }}
  271. susfs: ${{ inputs.susfs }}
  272. bbg: ${{ inputs.bbg }}
  273. unicodefix: ${{ inputs.unicodefix }}
  274. zeromount: ${{ inputs.zeromount }}
  275. nomount: ${{ inputs.nomount }}
  276. droidspace: ${{ inputs.droidspace }}
  277. ntsync: ${{ inputs.ntsync }}
  278. bbrv3: ${{ inputs.bbrv3 }}
  279. ipv6_nat: ${{ inputs.ipv6_nat }}
  280. optimization: ${{ inputs.optimization }}
  281. ttl: ${{ inputs.ttl }}
  282. cache: ${{ inputs.cache }}
  283. lto: ${{ inputs.lto }}
  284. kpm: ${{ inputs.kpm }}
  285. release:
  286. runs-on: ubuntu-latest
  287. if: inputs.release_type != 'Actions'
  288. needs:
  289. - build-samsung
  290. - resolve-sources
  291. env:
  292. GH_TOKEN: ${{ github.token }}
  293. RELEASE_NAME: "Samsung Kernels With SUSFS v2.3.0"
  294. RELEASE_BODY: ""
  295. steps:
  296. - name: Free Disk Space
  297. if: true
  298. uses: endersonmenezes/free-disk-space@v3
  299. with:
  300. remove_android: true
  301. remove_dotnet: true
  302. remove_haskell: true
  303. remove_tool_cache: true
  304. remove_swap: true
  305. remove_packages: "azure-cli google-cloud-cli microsoft-edge-stable google-chrome-stable firefox postgresql* temurin-* *llvm* mysql* dotnet-sdk-*"
  306. remove_packages_one_command: true
  307. remove_folders: "/usr/share/swift /usr/share/miniconda /usr/share/az* /usr/local/lib/node_modules /usr/local/share/chromium /usr/local/share/powershell /usr/local/julia /usr/local/aws-cli /usr/local/aws-sam-cli /usr/share/gradle"
  308. rm_cmd: "rmz"
  309. rmz_version: "3.1.1"
  310. testing: false
  311. - name: Checkout code
  312. uses: actions/checkout@v7
  313. - name: Generate New Tag
  314. if: inputs.release_type != 'Actions'
  315. run: |
  316. LATEST_TAG=$(gh api repos/${{ github.repository }}/tags --jq '.[0].name' 2>/dev/null || echo "")
  317. if [ -z "$LATEST_TAG" ]; then
  318. LATEST_TAG="v2.3.0-r0"
  319. fi
  320. NEW_TAG=$(echo "$LATEST_TAG" | awk -F'-r' '{suffix=$2; if (!suffix) suffix=0; suffix++; printf "%s-r%d", $1, suffix}')
  321. echo "New tag: $NEW_TAG"
  322. echo "NEW_TAG=${NEW_TAG}" >> $GITHUB_ENV
  323. - name: Download Artifacts
  324. uses: actions/download-artifact@v8
  325. with:
  326. path: ./downloaded-artifacts
  327. pattern: '*-AnyKernel3'
  328. - name: get commit hashes
  329. run: |
  330. echo "SUSFS_510=${{ needs.resolve-sources.outputs.susfs_commit_android12_5_10 }}" >> $GITHUB_ENV
  331. echo "SUSFS_515=${{ needs.resolve-sources.outputs.susfs_commit_android13_5_15 }}" >> $GITHUB_ENV
  332. echo "SUSFS_61=${{ needs.resolve-sources.outputs.susfs_commit_android14_6_1 }}" >> $GITHUB_ENV
  333. echo "SUSFS_66=${{ needs.resolve-sources.outputs.susfs_commit_android15_6_6 }}" >> $GITHUB_ENV
  334. echo "KSU_COMMIT=${{ needs.resolve-sources.outputs.ksu_commit }}" >> $GITHUB_ENV
  335. echo "KSUN_COMMIT=${{ needs.resolve-sources.outputs.kernelsu_commit }}" >> $GITHUB_ENV
  336. echo "RESUKI_COMMIT=${{ needs.resolve-sources.outputs.resukisu_commit }}" >> $GITHUB_ENV
  337. echo "NM_HASH=${{ needs.resolve-sources.outputs.nomount_commit }}" >> $GITHUB_ENV
  338. - name: Set release body
  339. run: |
  340. cat << 'EOF' > release_body.md
  341. **IMPORTANT DISCLAIMER**
  342. This software is provided for testing and educational purposes only. Use at your own risk.
  343. The developers are not responsible for any damage, data loss, or issues that may occur.
  344. Please ensure you have proper backups before installation.
  345. Features:
  346. EOF
  347. cat <<EOF >> release_body.md
  348. -> Root: ${{ inputs.root_flavor }} (commit_mode: ${{ inputs.commit_mode }})
  349. EOF
  350. if [ "${{ inputs.susfs }}" = "true" ]; then
  351. cat <<'EOF' >> release_body.md
  352. -> SUSFS v2.3.0 - https://gitlab.com/simonpunk/susfs4ksu
  353. -> SUSFS Inline hooks
  354. EOF
  355. fi
  356. if [ "${{ inputs.bbg }}" = "true" ]; then
  357. cat <<'EOF' >> release_body.md
  358. -> BBG - https://github.com/vc-teahouse/Baseband-guard
  359. EOF
  360. fi
  361. if [ "${{ inputs.unicodefix }}" = "true" ]; then
  362. cat <<'EOF' >> release_body.md
  363. -> unicode fix - Prevent path traversal and other detections using non-printable Unicode codepoints
  364. EOF
  365. fi
  366. if [ "${{ inputs.zeromount }}" = "true" ]; then
  367. cat <<'EOF' >> release_body.md
  368. -> Zeromount - https://github.com/Enginex0/zeromount
  369. EOF
  370. fi
  371. if [ "${{ inputs.nomount }}" = "true" ]; then
  372. cat <<'EOF' >> release_body.md
  373. -> NoMount - https://github.com/maxsteeel/nomount
  374. EOF
  375. fi
  376. if [ "${{ inputs.droidspace }}" = "true" ]; then
  377. cat <<'EOF' >> release_body.md
  378. -> droidspaces support - https://github.com/ravindu644/Droidspaces-OSS
  379. EOF
  380. fi
  381. if [ "${{ inputs.ntsync }}" = "true" ]; then
  382. cat <<'EOF' >> release_body.md
  383. -> NTSync - Provide high-performance, low-latency synchronization primitives compatible with the Windows NT kernel API
  384. EOF
  385. fi
  386. if [ "${{ inputs.bbrv3 }}" = "true" ]; then
  387. cat <<'EOF' >> release_body.md
  388. -> TCP BBRV3 (better TCP congestion and faster internet)
  389. -> CAKE and PIE qdisc Support - Better Net Schedulers
  390. EOF
  391. fi
  392. if [ "${{ inputs.ipv6_nat }}" = "true" ]; then
  393. cat <<'EOF' >> release_body.md
  394. -> IP Set & IPv6 NAT Support - Advanced firewall capabilities and IPv6 NAT Support
  395. EOF
  396. fi
  397. if [ "${{ inputs.ttl }}" = "true" ]; then
  398. cat <<'EOF' >> release_body.md
  399. -> TTL Target Support - Network packet manipulation
  400. EOF
  401. fi
  402. if [ "${{ inputs.optimization }}" = "true" ]; then
  403. cat <<'EOF' >> release_body.md
  404. -> Kernel Optimization - Memory, I/O, CPU scheduler, network and other general tunings
  405. -> Patches for optimizations can be found here - https://github.com/WildKernels/kernel_patches/tree/main/common
  406. EOF
  407. fi
  408. echo "-> Built using LTO: ${{ inputs.lto }}" >> release_body.md
  409. cat <<'EOF' >> release_body.md
  410. Notes:
  411. - Currently kpm ONLY works for S24U and S25U.
  412. Module:
  413. -> https://github.com/sidex15/ksu_module_susfs
  414. -> https://github.com/rrr333nnn333/BRENE
  415. Pinned Commits (verified mode):
  416. EOF
  417. cat <<EOF >> release_body.md
  418. KernelSU: ${{ env.KSU_COMMIT }}
  419. KernelSU-Next: ${{ env.KSUN_COMMIT }}
  420. ReSukiSU: ${{ env.RESUKI_COMMIT }}
  421. SUSFS 5.10: ${{ env.SUSFS_510 }}
  422. SUSFS 6.1: ${{ env.SUSFS_61 }}
  423. SUSFS 6.6: ${{ env.SUSFS_66 }}
  424. NoMount: ${{ env.NM_HASH }}
  425. EOF
  426. - name: Create GitHub Release
  427. uses: softprops/action-gh-release@v3
  428. with:
  429. tag_name: ${{ env.NEW_TAG }}
  430. prerelease: ${{ inputs.release_type == 'Pre-Release' }}
  431. files: ""
  432. name: ${{ env.RELEASE_NAME }}
  433. body_path: release_body.md
  434. - name: Upload Release Assets
  435. run: |
  436. shopt -s nullglob
  437. anykernel_dirs=(./downloaded-artifacts/*/)
  438. if [ ${#anykernel_dirs[@]} -eq 0 ]; then
  439. echo "No artifact directories found under ./downloaded-artifacts; skipping upload."
  440. else
  441. for dir in "${anykernel_dirs[@]}"; do
  442. if [[ "$(basename "$dir")" == *"-AnyKernel3" ]]; then
  443. artifact_name=$(basename "$dir")
  444. echo "Creating ZIP for $artifact_name..."
  445. cd "$dir"
  446. zip -r -9 "../../${artifact_name}.zip" ./*
  447. cd - > /dev/null
  448. echo "Uploading ${artifact_name}.zip..."
  449. gh release upload ${{ env.NEW_TAG }} "${artifact_name}.zip"
  450. fi
  451. done
  452. fi