From 3bf12ec73d81ee657a3d0294da7b2a4b96103ab3 Mon Sep 17 00:00:00 2001 From: JustMe Date: Sun, 4 Oct 2026 13:05:17 -0700 Subject: [PATCH] ci: upload release artifacts concurrently [CI SKIP] --- ci/package-cross-platform.ps1 | 42 ++++++++++++++++++----------------- ci/publish-gitea-release.sh | 37 ++++++++++++++++++++---------- 2 files changed, 47 insertions(+), 32 deletions(-) diff --git a/ci/package-cross-platform.ps1 b/ci/package-cross-platform.ps1 index c4a2e49..aae8516 100644 --- a/ci/package-cross-platform.ps1 +++ b/ci/package-cross-platform.ps1 @@ -33,24 +33,6 @@ function New-TarGzArchive([string]$SourceDirectory, [string]$ArchivePath, [strin } } -function Upload-Package([string]$File) { - $name = Split-Path -Leaf $File - $url = "$giteaBase/api/packages/justme/generic/monitor-node/$version/$name" - $status = & curl.exe --silent --show-error --retry 3 --netrc-file $netrc --upload-file $File --output NUL --write-out '%{http_code}' $url - if ($LASTEXITCODE -ne 0) { - throw "Gitea package upload failed for $name." - } - if ($status -match '^2') { - Write-Output "uploaded Gitea package $name" - } - elseif ($status -eq '409') { - Write-Output "Gitea package $name already exists; reusing the existing release file" - } - else { - throw "Gitea package upload failed for $name (HTTP $status)." - } -} - try { $targets = @( @{ Rid = 'linux-x64'; Os = 'linux'; Arch = 'amd64'; Windows = $false }, @@ -64,6 +46,7 @@ try { ) $packageRoot = Join-Path $root '.release\packages' $null = New-Item -ItemType Directory -Force -Path $packageRoot + $uploadFiles = [System.Collections.Generic.List[string]]::new() foreach ($target in $targets) { $agentDirectory = Join-Path $root ".release\publish\$($target.Rid)\agent" $probeDirectory = Join-Path $root ".release\publish\$($target.Rid)\probe" @@ -123,10 +106,29 @@ consumer install. $checksum = "$hash $archiveName`n" $checksumPath = "$archive.sha256" [IO.File]::WriteAllText($checksumPath, $checksum, [Text.UTF8Encoding]::new($false)) - Upload-Package $archive - Upload-Package $checksumPath + [void]$uploadFiles.Add($archive) + [void]$uploadFiles.Add($checksumPath) } } + + $uploadFiles.ToArray() | ForEach-Object -Parallel { + $file = $_ + $name = Split-Path -Leaf $file + $url = "$using:giteaBase/api/packages/justme/generic/monitor-node/$using:version/$name" + $status = & curl.exe --silent --show-error --retry 3 --netrc-file $using:netrc --upload-file $file --output NUL --write-out '%{http_code}' $url + if ($LASTEXITCODE -ne 0) { + throw "Gitea package upload failed for $name." + } + if ($status -match '^2') { + Write-Output "uploaded Gitea package $name" + } + elseif ($status -eq '409') { + Write-Output "Gitea package $name already exists; reusing the existing release file" + } + else { + throw "Gitea package upload failed for $name (HTTP $status)." + } + } -ThrottleLimit 8 } finally { Remove-Item -LiteralPath $netrc -Force -ErrorAction SilentlyContinue diff --git a/ci/publish-gitea-release.sh b/ci/publish-gitea-release.sh index 4b029f3..4f0b182 100644 --- a/ci/publish-gitea-release.sh +++ b/ci/publish-gitea-release.sh @@ -77,25 +77,38 @@ assets=( "monitor-probe-v$version-windows-amd64.zip" "monitor-probe-v$version-windows-arm64.zip" ) + +upload_release_asset() { + local name="$1" file="$tmp/$1" upload_response="$tmp/$1.upload.json" status + curl --fail-with-body --silent --show-error --retry 3 --netrc-file "$netrc" \ + "$gitea_base/api/packages/justme/generic/monitor-node/$version/$name" -o "$file" + status="$(curl --silent --show-error --retry 3 --netrc-file "$netrc" \ + --request POST --header 'Content-Type: application/octet-stream' --data-binary "@$file" \ + --output "$upload_response" --write-out '%{http_code}' \ + "$api/releases/$release_id/assets?name=$name")" + case "$status" in + 2*) echo "attached $name" ;; + *) echo "Gitea Release asset upload failed for $name (HTTP $status)" >&2; cat "$upload_response" >&2; return 1 ;; + esac +} + +pids=() for archive in "${assets[@]}"; do for name in "$archive" "$archive.sha256"; do if grep -Eq "\"name\"[[:space:]]*:[[:space:]]*\"$name\"" "$assets_json"; then echo "release asset $name already exists; keeping the existing asset" continue fi - file="$tmp/$name" - upload_response="$tmp/upload.json" - curl --fail-with-body --silent --show-error --retry 3 --netrc-file "$netrc" \ - "$gitea_base/api/packages/justme/generic/monitor-node/$version/$name" -o "$file" - status="$(curl --silent --show-error --retry 3 --netrc-file "$netrc" \ - --request POST --header 'Content-Type: application/octet-stream' --data-binary "@$file" \ - --output "$upload_response" --write-out '%{http_code}' \ - "$api/releases/$release_id/assets?name=$name")" - case "$status" in - 2*) echo "attached $name" ;; - *) echo "Gitea Release asset upload failed for $name (HTTP $status)" >&2; cat "$upload_response" >&2; exit 1 ;; - esac + upload_release_asset "$name" & + pids+=("$!") + if ((${#pids[@]} >= 8)); then + wait "${pids[0]}" + pids=("${pids[@]:1}") + fi done done +for pid in "${pids[@]}"; do + wait "$pid" +done echo "published Gitea Release $tag: https://git.oeo.one/justme/MyMonitor/releases/tag/$tag"