-
Notifications
You must be signed in to change notification settings - Fork 1
feat: add durable execution support #383
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 52 commits
Commits
Show all changes
61 commits
Select commit
Hold shift + click to select a range
cc6fd19
docs: add durable execution architecture decisions
j-d-ha 291ee96
docs: clarify architecture decision records
j-d-ha f457075
docs: add examples to durable execution ADRs
j-d-ha 5e416f1
docs: simplify durable execution ADRs
j-d-ha 9f66adc
docs: add durable pipeline architecture decision
j-d-ha 297e52d
docs: add durable execution architecture decisions
j-d-ha e2e515e
docs: clarify architecture decision records
j-d-ha cdc80ab
docs: add examples to durable execution ADRs
j-d-ha 02295b6
docs: simplify durable execution ADRs
j-d-ha c9e9524
docs: pressure-test durable pipeline ADR
j-d-ha 8718d2c
docs: clarify durable envelope ownership
j-d-ha 41e8a45
docs: accept durable pipeline architecture decision
j-d-ha 23e4f84
chore(deps): pin durable execution packages
j-d-ha e593dd5
feat(core): expose invocation serializer
j-d-ha 3358bb3
feat(core): enforce durable terminal lifecycle
j-d-ha e071986
docs: finalize durable handler contract
j-d-ha c71342c
feat: add durable execution package
j-d-ha 3ef1467
feat: add durable handler API
j-d-ha c7c84b7
feat(source-generators): recognize durable handlers
j-d-ha 48a1000
feat(source-generators): validate durable handlers
j-d-ha f09a991
feat(source-generators): emit durable adapters
j-d-ha 8718423
test(source-generators): expand durable coverage
j-d-ha cdc0e00
test(core): verify durable terminal lifecycle
j-d-ha 2f81fab
test(testing): add durable host integration
j-d-ha a32943f
test(aot): add durable publish smoke
j-d-ha 0eab077
test(durable): verify public runtime APIs
j-d-ha 6afab16
test(durable): cover workflow replay semantics
j-d-ha 975a876
docs(examples): add durable execution sample
j-d-ha b3febc5
docs(durable): document package usage
j-d-ha 7071841
test(packaging): add durable consumer matrix
j-d-ha 05e80ab
docs: add durable execution guide
j-d-ha 495f902
docs(durable): add deployment recipes
j-d-ha deecdbf
docs(decisions): defer durable templates
j-d-ha 28283d8
ci: isolate durable package releases
j-d-ha 5cb9889
chore(deps): update validation toolchain
j-d-ha e32641b
test(durable): support debug fallback assertion
j-d-ha 8315958
chore(deps): update package versions in shared props file
j-d-ha 54b7570
Merge branch 'main' into feat/add-durable-function-support
j-d-ha 6eca813
fix: address durable execution review feedback
j-d-ha f72d8f4
fix(tests): suppress NU1608 warning for AutoFixture.AutoNSubstitute
j-d-ha 952ecda
chore(deps): fix formatting in shared props file
j-d-ha 7134d2f
fix(tests): add null-forgiving operator to suppress nullable warnings
j-d-ha edaec83
test(source-generators): add multi-targeting support and conditional β¦
j-d-ha 36e4b9e
test(tests): guard compatibility package references
j-d-ha e6788a4
fix(tests): adjust lambda middleware formatting in unit test
j-d-ha e179845
refactor(durable)!: simplify durable handler adapter
j-d-ha 1119938
test(aot): root libraries for publish analysis
j-d-ha 309386b
refactor(durable)!: relax handler signature validation
j-d-ha f8f9cfb
fix(durable): bind cancellation tokens and reject duplicate events
j-d-ha 00bf154
fix(source-generators): harden durable handler validation
j-d-ha 795c63c
fix(source-generators): harden durable handler adapters
j-d-ha 1dae505
fix(durable): address review findings
j-d-ha bada7a9
ci: restore DevOps template workflows
j-d-ha fde51be
ci(github): document DevOps template policy
j-d-ha c284488
ci: unify package releases
j-d-ha ebe2365
test(tests): restore multi-target integration coverage
j-d-ha 88c7aa7
ci(github): stabilize required PR build check
j-d-ha 11b2f55
ci(github): remove duplicate PR build
j-d-ha a228cb8
docs: preserve contributing formatting
j-d-ha c442e2e
feat(caveman-compress): add natural language compression tools
j-d-ha add3b43
ci(github): upgrade DevOps template workflows
j-d-ha File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| tests/MinimalLambda.SourceGenerators.UnitTests/Snapshots/*.verified.cs whitespace=-trailing-space |
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
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
|
j-d-ha marked this conversation as resolved.
|
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
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
|
j-d-ha marked this conversation as resolved.
Outdated
j-d-ha marked this conversation as resolved.
Outdated
|
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,171 @@ | ||
| name: Publish Durable Release | ||
|
|
||
| on: | ||
| release: | ||
| types: [published] | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: | ||
| preflight: | ||
| if: startsWith(github.event.release.tag_name, 'durable-v') | ||
| runs-on: ubuntu-latest | ||
| outputs: | ||
| version: ${{ steps.version.outputs.version }} | ||
| steps: | ||
| - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 | ||
| - name: Guard and resolve durable release tag | ||
| id: version | ||
| env: | ||
| RELEASE_TAG: ${{ github.event.release.tag_name }} | ||
| shell: bash | ||
| run: | | ||
| python3 scripts/validate-release-artifacts.py \ | ||
| --lane durable \ | ||
| --tag "$RELEASE_TAG" \ | ||
| --tag-only | ||
| echo "version=${RELEASE_TAG#durable-v}" >> "$GITHUB_OUTPUT" | ||
|
|
||
| build: | ||
| needs: preflight | ||
| if: startsWith(github.event.release.tag_name, 'durable-v') | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 | ||
| - uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5 | ||
| with: | ||
| dotnet-version: 11.0.100-preview.6.26359.118 | ||
| - name: Restore durable project | ||
| run: dotnet restore src/MinimalLambda.DurableExecution/MinimalLambda.DurableExecution.csproj | ||
| - name: Build durable project | ||
| run: >- | ||
| dotnet build src/MinimalLambda.DurableExecution/MinimalLambda.DurableExecution.csproj | ||
| --configuration Release | ||
| --no-restore | ||
| -p:Version="${{ needs.preflight.outputs.version }}" | ||
| -p:InformationalVersion="${{ needs.preflight.outputs.version }}" | ||
| - name: Pack durable project | ||
| run: >- | ||
| dotnet pack src/MinimalLambda.DurableExecution/MinimalLambda.DurableExecution.csproj | ||
| --configuration Release | ||
| --no-build | ||
| --output artifacts | ||
| -p:Version="${{ needs.preflight.outputs.version }}" | ||
| -p:InformationalVersion="${{ needs.preflight.outputs.version }}" | ||
| - name: Guard durable release manifest | ||
| env: | ||
| RELEASE_TAG: ${{ github.event.release.tag_name }} | ||
| run: >- | ||
| python3 scripts/validate-release-artifacts.py | ||
| --lane durable | ||
| --tag "$RELEASE_TAG" | ||
| --artifacts artifacts | ||
| - name: Restore package-only consumer from local durable artifact and published core minimum | ||
| env: | ||
| NUGET_PACKAGES: ${{ runner.temp }}/durable-pre-push-packages | ||
| shell: bash | ||
| run: | | ||
| set -euo pipefail | ||
| core_version=$(sed -n 's:.*<MinimalLambdaMinimumVersion>\([^<]*\)</MinimalLambdaMinimumVersion>.*:\1:p' src/MinimalLambda.DurableExecution/MinimalLambda.DurableExecution.csproj) | ||
| test -n "$core_version" | ||
| consumer="$RUNNER_TEMP/durable-pre-push-consumer" | ||
| mkdir "$consumer" | ||
| cd "$consumer" | ||
| dotnet new classlib --framework net10.0 --no-restore | ||
| dotnet add package MinimalLambda --version "[$core_version]" --no-restore | ||
| dotnet add package MinimalLambda.DurableExecution --version "[${{ needs.preflight.outputs.version }}]" --no-restore | ||
| dotnet restore --no-cache \ | ||
| --source "$GITHUB_WORKSPACE/artifacts" \ | ||
| --source https://api.nuget.org/v3/index.json | ||
| durable_version="${{ needs.preflight.outputs.version }}" | ||
| metadata="$NUGET_PACKAGES/minimallambda.durableexecution/${durable_version,,}/.nupkg.metadata" | ||
| python3 - "$metadata" "$GITHUB_WORKSPACE/artifacts" <<'PY' | ||
| import json | ||
| import pathlib | ||
| import sys | ||
|
|
||
| metadata = json.loads(pathlib.Path(sys.argv[1]).read_text()) | ||
| actual = pathlib.Path(metadata["source"]).resolve() | ||
| expected = pathlib.Path(sys.argv[2]).resolve() | ||
| if actual != expected: | ||
| raise SystemExit(f"durable package restored from {actual}, expected local feed {expected}") | ||
| PY | ||
| - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 | ||
| with: | ||
| name: durable-nuget-packages | ||
| path: | | ||
| artifacts/*.nupkg | ||
| artifacts/*.snupkg | ||
| if-no-files-found: error | ||
|
|
||
| push: | ||
| needs: [preflight, build] | ||
| if: startsWith(github.event.release.tag_name, 'durable-v') | ||
| runs-on: ubuntu-latest | ||
| permissions: | ||
| id-token: write | ||
| contents: read | ||
| steps: | ||
| - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 | ||
| - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 | ||
| with: | ||
| name: durable-nuget-packages | ||
| path: artifacts | ||
| - name: Recheck manifest and reject existing NuGet version | ||
| env: | ||
| RELEASE_TAG: ${{ github.event.release.tag_name }} | ||
| run: >- | ||
| python3 scripts/validate-release-artifacts.py | ||
| --lane durable | ||
| --tag "$RELEASE_TAG" | ||
| --artifacts artifacts | ||
| --check-nuget | ||
| - name: Exchange GitHub OIDC token for temporary NuGet key | ||
| uses: NuGet/login@8d196754b4036150537f80ac539e15c2f1028841 # v1 | ||
| id: nuget-login | ||
| with: | ||
| user: ${{ secrets.NUGET_USER }} | ||
| - name: Publish durable package and symbols without duplicate suppression | ||
| env: | ||
| NUGET_API_KEY: ${{ steps.nuget-login.outputs.NUGET_API_KEY }} | ||
| shell: bash | ||
| run: | | ||
| set -euo pipefail | ||
| # dotnet nuget push discovers and publishes adjacent .snupkg automatically. | ||
| for package in artifacts/*.nupkg; do | ||
| dotnet nuget push "$package" \ | ||
| --api-key "$NUGET_API_KEY" \ | ||
| --source https://api.nuget.org/v3/index.json | ||
| done | ||
|
|
||
| validate-published-pair: | ||
| needs: [preflight, push] | ||
| if: startsWith(github.event.release.tag_name, 'durable-v') | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 | ||
| - uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5 | ||
| with: | ||
| dotnet-version: 11.0.100-preview.6.26359.118 | ||
| - name: Restore exact published core and durable pair | ||
| shell: bash | ||
| run: | | ||
| set -euo pipefail | ||
| core_version=$(sed -n 's:.*<MinimalLambdaMinimumVersion>\([^<]*\)</MinimalLambdaMinimumVersion>.*:\1:p' src/MinimalLambda.DurableExecution/MinimalLambda.DurableExecution.csproj) | ||
| test -n "$core_version" | ||
| consumer="$RUNNER_TEMP/durable-published-consumer" | ||
| mkdir "$consumer" | ||
| cd "$consumer" | ||
| dotnet new classlib --framework net10.0 --no-restore | ||
| dotnet add package MinimalLambda --version "[$core_version]" --no-restore | ||
| dotnet add package MinimalLambda.DurableExecution --version "[${{ needs.preflight.outputs.version }}]" --no-restore | ||
| for attempt in {1..10}; do | ||
| if dotnet restore --no-cache --source https://api.nuget.org/v3/index.json; then | ||
| exit 0 | ||
| fi | ||
| if [[ "$attempt" == 10 ]]; then | ||
| exit 1 | ||
| fi | ||
| sleep 30 | ||
| done |
|
j-d-ha marked this conversation as resolved.
j-d-ha marked this conversation as resolved.
|
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
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.