Fix SQS Event Source LocalStack Integration #31
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: "CI/CD Pipeline" | |
| on: | |
| push: | |
| paths-ignore: | |
| - "**.md" | |
| - LICENSE | |
| branches: | |
| - "master" | |
| pull_request: | |
| paths-ignore: | |
| - "**.md" | |
| - LICENSE | |
| branches: | |
| - master | |
| - "feature/*" | |
| env: | |
| DOTNET_CLI_TELEMETRY_OPTOUT: true | |
| DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true | |
| DOTNET_NOLOGO: true | |
| jobs: | |
| build-and-test: | |
| name: "Build & Test (${{ matrix.name }})" | |
| runs-on: ${{ matrix.os }} | |
| env: | |
| NUGET_PACKAGES: ${{ contains(matrix.os, 'windows') && format('{0}\.nuget\packages', github.workspace) || format('{0}/.nuget/packages', github.workspace) }} | |
| BASE_TEST_RESULTS_DIR: ${{ contains(matrix.os, 'windows') && format('{0}\test-results', github.workspace) || format('{0}/test-results', github.workspace) }} | |
| UNIT_TEST_PROJECT_PATH: ${{ contains(matrix.os, 'windows') && format('{0}\tests\Aspire.Hosting.LocalStack.Unit.Tests\Aspire.Hosting.LocalStack.Unit.Tests.csproj', github.workspace) || format('{0}/tests/Aspire.Hosting.LocalStack.Unit.Tests/Aspire.Hosting.LocalStack.Unit.Tests.csproj', github.workspace) }} | |
| INTEGRATION_TEST_PROJECT_PATH: ${{ contains(matrix.os, 'windows') && format('{0}\tests\Aspire.Hosting.LocalStack.Integration.Tests\Aspire.Hosting.LocalStack.Integration.Tests.csproj', github.workspace) || format('{0}/tests/Aspire.Hosting.LocalStack.Integration.Tests/Aspire.Hosting.LocalStack.Integration.Tests.csproj', github.workspace) }} | |
| BADGE_GIST_ID: "f2b8df60871ea8cd0fa6b746798690b4" | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: windows-latest | |
| name: "Windows" | |
| filename: "test-results-windows.json" | |
| - os: ubuntu-22.04 | |
| name: "Linux" | |
| filename: "test-results-linux.json" | |
| - os: macos-latest | |
| name: "macOS" | |
| filename: "test-results-macos.json" | |
| steps: | |
| - name: "Checkout" | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 # Full history for better caching | |
| - name: "Setup .NET SDK" | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| dotnet-version: | | |
| 8.0.x | |
| 9.0.x | |
| - name: "Setup Node.js" | |
| if: runner.os == 'Linux' | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '22' | |
| - name: "Install AWS CDK CLI" | |
| if: runner.os == 'Linux' | |
| run: npm install -g [email protected] | |
| - name: "Cache NuGet packages" | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ runner.os == 'Windows' && format('{0}\.nuget\packages', github.workspace) || format('{0}/.nuget/packages', github.workspace) }} | |
| key: ${{ runner.os }}-nugetv2-${{ hashFiles('**/Directory.Packages.props') }}-${{ hashFiles('**/*.csproj') }}-${{ hashFiles('**/packages.lock.json') }} | |
| restore-keys: | | |
| ${{ runner.os }}-nugetv2- | |
| - name: "Build" | |
| run: dotnet build --configuration Release | |
| - name: "Run Unit Tests" | |
| uses: ./.github/actions/run-dotnet-tests | |
| with: | |
| project-path: ${{ env.UNIT_TEST_PROJECT_PATH }} | |
| results-dir: ${{ runner.os == 'Windows' && format('{0}\unit', env.BASE_TEST_RESULTS_DIR) || format('{0}/unit', env.BASE_TEST_RESULTS_DIR) }} | |
| configuration: "Release" | |
| - name: "Run Integration Tests" | |
| if: runner.os == 'Linux' | |
| uses: ./.github/actions/run-dotnet-tests | |
| with: | |
| project-path: ${{ env.INTEGRATION_TEST_PROJECT_PATH }} | |
| results-dir: ${{ runner.os == 'Windows' && format('{0}\integration', env.BASE_TEST_RESULTS_DIR) || format('{0}/integration', env.BASE_TEST_RESULTS_DIR) }} | |
| configuration: "Release" | |
| - name: "Publish Test Results" | |
| id: test-results | |
| uses: dorny/test-reporter@v1 | |
| if: success() || failure() | |
| with: | |
| name: "Test Results (${{ matrix.name }})" | |
| path: "${{ env.BASE_TEST_RESULTS_DIR }}/**/*.trx" | |
| reporter: "dotnet-trx" | |
| path-replace-backslashes: true | |
| fail-on-error: true | |
| max-annotations: 50 | |
| - name: "Update Test Results Badge" | |
| if: always() && github.event_name == 'push' && github.ref == 'refs/heads/master' # Only update badge on master push | |
| continue-on-error: true # Don't fail workflow if badge update fails | |
| uses: ./.github/actions/update-test-badge | |
| with: | |
| platform: ${{ matrix.name }} | |
| gist_id: ${{ env.BADGE_GIST_ID }} | |
| filename: ${{ matrix.filename }} | |
| gist_token: ${{ secrets.GIST_SECRET }} | |
| test_passed: ${{ steps.test-results.outputs.passed || 0 }} | |
| test_failed: ${{ steps.test-results.outputs.failed || 0 }} | |
| test_skipped: ${{ steps.test-results.outputs.skipped || 0 }} | |
| test_url_html: ${{ steps.test-results.outputs.url_html || '' }} | |
| commit_sha: ${{ github.sha }} | |
| run_id: ${{ github.run_id }} | |
| repository: ${{ github.repository }} | |
| server_url: ${{ github.server_url }} | |
| - name: "Upload Test Artifacts" | |
| uses: actions/upload-artifact@v4 | |
| if: failure() | |
| with: | |
| name: test-results-${{ matrix.name }} | |
| path: | | |
| ${{ env.BASE_TEST_RESULTS_DIR }}/**/* | |
| retention-days: 7 | |
| continuous-deployment: | |
| name: "Continuous Deployment" | |
| runs-on: ubuntu-22.04 | |
| needs: build-and-test | |
| if: | | |
| github.repository == 'localstack-dotnet/dotnet-aspire-for-localstack' && | |
| ((github.event_name == 'push' && github.ref == 'refs/heads/master') || | |
| (github.event_name == 'pull_request' && startsWith(github.head_ref, 'feature/'))) | |
| env: | |
| NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - name: "Checkout" | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: "Setup .NET SDK" | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| dotnet-version: | | |
| 8.0.x | |
| 9.0.x | |
| - name: "Cache NuGet packages" | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ github.workspace }}/.nuget/packages | |
| key: ${{ runner.os }}-nugetv2-${{ hashFiles('**/Directory.Packages.props') }}-${{ hashFiles('**/*.csproj') }}-${{ hashFiles('**/packages.lock.json') }} | |
| restore-keys: | | |
| ${{ runner.os }}-nugetv2- | |
| - name: "Restore Dependencies" | |
| run: dotnet restore | |
| - name: "Build" | |
| run: dotnet build --configuration Release --no-restore | |
| - name: "Run Unit Tests" | |
| run: dotnet test ./tests/Aspire.Hosting.LocalStack.Unit.Tests/Aspire.Hosting.LocalStack.Unit.Tests.csproj --verbosity normal --configuration Release --no-build | |
| - name: "Setup GitHub Packages Authentication" | |
| run: | | |
| echo "🔐 Adding GitHub Packages authentication..." | |
| dotnet nuget add source https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json \ | |
| --name github-packages \ | |
| --username ${{ github.actor }} \ | |
| --password ${{ secrets.GITHUB_TOKEN }} \ | |
| --store-password-in-clear-text | |
| - name: "Determine Package Version" | |
| id: version | |
| run: | | |
| # Extract base version from project file | |
| PROJECT_FILE="src/Aspire.Hosting.LocalStack/Aspire.Hosting.LocalStack.csproj" | |
| BASE_VERSION=$(grep -oP '<Version>\K[^<]+' "$PROJECT_FILE") | |
| if [ -z "$BASE_VERSION" ]; then | |
| echo "❌ Could not extract version from $PROJECT_FILE" | |
| exit 1 | |
| fi | |
| echo "📦 Base Version: $BASE_VERSION" | |
| # Generate build metadata | |
| RUN_NUMBER="${{ github.run_number }}" # monotonic | |
| COMMIT_SHA=$(echo "${{ github.sha }}" | cut -c1-8) | |
| if [[ "${{ github.event_name }}" == "pull_request" ]]; then | |
| # Feature branches: 9.5.0-feature-name.buildnumber (NuGet SemVer 2.0.0) | |
| BRANCH_NAME="${{ github.head_ref }}" | |
| # Sanitize branch name for use in version and artifact names | |
| SAFE_BRANCH=$(echo "$BRANCH_NAME" | sed 's/[^a-zA-Z0-9]/-/g' | tr '[:upper:]' '[:lower:]') | |
| VERSION="${BASE_VERSION}-${SAFE_BRANCH}.${RUN_NUMBER}" | |
| ARTIFACT_SUFFIX="${SAFE_BRANCH}-${RUN_NUMBER}" | |
| else | |
| # Master CI builds: 9.5.0-ci.buildnumber (NuGet SemVer 2.0.0 pre-release) | |
| VERSION="${BASE_VERSION}-ci.${RUN_NUMBER}" | |
| ARTIFACT_SUFFIX="ci-${RUN_NUMBER}" | |
| fi | |
| echo "version=${VERSION}" >> $GITHUB_OUTPUT | |
| echo "artifact_suffix=${ARTIFACT_SUFFIX}" >> $GITHUB_OUTPUT | |
| echo "📦 Final Package Version: ${VERSION}" | |
| echo "📦 Artifact Suffix: ${ARTIFACT_SUFFIX}" | |
| - name: "Pack NuGet Package" | |
| run: | | |
| echo "📦 Packing LocalStack.Aspire.Hosting package..." | |
| dotnet pack src/Aspire.Hosting.LocalStack/Aspire.Hosting.LocalStack.csproj \ | |
| --configuration Release \ | |
| --no-build \ | |
| --output ./artifacts \ | |
| /p:PackageVersion=${{ steps.version.outputs.version }} \ | |
| /p:PackageId=LocalStack.Aspire.Hosting | |
| - name: "Push to GitHub Packages" | |
| run: | | |
| echo "📦 Publishing to GitHub Packages..." | |
| dotnet nuget push ./artifacts/*.nupkg \ | |
| --source github-packages \ | |
| --api-key ${{ secrets.GITHUB_TOKEN }} \ | |
| --skip-duplicate | |
| - name: "Upload Package Artifacts" | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: "packages-${{ steps.version.outputs.artifact_suffix }}" | |
| path: | | |
| artifacts/*.nupkg | |
| artifacts/*.snupkg | |
| retention-days: 7 | |
| - name: "Generate Build Summary" | |
| run: | | |
| echo "📦 Generating build summary..." | |
| echo "## 📦 Package Build Summary" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Package**: LocalStack.Aspire.Hosting" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Version**: ${{ steps.version.outputs.version }} (NuGet SemVer 2.0.0)" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Branch/Ref**: ${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Commit**: ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Published to**: GitHub Packages" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Artifact**: packages-${{ steps.version.outputs.artifact_suffix }}" >> $GITHUB_STEP_SUMMARY |