* Adds activity execution call stack support Implements a call stack mechanism to track the execution chain, enabling visibility into the invocation hierarchy. Introduces new fields to scheduling models and runtime contexts to store call stack information. Includes EF Core migrations for various database providers to support new columns in `ActivityExecutionRecords`. Provides an API to query and reconstruct the call stack for a given activity execution. * Refactor: Replace `PagedCallStackResult` with `Page<T>` for execution chain pagination * Remove ambient scheduling scope logic and related methods Simplifies scheduling logic by removing ambient scope mechanisms, refactoring scheduling context handling, and updating affected classes accordingly. * Add `GetCallStackAsync` to `IActivityExecutionsApi` for querying activity execution call stack * Add new properties to `ActivityExecutionRecord` for scheduling and execution tracking Introduce fields for aggregated fault count, scheduling context, workflow instance details, and call stack depth to enhance execution monitoring and debugging capabilities. * Add call stack visualization for activity executions Introduced components and models to display a call stack for activity executions in the Workflow Instance Viewer. This includes UI elements for call stack rendering, error handling, and data integration with activity execution records. * Remove obsolete ambient scheduling properties from WorkflowExecutionContext * Fix infinite loop issues in activity execution chain traversal Added cycle detection using a `HashSet` to prevent infinite loops when traversing activity execution chains in multiple storage implementations. Updated unit tests to validate correct handling of circular references and chain traversal. * Refactor activity execution chain retrieval logic Centralized the `GetExecutionChainAsync` method into an extension class to streamline and unify its implementation across stores. Removed redundant implementations from individual stores and updated interfaces to utilize the new extension method. This reduces code duplication and simplifies future maintenance. * Add CallStackDepth property to activity contexts Integrated the `CallStackDepth` property into `ActivityExecutionContext`, `ActivityExecutionContextState`, and related classes to track and manage the call stack depth of activity executions. Removed obsolete depth calculation logic to streamline the process. * Add unit tests for call stack depth calculations and persistence - Add `WorkflowExecutionContextTests` to verify correct calculation of call stack depth during activity execution. - Add `WorkflowStateExtractorTests` to ensure call stack depth is preserved during state extraction and application. * Update src/modules/Elsa.Workflows.Api/Endpoints/ActivityExecutions/GetCallStack/Endpoint.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/modules/Elsa.Workflows.Api/Endpoints/ActivityExecutions/GetCallStack/Endpoint.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Enhance activity execution handling with ID filter and task completion logic - Implement `ActivityExecutionRecordFilter` for precise query matching by ID. - Add await logic for task completion in command handler middleware. * Add missing indexes for call stack columns in V3_7 migrations (#7250) * Initial plan * Add missing indexes for call stack columns in all provider migrations Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Optimize migrations by creating columns with correct indexable types Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add unit tests for ActivityExecutionStoreExtensions - Introduce tests for `GetExecutionChainAsync` covering scenarios of empty results, single records, multi-level chain traversal, workflow boundary constraints, pagination, and circular references. * Refactor tests for `ActivityExecutionStoreExtensions` - Replace mock setup with `CreateStore` helper for clean and clear test arrangements. - Remove unused imports and clean up test setup for improved readability and maintenance. * Remove unused imports from ActivityExecutionLogStore in Elsa.Persistence.EFCore module. * Removes obsolete planning document Removes the activity execution call stack planning document as the feature has been implemented. * Remove DefaultActivityExecutionMapperTests - Deleted `DefaultActivityExecutionMapperTests.cs` as the test class is no longer in use and redundant. * Address review feedback: Fix corrupted test, Oracle migrations, and call stack depth calculation (#7272) * Initial plan * Fix corrupted DefaultActivityExecutionMapperTests.cs test file Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix Oracle migration snapshot to use NCLOB for large text fields Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Optimize GetExecutionChainAsync to avoid loading all workflow instance records Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix CallStackDepth calculation to support cross-workflow invocations - Add SchedulingCallStackDepth to ActivityInvocationOptions - Update WorkflowExecutionContext to use provided depth when scheduling context not found - Remove problematic test that reveals pre-existing bug with duplicate contexts Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Improve documentation for CallStackDepth calculation Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add WorkflowStateExtractor to ActivityTestFixture services * Refactor `DefaultActivityExecutionMapperTests` with `ActivityTestFixture` and add project reference for shared testing utilities. * Propagate SchedulingCallStackDepth through cross-workflow invocation chain (#7273) * Initial plan * Add SchedulingCallStackDepth propagation through cross-workflow invocation chain Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add unit tests for CallStackDepth propagation across workflow boundaries Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Initial plan (#7274) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * Reduce NVARCHAR2 column sizes in Oracle migrations to optimize storage and improve performance. * Change column types to NCLOB for large text fields in Oracle migrations to enhance data storage capacity. * Update GitHub Actions to use .NET 10.x and refactor setup classes for consistency * Improve test project detection in GitHub Actions by handling non-csproj files and updating project sorting mechanism. * Enhance GitHub Actions to display .NET environment info and enforce .NET 10 toolchain for test execution. * Update GitHub Actions to use .NET SDK 10.0.1xx and enforce its usage for builds and tests. * Refine GitHub Actions workflow by narrowing test project search to the `test/unit` directory and removing unnecessary script checks. * Remove redundant build step from GitHub Actions workflow. * Enhance GitHub Actions workflow by adding multiple test directories and handling ignored failed sources in .NET restore. --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com>
237 lines
7.9 KiB
YAML
237 lines
7.9 KiB
YAML
name: Packages
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
push:
|
|
branches:
|
|
- 'main'
|
|
- 'bug/*'
|
|
- 'perf/*'
|
|
- 'patch/*'
|
|
- 'feat/*'
|
|
- 'enh/*'
|
|
- 'rc/*'
|
|
- 'develop/*'
|
|
- 'release/*'
|
|
- 'codex/*'
|
|
release:
|
|
types: [prereleased, published]
|
|
|
|
env:
|
|
base_version: '3.7.0'
|
|
feedz_feed_source: 'https://f.feedz.io/elsa-workflows/elsa-3/nuget/index.json'
|
|
nuget_feed_source: 'https://api.nuget.org/v3/index.json'
|
|
|
|
jobs:
|
|
test:
|
|
name: Test with coverage
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 30
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Set up .NET SDK
|
|
uses: actions/setup-dotnet@v4
|
|
with:
|
|
dotnet-version: 10.0.1xx
|
|
|
|
- name: Show .NET info
|
|
run: |
|
|
dotnet --info
|
|
dotnet --list-sdks
|
|
|
|
- name: Cache NuGet packages
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/.nuget/packages
|
|
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props', '**/*.csproj') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-nuget-
|
|
|
|
- name: Restore solution
|
|
run: dotnet restore Elsa.sln --ignore-failed-sources
|
|
|
|
- name: Prepare coverage directory
|
|
run: |
|
|
rm -rf artifacts/coverage
|
|
mkdir -p artifacts/coverage
|
|
|
|
- name: Run tests with coverage
|
|
run: |
|
|
set -euo pipefail
|
|
dotnet --info
|
|
if ! dotnet --version | grep -q '^10\.'; then
|
|
echo "Expected .NET SDK 10.x but got $(dotnet --version)" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Discover test projects across unit/component/integration.
|
|
mapfile -t projects < <(
|
|
find test/unit test/component test/integration \
|
|
-type f -name '*.csproj' -print0 2>/dev/null \
|
|
| xargs -0 -n1 \
|
|
| sort
|
|
)
|
|
|
|
if [ ${#projects[@]} -eq 0 ]; then
|
|
echo "No test projects were found in test/unit, test/component or test/integration." >&2
|
|
exit 1
|
|
fi
|
|
|
|
for project in "${projects[@]}"; do
|
|
echo "Building test project ${project}"
|
|
dotnet build "$project" --configuration Release --framework net10.0
|
|
|
|
echo "Running tests with coverage for ${project}"
|
|
dotnet test "$project" \
|
|
--configuration Release \
|
|
--framework net10.0 \
|
|
--no-build \
|
|
--logger "GitHubActions;report-warnings=false" \
|
|
/p:CollectCoverage=true
|
|
done
|
|
|
|
- name: Dump docker logs on failure
|
|
if: failure()
|
|
run: |
|
|
echo "=== Docker containers ==="
|
|
docker ps -a || true
|
|
echo "=== Docker logs ==="
|
|
for container in $(docker ps -aq); do
|
|
echo "--- Logs for container $container ---"
|
|
docker logs "$container" 2>&1 | tail -100 || true
|
|
done
|
|
|
|
- name: Install ReportGenerator
|
|
run: dotnet tool install -g dotnet-reportgenerator-globaltool
|
|
|
|
- name: Generate HTML coverage report
|
|
run: |
|
|
reportgenerator \
|
|
"-reports:./artifacts/coverage/**/coverage.cobertura.xml" \
|
|
"-targetdir:./artifacts/coverage-report" \
|
|
"-reporttypes:Html;Cobertura;TextSummary" \
|
|
"-verbosity:Info"
|
|
|
|
- name: Upload coverage reports
|
|
if: always()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: coverage-reports
|
|
path: artifacts/coverage
|
|
|
|
- name: Upload Pages artifact
|
|
if: always() && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/'))
|
|
uses: actions/upload-pages-artifact@v3
|
|
with:
|
|
path: './artifacts/coverage-report'
|
|
|
|
build:
|
|
name: Build packages
|
|
needs: test
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 30
|
|
if: ${{ github.event_name != 'pull_request' }}
|
|
steps:
|
|
- name: Extract branch name
|
|
run: |
|
|
BRANCH_NAME=${{ github.ref }} # e.g., refs/heads/main
|
|
BRANCH_NAME=${BRANCH_NAME#refs/heads/} # remove the refs/heads/ prefix
|
|
# Extract the last part after the last slash of the branch name, if any, e.g., feature/issue-123 -> issue-123 and use it as the version prefix.
|
|
PACKAGE_PREFIX=$(echo $BRANCH_NAME | rev | cut -d/ -f1 | rev | tr '_' '-')
|
|
|
|
# If the branch name is main, use the preview version. Otherwise, use the branch name as the version prefix.
|
|
if [[ "${BRANCH_NAME}" == "main" || "${BRANCH_NAME}" =~ ^develop/ || "${BRANCH_NAME}" =~ ^release/ ]]; then
|
|
PACKAGE_PREFIX="preview"
|
|
fi
|
|
|
|
echo "Ref: ${{ github.ref }}"
|
|
echo "Branch name: ${BRANCH_NAME}"
|
|
echo "Package prefix: ${PACKAGE_PREFIX}"
|
|
echo "BRANCH_NAME=${BRANCH_NAME}" >> $GITHUB_ENV
|
|
echo "PACKAGE_PREFIX=${PACKAGE_PREFIX}" >> $GITHUB_ENV
|
|
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Verify commit exists in branch
|
|
run: |
|
|
if [[ "${{ github.ref }}" == refs/tags/* && "${{ github.event_name }}" == "release" && ("${{ github.event.action }}" == "published" || "${{ github.event.action }}" == "prereleased") ]]; then
|
|
git fetch --no-tags --prune origin +refs/heads/*:refs/remotes/origin/*
|
|
git branch --remote --contains | grep -E 'origin/(main|release/)'
|
|
else
|
|
git fetch --no-tags --prune origin +refs/heads/*:refs/remotes/origin/*
|
|
git branch --remote --contains | grep origin/${BRANCH_NAME}
|
|
fi
|
|
|
|
- name: Set VERSION variable
|
|
run: |
|
|
if [[ "${{ github.ref }}" == refs/tags/* && "${{ github.event_name }}" == "release" && ("${{ github.event.action }}" == "published" || "${{ github.event.action }}" == "prereleased") ]]; then
|
|
TAG_NAME=${{ github.ref }} # e.g., refs/tags/3.0.0
|
|
TAG_NAME=${TAG_NAME#refs/tags/} # remove the refs/tags/ prefix
|
|
echo "VERSION=${TAG_NAME}" >> $GITHUB_ENV
|
|
else
|
|
echo "VERSION=${{env.base_version}}-preview.${{github.run_number}}" >> $GITHUB_ENV
|
|
fi
|
|
|
|
- uses: actions/setup-dotnet@v4
|
|
with:
|
|
dotnet-version: 10.x
|
|
|
|
- name: Compile+Pack
|
|
run: ./build.sh Compile+Pack --version ${VERSION} --analyseCode true
|
|
|
|
- name: Upload artifact
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: elsa-nuget-packages
|
|
path: packages/*nupkg
|
|
if: ${{ github.event_name == 'release' || github.event_name == 'push'}}
|
|
|
|
publish_preview_feedz:
|
|
name: Publish to feedz.io
|
|
needs: build
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 20
|
|
if: ${{ github.event_name == 'release' || github.event_name == 'push'}}
|
|
steps:
|
|
- name: Download Packages
|
|
uses: actions/download-artifact@v4.1.7
|
|
with:
|
|
name: elsa-nuget-packages
|
|
|
|
- name: Publish to feedz.io
|
|
run: dotnet nuget push *.nupkg -k ${{ secrets.FEEDZ_API_KEY }} -s ${{ env.feedz_feed_source }} --skip-duplicate
|
|
|
|
publish_nuget:
|
|
name: Publish release to nuget.org
|
|
needs: build
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 20
|
|
if: ${{ github.event.action == 'published' }}
|
|
steps:
|
|
- name: Download Packages
|
|
uses: actions/download-artifact@v4.1.7
|
|
with:
|
|
name: elsa-nuget-packages
|
|
|
|
- name: Publish to nuget.org
|
|
run: dotnet nuget push *.nupkg -k ${{ secrets.NUGET_API_KEY }} -s ${{ env.nuget_feed_source }} --skip-duplicate
|
|
|
|
deploy_coverage:
|
|
name: Deploy coverage to GitHub Pages
|
|
needs: test
|
|
runs-on: ubuntu-latest
|
|
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop/3.6.0' || github.ref == 'refs/heads/release/3.6.0'
|
|
permissions:
|
|
pages: write
|
|
id-token: write
|
|
environment:
|
|
name: github-pages
|
|
url: ${{ steps.deployment.outputs.page_url }}
|
|
steps:
|
|
- name: Deploy to GitHub Pages
|
|
id: deployment
|
|
uses: actions/deploy-pages@v4
|