main.yml 20 KB

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