main.yml 19 KB

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