main.yml 19 KB

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