name: Publish NuGet packages on: push: tags: - 'v*' workflow_dispatch: jobs: publish: runs-on: ubuntu-latest permissions: contents: read packages: write env: NUGET_AUTH_TOKEN: ${{ secrets.SHRINKSDK_PACKAGE_TOKEN }} DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: '1' DOTNET_CLI_TELEMETRY_OPTOUT: '1' steps: - 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/}" 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 node --input-type=module <<'NODE' import { writeFile } from 'node:fs/promises'; const metadataResponse = await fetch('https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/8.0/releases.json'); if (!metadataResponse.ok) throw new Error(`Release metadata download failed: ${metadataResponse.status}`); const metadata = await metadataResponse.json(); const sdkVersion = metadata['latest-sdk']; const release = metadata.releases.find(item => item.sdk?.version === sdkVersion); const file = release?.sdk?.files?.find(item => item.rid === 'linux-x64' && item.name.endsWith('.tar.gz')); if (!file) throw new Error(`Linux x64 SDK archive not found for ${sdkVersion}`); const archiveResponse = await fetch(file.url); if (!archiveResponse.ok) throw new Error(`SDK download failed: ${archiveResponse.status}`); await writeFile('/tmp/dotnet-sdk.tar.gz', new Uint8Array(await archiveResponse.arrayBuffer())); NODE mkdir -p /opt/dotnet tar -xzf /tmp/dotnet-sdk.tar.gz -C /opt/dotnet rm -f /tmp/dotnet-sdk.tar.gz /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 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 . 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