Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions .github/workflows/aws-sdk-canary.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: "AWS SDK Canary"

# Early warning for AWS SDK drift.
#
# The normal build pins AWSSDK.* so it stays reproducible - which is exactly why the
# AWSSDK.Extensions.NETCore.Setup 4.0.4 breaking change (issue #52) went unnoticed for 70 days:
# CI only ever saw the pinned version, while consumers float to whatever is newest.
#
# This job floats both AWSSDK.Core and AWSSDK.Extensions.NETCore.Setup to the latest 4.x and runs
# the suite against them. A failure here means "AWS moved", not "we broke something".

on:
schedule:
# 05:00 UTC daily
- cron: "0 5 * * *"
workflow_dispatch:

env:
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_NOLOGO: true

permissions:
contents: read

jobs:
canary:
name: "Latest AWS SDK"
runs-on: ubuntu-22.04
if: github.repository == 'localstack-dotnet/localstack-dotnet-client'

steps:
- name: "Checkout"
uses: actions/checkout@v7

- name: "Setup .NET SDK"
uses: actions/setup-dotnet@v6
with:
dotnet-version: |
8.0.x
9.0.x
global-json-file: global.json

# Floating versions resolve against NuGet's cached feed index, so a warm HTTP cache can pin this
# job to a stale "latest" without saying so - the exact drift it exists to detect.
- name: "Clear NuGet HTTP cache"
run: dotnet nuget locals http-cache --clear

# Deliberately no NuGet package cache either: the point is to resolve the newest AWSSDK every run.
- name: "Build & test against floating AWS SDK"
run: ./build.sh --target tests --skipFunctionalTest true --aws-setup-track latest --force-restore true --exclusive

- name: "Report resolved AWS SDK versions"
if: always()
run: |
echo "### Resolved AWS SDK versions" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
grep -rhoE '"AWSSDK\.(Extensions\.NETCore\.Setup|Core)/[^"]+"' \
tests/*/obj/project.assets.json 2>/dev/null | sort -u >> $GITHUB_STEP_SUMMARY || true
echo '```' >> $GITHUB_STEP_SUMMARY

- name: "Upload test artifacts"
uses: actions/upload-artifact@v7
if: failure()
with:
name: canary-test-results
path: |
**/*.trx
**/TestResults/**/*
retention-days: 7
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
56 changes: 40 additions & 16 deletions .github/workflows/ci-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ env:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_NOLOGO: true

permissions:
contents: read

jobs:
build-and-test:
name: "Build & Test (${{ matrix.name }})"
Expand All @@ -28,6 +31,13 @@ jobs:
NUGET_PACKAGES: ${{ contains(matrix.os, 'windows') && format('{0}\.nuget\packages', github.workspace) || format('{0}/.nuget/packages', github.workspace) }}
BADGE_GIST_ID: "472c59b7c2a1898c48a29f3c88897c5a"

# dorny/test-reporter publishes a check run. The badge step authenticates with its own
# PAT (secrets.GIST_SECRET), so it needs nothing from GITHUB_TOKEN.
permissions:
contents: read
actions: read
checks: write

strategy:
fail-fast: false
matrix:
Expand All @@ -49,23 +59,32 @@ jobs:

steps:
- name: "Checkout"
uses: actions/checkout@v4
uses: actions/checkout@v7
with:
fetch-depth: 0 # Full history for better caching

- name: "Setup .NET SDK"
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v6
with:
dotnet-version: |
8.0.x
9.0.x
global-json-file: global.json

- name: "Make build script executable"
if: runner.os != 'Windows'
run: chmod +x ./build.sh
# The macOS runner image no longer ships Mono, and VSTest needs the real 'mono' host
# on the PATH to execute the net472 test assemblies.
- name: "Install Mono (macOS)"
if: runner.os == 'macOS'
run: |
if command -v mono >/dev/null 2>&1; then
echo "βœ… Mono already present: $(mono --version | head -1)"
else
brew install mono
echo "βœ… Installed: $(mono --version | head -1)"
fi

- name: "Cache NuGet packages"
uses: actions/cache@v4
uses: actions/cache@v6
with:
path: ${{ runner.os == 'Windows' && format('{0}\.nuget\packages', github.workspace) || format('{0}/.nuget/packages', github.workspace) }}
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json', '**/*.csproj', '**/Directory.Packages.props') }}
Expand All @@ -80,7 +99,7 @@ jobs:

- name: "Publish Test Results"
id: test-results
uses: dorny/test-reporter@v1
uses: dorny/test-reporter@v3
if: success() || failure()
with:
name: "Test Results (${{ matrix.name }})"
Expand Down Expand Up @@ -108,7 +127,7 @@ jobs:
server_url: ${{ github.server_url }}

- name: "Upload Test Artifacts"
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
if: failure()
with:
name: test-results-${{ matrix.name }}
Expand All @@ -120,7 +139,7 @@ jobs:
continuous-deployment:
name: "Continuous Deployment"
runs-on: ubuntu-22.04
needs: build-and-test
needs: [build-and-test]
if: |
github.repository == 'localstack-dotnet/localstack-dotnet-client' &&
((github.event_name == 'push' && github.ref == 'refs/heads/master') ||
Expand All @@ -134,27 +153,32 @@ jobs:

steps:
- name: "Checkout"
uses: actions/checkout@v4
uses: actions/checkout@v7
with:
fetch-depth: 0

- name: "Setup .NET SDK"
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v6
with:
dotnet-version: |
8.0.x
9.0.x
global-json-file: global.json

- name: "Cache NuGet packages"
uses: actions/cache@v4
uses: actions/cache@v6
with:
path: ${{ github.workspace }}/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json', '**/*.csproj', '**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-

- name: "Make build script executable"
run: chmod +x ./build.sh
# Upload-artifact rejects '/' in artifact names, and every deploy from this job runs on a
# feature/* branch. Mirrors the sanitising BuildContext already applies to the package version.
- name: "Compute artifact-safe branch name"
run: |
RAW_REF="${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}"
echo "SAFE_REF=${RAW_REF//\//-}" >> "$GITHUB_ENV"

- name: "Setup GitHub Packages Configuration"
run: |
Expand Down Expand Up @@ -207,9 +231,9 @@ jobs:
--package-secret ${{ secrets.GITHUB_TOKEN }}

- name: "Upload Package Artifacts"
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: "packages-${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}-${{ github.run_number }}"
name: "packages-${{ env.SAFE_REF }}-${{ github.run_number }}"
path: |
artifacts/*.nupkg
artifacts/*.snupkg
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/dependency-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: "Checkout"
uses: actions/checkout@v4
uses: actions/checkout@v7

- name: "Dependency Review"
uses: actions/dependency-review-action@v4
uses: actions/dependency-review-action@v5
with:
# Fail the check if a vulnerability with 'moderate' severity or higher is found.
fail-on-severity: moderate
Expand Down
12 changes: 5 additions & 7 deletions .github/workflows/publish-nuget.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,26 +44,24 @@ jobs:

steps:
- name: "Checkout"
uses: actions/checkout@v4
uses: actions/checkout@v7

- name: "Setup .NET SDK"
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v6
with:
dotnet-version: |
8.0.x
9.0.x
global-json-file: global.json

- name: "Cache NuGet packages"
uses: actions/cache@v4
uses: actions/cache@v6
with:
path: ${{ github.workspace }}/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json', '**/*.csproj', '**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-

- name: "Make build script executable"
run: chmod +x ./build.sh

- name: "Build & Test"
run: ./build.sh --target tests --skipFunctionalTest true

Expand Down Expand Up @@ -124,7 +122,7 @@ jobs:
--package-secret ${{ secrets.NUGET_API_KEY }}

- name: "Upload Package Artifacts"
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: "packages-${{ github.event.inputs.package-id }}-${{ github.event.inputs.package-version }}"
path: |
Expand Down
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -340,4 +340,8 @@ testrunner


# Visual Studio Code options directory
.vscode/
.vscode/
# Agent/MCP server configuration is per-developer: it pins machine-local endpoints
# (e.g. a Rider SSE port) and personal tooling, so it is not shareable. Commit a
# .mcp.json.example instead if the project ever needs shared agent servers.
.mcp.json
26 changes: 26 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,32 @@ This document outlines the changes, updates, and important notes for the LocalSt

See v1.x change log for previous versions: [CHANGELOG.md](https://github.com/localstack-dotnet/localstack-dotnet-client/blob/sdkv3-lts/CHANGELOG.md)

## [v2.0.1](https://github.com/localstack-dotnet/localstack-dotnet-client/releases/tag/v2.0.1)

> Maintenance release for **`LocalStack.Client.Extensions` only**. `LocalStack.Client` stays at 2.0.0.

### 🐞 Fixes

- **Fixed `LocalStackClientConfigurationException` when `UseLocalStack` is `false`
([#52](https://github.com/localstack-dotnet/localstack-dotnet-client/issues/52)).**
`AWSSDK.Extensions.NETCore.Setup` 4.0.4 added an optional parameter to the internal
`ClientFactory<T>` constructor, which broke our exact-signature reflection lookup. Resolution now
matches on the `AWSOptions` parameter and defaults any trailing ones.
- Failure messages now list the constructor signatures actually discovered.

### πŸ› οΈ General

- **Minimum `AWSSDK.Extensions.NETCore.Setup` is now 4.0.100.5** (was 4.0.2). No other dependency
floor changed.
- **Internal dependency refresh:** `AWSSDK.Core` β†’ 4.0.100.6, 120 AWSSDK service packages, and the
analyzer/test toolchain. Clears the `NU1901` advisory (GHSA-9cvc-h2w8-phrp) on `AWSSDK.Core`
4.0.0.15.
- **Added a scheduled AWS SDK canary** that builds against the newest `AWSSDK.Core` and
`AWSSDK.Extensions.NETCore.Setup`, so upstream changes surface before they reach users.
- **Public API unchanged.**

---

## [v2.0.0](https://github.com/localstack-dotnet/localstack-dotnet-client/releases/tag/v2.0.0)

> **Heads‑up**: Nativeβ€―AOT is not yet supported in GA.
Expand Down
9 changes: 8 additions & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<PackageProjectUrl>https://github.com/localstack-dotnet/localstack-dotnet-client</PackageProjectUrl>
<PackageIcon>localstack-dotnet-square.png</PackageIcon>
<PackageMainVersion>2.0.0</PackageMainVersion>
<PackageExtensionVersion>2.0.0</PackageExtensionVersion>
<PackageExtensionVersion>2.0.1</PackageExtensionVersion>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<LangVersion>13.0</LangVersion>
Expand All @@ -32,6 +32,13 @@
<!-- Enable central package management -->
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>

<!-- Which AWS SDK versions to build against: 'current' (pinned, the default) or
'latest' (floating, scheduled canary only). See Directory.Packages.props. -->
<AwsSetupTrack Condition="'$(AwsSetupTrack)' == ''">current</AwsSetupTrack>

<!-- Floating versions are opt-in under central package management (NU1011). -->
<CentralPackageFloatingVersionsEnabled Condition="'$(AwsSetupTrack)' == 'latest'">true</CentralPackageFloatingVersionsEnabled>

</PropertyGroup>

<!-- third-party analyzers -->
Expand Down
Loading
Loading