From c7578d733ebee2445f85541b2c419ce478c248b3 Mon Sep 17 00:00:00 2001 From: cneicy Date: Sat, 5 Sep 2026 03:49:49 +0800 Subject: [PATCH] ci: publish NuGet without external actions --- .gitea/workflows/publish-nuget.yml | 82 +++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 25 deletions(-) diff --git a/.gitea/workflows/publish-nuget.yml b/.gitea/workflows/publish-nuget.yml index e0eec17..d753545 100644 --- a/.gitea/workflows/publish-nuget.yml +++ b/.gitea/workflows/publish-nuget.yml @@ -15,45 +15,77 @@ jobs: env: NUGET_AUTH_TOKEN: ${{ secrets.SHRINKSDK_PACKAGE_TOKEN }} steps: - - name: Checkout tagged source - uses: actions/checkout@v4 - - - name: Install .NET prerequisites - shell: bash - run: | - apt-get update - apt-get install -y --no-install-recommends ca-certificates curl - rm -rf /var/lib/apt/lists/* - - - name: Set up .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: '8.0.x' - - - name: Validate tag and pack projects + - name: Fetch exact tagged source env: GITEA_REF: ${{ gitea.ref }} + GITEA_REPOSITORY: ${{ gitea.repository }} shell: bash run: | set -euo pipefail tag="${GITEA_REF#refs/tags/}" - version="$(node -p "require('./package.json').version")" + case "$tag" in + v[0-9]*) ;; + *) echo "Expected a version tag ref, got: $GITEA_REF" >&2; exit 1 ;; + esac + export SHRINKSDK_ARCHIVE_URL="https://git.crash.work/${GITEA_REPOSITORY}/archive/${tag}.tar.gz" + node --input-type=module <<'NODE' + import { writeFile } from 'node:fs/promises'; + + const response = await fetch(process.env.SHRINKSDK_ARCHIVE_URL); + if (!response.ok) { + throw new Error(`Release archive download failed: ${response.status} ${response.statusText}`); + } + await writeFile('release.tar.gz', new Uint8Array(await response.arrayBuffer())); + NODE + mkdir release + tar -xzf release.tar.gz --strip-components=1 -C release + rm -f release.tar.gz + printf '%s' "$tag" > release/.shrink-sdk-release-tag + + - name: Install .NET 8 SDK + shell: bash + run: | + set -euo pipefail + apt-get update + apt-get install -y --no-install-recommends ca-certificates curl + rm -rf /var/lib/apt/lists/* + curl -fsSL --retry 3 https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh + bash /tmp/dotnet-install.sh --channel 8.0 --install-dir /opt/dotnet + /opt/dotnet/dotnet --info + + - name: Validate, pack and publish + shell: bash + run: | + set -euo pipefail + : "${NUGET_AUTH_TOKEN:?SHRINKSDK_PACKAGE_TOKEN is required}" + export PATH="/opt/dotnet:$PATH" + cd release + tag="$(cat .shrink-sdk-release-tag)" + projects=() + if [[ -d DotNet~ ]]; then + while IFS= read -r -d '' project; do projects+=("$project"); done < <(find DotNet~ -type f -name '*.csproj' -print0) + fi + if [[ -d Godot~ ]]; then + while IFS= read -r -d '' project; do projects+=("$project"); done < <(find Godot~ -type f -name '*.csproj' -print0) + fi + if [[ "${#projects[@]}" -eq 0 ]]; then + while IFS= read -r -d '' project; do projects+=("$project"); done < <(find . -maxdepth 1 -type f -name '*.csproj' -print0) + fi + test "${#projects[@]}" -gt 0 + if [[ -f package.json ]]; then + version="$(node -p "require('./package.json').version")" + else + version="$(dotnet msbuild "${projects[0]}" -getProperty:Version -nologo)" + fi test "$tag" = "v$version" mkdir -p packages - mapfile -d '' projects < <(find DotNet~ Godot~ -type f -name '*.csproj' -print0 2>/dev/null || true) - test "${#projects[@]}" -gt 0 for project in "${projects[@]}"; do dotnet restore "$project" --configfile NuGet.Config dotnet pack "$project" --configuration Release --no-restore --output "$PWD/packages" --include-symbols --include-source done find packages -maxdepth 1 -name '*.nupkg' -type f | grep -q . - - - name: Publish packages - shell: bash - run: | - set -euo pipefail - : "${NUGET_AUTH_TOKEN:?SHRINKSDK_PACKAGE_TOKEN is required}" dotnet nuget push 'packages/*.nupkg' --api-key "$NUGET_AUTH_TOKEN" --source https://git.crash.work/api/packages/ShrinkSDK/nuget/index.json --skip-duplicate if compgen -G 'packages/*.snupkg' > /dev/null; then dotnet nuget push 'packages/*.snupkg' --api-key "$NUGET_AUTH_TOKEN" --source https://git.crash.work/api/packages/ShrinkSDK/nuget/index.json --skip-duplicate fi +