Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
cc3496c
add durable task scheduler support and runtime parity
torosent Sep 9, 2026
2b8601e
refactor: remove redundant runtime and test complexity
torosent Sep 9, 2026
05f43ef
fix: address orchestration and analyzer review feedback
torosent Sep 9, 2026
5c5ea17
remove unsupported DTS administrative APIs
torosent Sep 10, 2026
a181201
restore remote trace context for activity instrumentation
torosent Sep 10, 2026
2a7e3a0
add validated core DTS workflow samples
torosent Sep 10, 2026
f2eafbe
cover stateful workflow and worker feature families
torosent Sep 10, 2026
884e457
add service integration samples and executable E2E catalogue
torosent Sep 10, 2026
d3341ac
Merge supported SDK base and activity trace propagation
torosent Sep 10, 2026
16b9643
validate stored compression independently of HTTP decoding
torosent Sep 10, 2026
c0fde4e
simplify samples to a flat named catalogue
torosent Sep 10, 2026
ad6daf9
remove sample-specific maintenance opt-in requirements
torosent Sep 10, 2026
1a3db83
fix: restore rewind with Python-aligned recovery
torosent Sep 10, 2026
681ba07
docs: remove task-hub lifecycle caveats
torosent Sep 10, 2026
19c7829
Merge rewind support into DTS feature samples
torosent Sep 10, 2026
afa500c
Use only V2 entity work items
torosent Sep 10, 2026
c18ff4a
Remove legacy chunking note from DTS feature matrix
torosent Sep 10, 2026
708181c
fix: preserve carryover payloads and mixed version routes
torosent Sep 10, 2026
36f34a4
fix: clear sample validation lint blockers
torosent Sep 10, 2026
298ff17
fix: retain export and maintenance sample error causes
torosent Sep 10, 2026
332f513
fix: unwind canceled entity acquisitions across replay
torosent Sep 10, 2026
e6eefbd
fix: stream history exports with bounded atomic uploads
torosent Sep 10, 2026
3e8cc74
fix: guard transport retries and orchestration dispatch
torosent Sep 10, 2026
cbfd2b6
fix: bound current-or-older work item filters
torosent Sep 10, 2026
6deb2b3
fix: reject unsafe rewind histories before replacement
torosent Sep 14, 2026
674dcb6
fix: order sample cleanup and tolerate delayed timers
torosent Sep 14, 2026
69cc5bd
docs: mark the Go SDK as beta
torosent Sep 14, 2026
a63a25c
docs: remove numbered feature group wording
torosent Sep 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
101 changes: 71 additions & 30 deletions .github/workflows/pr-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,55 +15,61 @@ on:

env:
# Configure protoc and go grpc plugin
PROTOC_VERSION: "25.x"
PROTOC_GEN_GO: "v1.30"
PROTOC_GEN_GO_GRPC: "v1.3"
PROTOC_VERSION: "36.x"
PROTOC_GEN_GO: "v1.36.12"
PROTOC_GEN_GO_GRPC: "v1.6.2"

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
runs-on: ubuntu-latest
timeout-minutes: 45
strategy:
fail-fast: false
matrix:
go-version: [ '1.24.x', '1.23.x' ]
include:
- go-version: '1.25.x'
test-kind: coverage
test-command: >-
go test ./... -count=1 -timeout=20m
-coverpkg=./api,./task,./client,./durabletaskscheduler,./exporthistory,./payload,./internal/contextprop,./internal/failure,./internal/grpcerrors,./internal/helpers,./internal/historyconv,./internal/largepayload,./internal/tagcodec
- go-version: '1.27.x'
test-kind: race
test-command: go test -race ./... -count=1 -timeout=30m

# Boot up a local, clean postgres instance for the postgres tests
# Boot up the local Durable Task Scheduler emulator and Azurite, which back
# the end-to-end and blob storage tests.
services:
# Label used to access the service container
postgres:
# Docker Hub image
image: postgres:16
dts:
image: mcr.microsoft.com/dts/dts-emulator:latest@sha256:361323065a608d605f9d3ae56b854eb11f1c47fcc16845a37f948f03ca9c5fac
env:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: postgres
# Set health checks to wait until postgres has started
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
DTS_TASK_HUB_NAMES: default
ports:
# Maps tcp port 5432 on service container to the host
- 5432:5432

- 8080:8080
- 8082:8082

azurite:
image: mcr.microsoft.com/azure-storage/azurite:3.37.0
ports:
- 10000:10000

steps:
# Checks-out your repository under $GITHUB_WORKSPACE
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 1

- name: Setup Go environment
uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5.6.0
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
with:
go-version: ${{ matrix.go-version }}

- name: Install dependencies
run: go get .
- name: Download module dependencies
run: go mod download

- name: Install Protoc
uses: arduino/setup-protoc@c65c819552d16ad3c9b72d9dfd5ba5237b9c906b # v3.0.0
uses: arduino/setup-protoc@f4d5893b897028ff5739576ea0409746887fa536 # v3.0.0
with:
version: ${{ env.PROTOC_VERSION }}

Expand All @@ -78,10 +84,45 @@ jobs:
- name: Run go vet
run: go vet ./...

- name: Build and test orchestratorvet
run: |
cd cmd/orchestratorvet
go mod download
go test ./...
go build -o "$RUNNER_TEMP/orchestratorvet" .

- name: Check orchestrators for replay hazards
run: |
go vet -vettool="$RUNNER_TEMP/orchestratorvet" ./...

- name: Build distributed tracing sample module
working-directory: samples/distributedtracing
run: |
go mod download
go test ./...

- name: Run golangci-lint
uses: golangci/golangci-lint-action@9fae48acfc02a90574d7c304a1758ef9895495fa # v7.0.1
uses: golangci/golangci-lint-action@d583c34f0599d37dbac4a198b9c83201be380893 # v9.3.0
with:
version: v2.13.2

- name: Wait for service emulators
run: |
curl --fail --retry 30 --retry-delay 1 --retry-all-errors http://127.0.0.1:8082/
timeout 60 bash -c 'until </dev/tcp/127.0.0.1/8080; do sleep 1; done'
timeout 60 bash -c 'until </dev/tcp/127.0.0.1/10000; do sleep 1; done'

- name: Run integration tests
# The race run also executes every test on the latest Go version, so only
# the minimum supported Go version needs a separate non-race execution.
#
# AZURITE_CONNECTION_STRING is supplied by the repository variable of the
# same name so no account key is stored in the repository. The Azurite
# tests skip themselves when it is unset. Populate it with Azurite's
# well-known development credentials:
# https://learn.microsoft.com/azure/storage/common/storage-use-azurite#well-known-storage-account-and-key
- name: Run full repository ${{ matrix.test-kind }} tests
env:
POSTGRES_ENABLED: "true"
run: go test ./tests/... -coverpkg ./api,./task,./client,./backend/...,./internal/helpers
DTS_EMULATOR_ENDPOINT: "http://127.0.0.1:8080"
DTS_TASK_HUB: "default"
AZURITE_CONNECTION_STRING: ${{ vars.AZURITE_CONNECTION_STRING }}
run: ${{ matrix.test-command }}
96 changes: 96 additions & 0 deletions .github/workflows/samples-e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
name: Sample E2E

on:
pull_request:
paths:
- "samples/**"
- "tests/samples/**"
- "api/**"
- "task/**"
- "client/**"
- "durabletaskscheduler/**"
- "exporthistory/**"
- "payload/**"
- "internal/**"
- "cmd/orchestratorvet/**"
- "go.mod"
- "go.sum"
- ".github/workflows/samples-e2e.yml"
push:
branches: [main]
workflow_dispatch:

permissions:
contents: read

jobs:
samples:
runs-on: ubuntu-latest
timeout-minutes: 25
env:
DTS_CONNECTION_STRING: "Endpoint=http://127.0.0.1:8080;TaskHub=default;Authentication=None"
DTS_SAMPLES_E2E: "1"
DTS_SAMPLES_RACE: "1"
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
with:
go-version: "1.25.x"

- name: Start isolated DTS
run: |
docker run -d --name sample-dts \
-p 127.0.0.1:8080:8080 -p 127.0.0.1:8082:8082 \
-e DTS_TASK_HUB_NAMES=default \
mcr.microsoft.com/dts/dts-emulator:latest@sha256:361323065a608d605f9d3ae56b854eb11f1c47fcc16845a37f948f03ca9c5fac
curl --fail --retry 30 --retry-delay 1 --retry-all-errors http://127.0.0.1:8082/ >/dev/null

- name: Start isolated blob storage
shell: bash
run: |
key="$(openssl rand -base64 32)"
echo "::add-mask::$key"
export AZURITE_ACCOUNTS="sampleacct:$key"
docker run -d --name sample-azurite \
-p 127.0.0.1:10000:10000 -e AZURITE_ACCOUNTS \
mcr.microsoft.com/azure-storage/azurite:3.37.0
connection="DefaultEndpointsProtocol=http;AccountName=sampleacct;AccountKey=$key;BlobEndpoint=http://127.0.0.1:10000/sampleacct;"
echo "::add-mask::$connection"
printf 'AZURE_STORAGE_CONNECTION_STRING=%s\n' "$connection" >> "$GITHUB_ENV"
printf 'DTS_SAMPLE_ALLOW_INSECURE_STORAGE=1\nDTS_SAMPLE_ISOLATED_TASKHUB=1\n' >> "$GITHUB_ENV"
timeout 60 bash -c 'until </dev/tcp/127.0.0.1/10000; do sleep 1; done'

- name: Start trace collector
run: |
mkdir -p "$RUNNER_TEMP/sample-traces"
docker run -d --name sample-collector \
--user "$(id -u):$(id -g)" \
-p 127.0.0.1:4318:4318 \
-e OTEL_CAPTURE_FILE=/output/traces.json \
-v "$GITHUB_WORKSPACE/samples/distributedtracing/otel-collector-config.yaml:/etc/otelcol-contrib/config.yaml:ro" \
-v "$RUNNER_TEMP/sample-traces:/output" \
otel/opentelemetry-collector-contrib:0.160.0
printf 'OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:4318\nOTEL_CAPTURE_FILE=%s/sample-traces/traces.json\n' \
"$RUNNER_TEMP" >> "$GITHUB_ENV"
timeout 60 bash -c 'until </dev/tcp/127.0.0.1/4318; do sleep 1; done'

- name: Execute and verify sample entry points
# Azure authentication and hub-wide maintenance run separately on approved targets.
run: >-
go test ./tests/samples -run 'TestSampleCatalogue|TestSamplesE2E'
-skip '^TestSamplesE2E/(authentication|serviceoperations)$'
-count=1 -timeout=20m -v

- name: Service diagnostics
if: failure()
run: |
docker logs sample-dts
if docker inspect sample-azurite >/dev/null 2>&1; then docker logs sample-azurite; fi
if docker inspect sample-collector >/dev/null 2>&1; then docker logs sample-collector; fi

- name: Stop owned services
if: always()
run: |
for service in sample-dts sample-azurite sample-collector; do
if docker inspect "$service" >/dev/null 2>&1; then docker rm -f "$service"; fi
done
9 changes: 6 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,11 @@
# Dependency directories (remove the comment below to include it)
# vendor/

# sqlite databases generated by testing
*.sqlite3
__debug_bin
/cmd/orchestratorvet/orchestratorvet
/samples/distributedtracing/distributedtracing
/.tmp/

.idea/
.idea/
# Local build output, e.g. the orchestratorvet analyzer binary
/bin/
1 change: 0 additions & 1 deletion .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,3 @@ linters:
exclusions:
paths:
- internal/protos
- tests/mocks
8 changes: 0 additions & 8 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,6 @@
"request": "attach",
"mode": "local",
"processId": 0
},
{
"name": "Launch Main Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}",
"console": "integratedTerminal"
}
]
}
4 changes: 2 additions & 2 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"go.testFlags": [
"-coverpkg=../api,../task,../client,../backend/...,../internal/helpers"
"-coverpkg=../api,../task,../client,../durabletaskscheduler,../exporthistory,../payload,../internal/helpers"
]
}
}
Loading
Loading