From 6713b309a7ab1f7586332c85728a1bf0ce3f4cd8 Mon Sep 17 00:00:00 2001 From: Guy Ludvig Date: Thu, 9 Jul 2026 23:21:44 +0300 Subject: [PATCH] Add NuGet CI/CD workflows with MinVer versioning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ci.yml: build + test (net8.0/net10.0) on PRs to master - release.yml: auto-publish alpha prereleases on every merge to master; workflow_dispatch to cut beta/rc/stable — creates the git tag, publishes to nuget.org, opens a GitHub Release (softprops/action-gh-release@v3); stable is gated behind a nuget.org environment - Publish via NuGet trusted publishing (OIDC): NuGet/login@v1 exchanges a GitHub OIDC token for a short-lived key — no long-lived NUGET_API_KEY secret - Adopt MinVer (git-tag driven, prefix "v"); drop the hardcoded . First modern release is 2.0.0 (breaking: dropped netstandard/Framework, removed AddAppSettings). The legacy version-* tags belong to the old ExistAll.SimpleConfig package and are deliberately ignored. - Package quality: symbol packages (snupkg), SourceLink, deterministic builds, embedded README + icon; fix RepositoryUrl -> existall/SimpleSettings - Remove the non-functional dotnet.yml stub --- .github/workflows/ci.yml | 57 ++++++++ .github/workflows/dotnet.yml | 21 --- .github/workflows/release.yml | 250 ++++++++++++++++++++++++++++++++++ icon.png | Bin 0 -> 8320 bytes src/Directory.Build.props | 44 +++++- src/Directory.Packages.props | 5 + 6 files changed, 350 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/dotnet.yml create mode 100644 .github/workflows/release.yml create mode 100644 icon.png diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7d7863a --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,57 @@ +name: CI + +on: + pull_request: + branches: [ master ] + +# PR validation only reads the repo. +permissions: + contents: read + +# Cancel superseded runs for the same PR. +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +env: + DOTNET_NOLOGO: true + DOTNET_CLI_TELEMETRY_OPTOUT: true + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages + +jobs: + build-test: + runs-on: ubuntu-latest + defaults: + run: + working-directory: src # global.json (Microsoft.Testing.Platform opt-in) lives here + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # MinVer needs full history + tags to compute the version + + - name: Setup .NET (8 + 10) + uses: actions/setup-dotnet@v4 + with: + dotnet-version: | + 8.0.x + 10.0.x + # Build uses the SDK pinned by src/global.json (10.0.100); the 8.0 runtime + # installed here is what actually runs the net8.0 test target. + + - name: Cache NuGet packages + uses: actions/cache@v4 + with: + path: ${{ github.workspace }}/.nuget/packages + key: nuget-${{ runner.os }}-${{ hashFiles('src/Directory.Packages.props') }} + restore-keys: nuget-${{ runner.os }}- + + - name: Restore + run: dotnet restore ExistAll.SimpleConfig.slnx + + - name: Build (Release, deterministic) + run: dotnet build ExistAll.SimpleConfig.slnx -c Release --no-restore -p:ContinuousIntegrationBuild=true + + - name: Test (net8.0 + net10.0) + run: dotnet test ExistAll.SimpleConfig.slnx -c Release --no-build diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml deleted file mode 100644 index 5a087da..0000000 --- a/.github/workflows/dotnet.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: .NET - -on: - push: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - environment: - name: testing - steps: - - uses: actions/checkout@v2 - build1: - needs: [build] - runs-on: ubuntu-latest - environment: - name: prod - steps: - - uses: actions/checkout@v2 - diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..b17eeae --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,250 @@ +name: Release + +on: + push: + branches: [ master ] # every merge -> fresh alpha prerelease + workflow_dispatch: + inputs: + channel: + description: Release channel + type: choice + options: [ beta, rc, stable ] + default: beta + bump: + description: SemVer part to bump (relative to the latest stable tag; ignored on the first release) + type: choice + options: [ patch, minor, major ] + default: minor + dry_run: + description: Build/pack/upload only - do NOT tag, push to NuGet, or create a Release + type: boolean + default: false + +permissions: + contents: read + +# Serialize releases; never cancel an in-flight publish. +concurrency: + group: release + cancel-in-progress: false + +env: + DOTNET_NOLOGO: true + DOTNET_CLI_TELEMETRY_OPTOUT: true + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages + ARTIFACTS: ${{ github.workspace }}/artifacts + NUGET_SOURCE: https://api.nuget.org/v3/index.json + TAG_PREFIX: v # deliberately NOT "version-": those tags are the dead ExistAll.SimpleConfig line + BASELINE_VERSION: 2.0.0 # first release on the v* line (modernized, breaking vs published 1.0.0) + +jobs: + # --------------------------------------------------------------------------- + # A) Automatic ALPHA prerelease on every push to master. + # MinVer stamps a height-based prerelease, e.g. 2.0.0-alpha.0.7. + # --------------------------------------------------------------------------- + prerelease: + if: github.event_name == 'push' + runs-on: ubuntu-latest + permissions: + contents: read # no tag/release here + id-token: write # OIDC for NuGet trusted publishing + defaults: + run: + working-directory: src + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: | + 8.0.x + 10.0.x + + - uses: actions/cache@v4 + with: + path: ${{ github.workspace }}/.nuget/packages + key: nuget-${{ runner.os }}-${{ hashFiles('src/Directory.Packages.props') }} + restore-keys: nuget-${{ runner.os }}- + + - name: Restore + run: dotnet restore ExistAll.SimpleConfig.slnx + + - name: Build + run: dotnet build ExistAll.SimpleConfig.slnx -c Release --no-restore -p:ContinuousIntegrationBuild=true + + - name: Test + run: dotnet test ExistAll.SimpleConfig.slnx -c Release --no-build + + - name: Pack (MinVer -> height-based alpha) + run: dotnet pack ExistAll.SimpleConfig.slnx -c Release --no-build -p:ContinuousIntegrationBuild=true -o "$ARTIFACTS" + + - name: List packages + run: ls -1 "$ARTIFACTS" + + - name: Upload packages + uses: actions/upload-artifact@v4 + with: + name: nuget-prerelease + path: | + ${{ env.ARTIFACTS }}/*.nupkg + ${{ env.ARTIFACTS }}/*.snupkg + + - name: NuGet login (OIDC -> short-lived API key) + uses: NuGet/login@v1 + id: login + with: + user: ${{ secrets.NUGET_USER }} + + # dotnet nuget push globs natively; each .nupkg also pushes its adjacent .snupkg. + - name: Push to NuGet.org + run: dotnet nuget push "$ARTIFACTS/*.nupkg" --api-key "${{ steps.login.outputs.NUGET_API_KEY }}" --source "$NUGET_SOURCE" --skip-duplicate + + # --------------------------------------------------------------------------- + # B) Manual, curated RELEASE (beta.N / rc.N / stable) via workflow_dispatch. + # Tag is created LOCALLY (MinVer reads it), pushed only AFTER a successful + # NuGet push, then a GitHub Release is created. + # --------------------------------------------------------------------------- + release: + if: github.event_name == 'workflow_dispatch' + runs-on: ubuntu-latest + permissions: + contents: write # push tag + create GitHub Release + id-token: write # OIDC for NuGet trusted publishing + environment: + name: nuget.org # add a Required reviewer here to gate stable publishes + defaults: + run: + working-directory: src + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # all tags -> correct next-version computation + + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: | + 8.0.x + 10.0.x + + - uses: actions/cache@v4 + with: + path: ${{ github.workspace }}/.nuget/packages + key: nuget-${{ runner.os }}-${{ hashFiles('src/Directory.Packages.props') }} + restore-keys: nuget-${{ runner.os }}- + + - name: Compute next version tag + id: ver + env: + BUMP: ${{ inputs.bump }} + CHANNEL: ${{ inputs.channel }} + run: | + set -euo pipefail + PREFIX="$TAG_PREFIX" + git fetch --tags --force --quiet + + # Highest STABLE tag under the "v" prefix: vMAJOR.MINOR.PATCH (no pre-release). + # The "v[0-9]" glob excludes the legacy "version-*" tags by construction. + latest_stable="$( + git tag --list "${PREFIX}[0-9]*" \ + | grep -E "^${PREFIX}[0-9]+\.[0-9]+\.[0-9]+$" \ + | sed "s/^${PREFIX}//" \ + | sort -V | tail -n1 || true + )" + + if [ -z "$latest_stable" ]; then + # First release on the v* line -> the baseline itself (bump ignored). + TARGET="$BASELINE_VERSION" + echo "No v* stable tag yet -> first release targets baseline $TARGET (bump '$BUMP' ignored)." + else + IFS='.' read -r MA MI PA <<< "$latest_stable" + case "$BUMP" in + major) MA=$((MA+1)); MI=0; PA=0 ;; + minor) MI=$((MI+1)); PA=0 ;; + patch) PA=$((PA+1)) ;; + *) echo "::error::invalid bump '$BUMP'"; exit 1 ;; + esac + TARGET="${MA}.${MI}.${PA}" + echo "Latest stable $latest_stable + $BUMP -> $TARGET" + fi + + if [ "$CHANNEL" = "stable" ]; then + NEW_TAG="${PREFIX}${TARGET}" + if git rev-parse -q --verify "refs/tags/${NEW_TAG}" >/dev/null; then + echo "::error::tag ${NEW_TAG} already exists"; exit 1 + fi + PRERELEASE=false + else + # Continue the -beta.N / -rc.N series for this target base. + last_n="$( + git tag --list "${PREFIX}${TARGET}-${CHANNEL}.*" \ + | sed -E "s/^${PREFIX}${TARGET}-${CHANNEL}\.([0-9]+)$/\1/" \ + | grep -E '^[0-9]+$' | sort -n | tail -n1 || true + )" + next_n=$(( ${last_n:-0} + 1 )) + NEW_TAG="${PREFIX}${TARGET}-${CHANNEL}.${next_n}" + PRERELEASE=true + fi + + echo "Computed tag: $NEW_TAG (prerelease=$PRERELEASE)" + { + echo "tag=$NEW_TAG" + echo "prerelease=$PRERELEASE" + } >> "$GITHUB_OUTPUT" + + - name: Create local tag (MinVer reads it at pack time) + run: | + set -euo pipefail + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git tag -a "${{ steps.ver.outputs.tag }}" -m "Release ${{ steps.ver.outputs.tag }}" + + - name: Restore + run: dotnet restore ExistAll.SimpleConfig.slnx + + - name: Build + run: dotnet build ExistAll.SimpleConfig.slnx -c Release --no-restore -p:ContinuousIntegrationBuild=true + + - name: Test + run: dotnet test ExistAll.SimpleConfig.slnx -c Release --no-build + + - name: Pack (MinVer -> exact tagged version) + run: dotnet pack ExistAll.SimpleConfig.slnx -c Release --no-build -p:ContinuousIntegrationBuild=true -o "$ARTIFACTS" + + - name: Upload packages + uses: actions/upload-artifact@v4 + with: + name: nuget-${{ steps.ver.outputs.tag }} + path: | + ${{ env.ARTIFACTS }}/*.nupkg + ${{ env.ARTIFACTS }}/*.snupkg + + - name: NuGet login (OIDC -> short-lived API key) + if: ${{ !inputs.dry_run }} + uses: NuGet/login@v1 + id: login + with: + user: ${{ secrets.NUGET_USER }} + + # dotnet nuget push globs natively; each .nupkg also pushes its adjacent .snupkg. + - name: Push to NuGet.org + if: ${{ !inputs.dry_run }} + run: dotnet nuget push "$ARTIFACTS/*.nupkg" --api-key "${{ steps.login.outputs.NUGET_API_KEY }}" --source "$NUGET_SOURCE" --skip-duplicate + + - name: Push git tag (only after a successful publish) + if: ${{ !inputs.dry_run }} + run: git push origin "${{ steps.ver.outputs.tag }}" + + - name: Create GitHub Release + if: ${{ !inputs.dry_run }} + uses: softprops/action-gh-release@v3 + with: + tag_name: ${{ steps.ver.outputs.tag }} + name: ${{ steps.ver.outputs.tag }} + prerelease: ${{ steps.ver.outputs.prerelease }} + generate_release_notes: true + files: | + ${{ env.ARTIFACTS }}/*.nupkg + ${{ env.ARTIFACTS }}/*.snupkg diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9391ae6c5ca971937cfab7cd88a8a32362e59b91 GIT binary patch literal 8320 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 KMNUMnLSTZqoR0wj literal 0 HcmV?d00001 diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 8b5f4f9..1525c1f 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -4,20 +4,52 @@ enable enable - latest + - + - 1.0.0 Guy Ludvig ExistsForAll SimpleSettings allow applications to use configurations values from any data store in the type of interfaces, thus decouples the frameworks from your appliaction and allowing application to inject interfaces and nothing else. This framework should be used instead of .Net Core IOptions<T>. - https://github.com/existall/SimpleConfig - https://github.com/existall/SimpleConfig - GIT + https://github.com/existall/SimpleSettings + https://github.com/existall/SimpleSettings + git MIT Configuration, Settings, Ioc, DI, ExistsForAll, Dependency injection, Options, SimpleConfig + icon.png + README.md + + + + + + + + + v + 2.0 + + + + + true + snupkg + true + true + true + + + + + + diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index c15f5d1..b940f83 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -21,4 +21,9 @@ + + + + +