diff --git a/.github/workflows/ci-dotnet-agentframework-sampleagent.yml b/.github/workflows/ci-dotnet-agentframework-sampleagent.yml index cccdd9d0..871c8bd3 100644 --- a/.github/workflows/ci-dotnet-agentframework-sampleagent.yml +++ b/.github/workflows/ci-dotnet-agentframework-sampleagent.yml @@ -1,16 +1,13 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + name: CI - Build .NET Agent Framework Sample Agent permissions: contents: read on: - push: - branches: [ main, master ] - paths: - - 'dotnet/agent-framework/sample-agent/**/*' - pull_request: - branches: [ main, master ] - paths: - - 'dotnet/agent-framework/sample-agent/**/*' + workflow_call: # Called by orchestrator + workflow_dispatch: # Manual trigger jobs: dotnet-agentframework-sampleagent: diff --git a/.github/workflows/ci-dotnet-semantickernel-sampleagent.yml b/.github/workflows/ci-dotnet-semantickernel-sampleagent.yml index 270bc088..6f83e84e 100644 --- a/.github/workflows/ci-dotnet-semantickernel-sampleagent.yml +++ b/.github/workflows/ci-dotnet-semantickernel-sampleagent.yml @@ -1,16 +1,13 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + name: CI - Build .NET Semantic Kernel Sample Agent permissions: contents: read on: - push: - branches: [ main, master ] - paths: - - 'dotnet/semantic-kernel/sample-agent/**/*' - pull_request: - branches: [ main, master ] - paths: - - 'dotnet/semantic-kernel/sample-agent/**/*' + workflow_call: # Called by orchestrator + workflow_dispatch: # Manual trigger jobs: dotnet-semantickernel-sampleagent: diff --git a/.github/workflows/ci-nodejs-claude-sampleagent.yml b/.github/workflows/ci-nodejs-claude-sampleagent.yml index 40f89950..e9238050 100644 --- a/.github/workflows/ci-nodejs-claude-sampleagent.yml +++ b/.github/workflows/ci-nodejs-claude-sampleagent.yml @@ -4,14 +4,8 @@ name: CI - Build Node.js Claude Sample Agent on: - push: - branches: [ main, master ] - paths: - - 'nodejs/claude/sample-agent/**/*' - pull_request: - branches: [ main, master ] - paths: - - 'nodejs/claude/sample-agent/**/*' + workflow_call: # Called by orchestrator + workflow_dispatch: # Manual trigger jobs: nodejs-claude-sampleagent: name: Node.js Claude Sample Agent diff --git a/.github/workflows/ci-nodejs-langchain-sampleagent.yml b/.github/workflows/ci-nodejs-langchain-sampleagent.yml index e6b8c4e4..e63a551a 100644 --- a/.github/workflows/ci-nodejs-langchain-sampleagent.yml +++ b/.github/workflows/ci-nodejs-langchain-sampleagent.yml @@ -4,14 +4,8 @@ name: CI - Build Node.js LangChain Sample Agent on: - push: - branches: [ main, master ] - paths: - - 'nodejs/langchain/sample-agent/**/*' - pull_request: - branches: [ main, master ] - paths: - - 'nodejs/langchain/sample-agent/**/*' + workflow_call: # Called by orchestrator + workflow_dispatch: # Manual trigger jobs: nodejs-langchain-sampleagent: name: Node.js LangChain Sample Agent diff --git a/.github/workflows/ci-nodejs-openai-sampleagent.yml b/.github/workflows/ci-nodejs-openai-sampleagent.yml index 46abe469..75453023 100644 --- a/.github/workflows/ci-nodejs-openai-sampleagent.yml +++ b/.github/workflows/ci-nodejs-openai-sampleagent.yml @@ -4,14 +4,8 @@ name: CI - Build Node.js OpenAI Sample Agent on: - push: - branches: [ main, master ] - paths: - - 'nodejs/openai/sample-agent/**/*' - pull_request: - branches: [ main, master ] - paths: - - 'nodejs/openai/sample-agent/**/*' + workflow_call: # Called by orchestrator + workflow_dispatch: # Manual trigger jobs: nodejs-openai-sampleagent: diff --git a/.github/workflows/ci-nodejs-vercelsdk-sampleagent.yml b/.github/workflows/ci-nodejs-vercelsdk-sampleagent.yml index bc14b4ba..fae77c30 100644 --- a/.github/workflows/ci-nodejs-vercelsdk-sampleagent.yml +++ b/.github/workflows/ci-nodejs-vercelsdk-sampleagent.yml @@ -4,14 +4,8 @@ name: CI - Build Node.js Vercel SDK Sample Agent on: - push: - branches: [ main, master ] - paths: - - 'nodejs/vercel-sdk/sample-agent/**/*' - pull_request: - branches: [ main, master ] - paths: - - 'nodejs/vercel-sdk/sample-agent/**/*' + workflow_call: # Called by orchestrator + workflow_dispatch: # Manual trigger jobs: nodejs-vercelsdk-sampleagent: diff --git a/.github/workflows/ci-orchestrator.yml b/.github/workflows/ci-orchestrator.yml new file mode 100644 index 00000000..2cd7edb5 --- /dev/null +++ b/.github/workflows/ci-orchestrator.yml @@ -0,0 +1,158 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +name: CI Orchestrator + +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +permissions: + contents: read + +jobs: + # Detect which folders have changes + detect-changes: + name: Detect Changes + runs-on: ubuntu-latest + outputs: + dotnet-agentframework: ${{ steps.changes.outputs.dotnet-agentframework }} + dotnet-semantickernel: ${{ steps.changes.outputs.dotnet-semantickernel }} + nodejs-claude: ${{ steps.changes.outputs.nodejs-claude }} + nodejs-langchain: ${{ steps.changes.outputs.nodejs-langchain }} + nodejs-openai: ${{ steps.changes.outputs.nodejs-openai }} + nodejs-vercelsdk: ${{ steps.changes.outputs.nodejs-vercelsdk }} + python-agentframework: ${{ steps.changes.outputs.python-agentframework }} + python-googleadk: ${{ steps.changes.outputs.python-googleadk }} + python-openai: ${{ steps.changes.outputs.python-openai }} + python-claude: ${{ steps.changes.outputs.python-claude }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Check for changes + uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + dotnet-agentframework: + - 'dotnet/agent-framework/**' + dotnet-semantickernel: + - 'dotnet/semantic-kernel/**' + nodejs-claude: + - 'nodejs/claude/**' + nodejs-langchain: + - 'nodejs/langchain/**' + nodejs-openai: + - 'nodejs/openai/**' + nodejs-vercelsdk: + - 'nodejs/vercel-sdk/**' + python-agentframework: + - 'python/agent-framework/**' + python-googleadk: + - 'python/google-adk/**' + python-openai: + - 'python/openai/**' + python-claude: + - 'python/claude/**' + + # .NET Jobs - Call existing workflows + dotnet-agentframework: + name: .NET Agent Framework + needs: detect-changes + if: needs.detect-changes.outputs.dotnet-agentframework == 'true' + uses: ./.github/workflows/ci-dotnet-agentframework-sampleagent.yml + + dotnet-semantickernel: + name: .NET Semantic Kernel + needs: detect-changes + if: needs.detect-changes.outputs.dotnet-semantickernel == 'true' + uses: ./.github/workflows/ci-dotnet-semantickernel-sampleagent.yml + + # Node.js Jobs - Call existing workflows + nodejs-claude: + name: Node.js Claude + needs: detect-changes + if: needs.detect-changes.outputs.nodejs-claude == 'true' + uses: ./.github/workflows/ci-nodejs-claude-sampleagent.yml + + nodejs-langchain: + name: Node.js LangChain + needs: detect-changes + if: needs.detect-changes.outputs.nodejs-langchain == 'true' + uses: ./.github/workflows/ci-nodejs-langchain-sampleagent.yml + + nodejs-openai: + name: Node.js OpenAI + needs: detect-changes + if: needs.detect-changes.outputs.nodejs-openai == 'true' + uses: ./.github/workflows/ci-nodejs-openai-sampleagent.yml + + nodejs-vercelsdk: + name: Node.js Vercel SDK + needs: detect-changes + if: needs.detect-changes.outputs.nodejs-vercelsdk == 'true' + uses: ./.github/workflows/ci-nodejs-vercelsdk-sampleagent.yml + + # Python Jobs - Call existing workflows + python-agentframework: + name: Python Agent Framework + needs: detect-changes + if: needs.detect-changes.outputs.python-agentframework == 'true' + uses: ./.github/workflows/ci-python-agentframework-sampleagent.yml + + python-googleadk: + name: Python Google ADK + needs: detect-changes + if: needs.detect-changes.outputs.python-googleadk == 'true' + uses: ./.github/workflows/ci-python-googleadk-sampleagent.yml + + python-openai: + name: Python OpenAI + needs: detect-changes + if: needs.detect-changes.outputs.python-openai == 'true' + uses: ./.github/workflows/ci-python-openai-sampleagent.yml + + python-claude: + name: Python Claude + needs: detect-changes + if: needs.detect-changes.outputs.python-claude == 'true' + uses: ./.github/workflows/python-claude-sample.yml + + # Final status check - ALWAYS runs and reports success + # This is the ONLY check you need to mark as "Required" in branch protection + ci-status: + name: CI Status + runs-on: ubuntu-latest + needs: + - detect-changes + - dotnet-agentframework + - dotnet-semantickernel + - nodejs-claude + - nodejs-langchain + - nodejs-openai + - nodejs-vercelsdk + - python-agentframework + - python-googleadk + - python-openai + - python-claude + if: always() + steps: + - name: Check CI Status + run: | + echo "Checking CI job results..." + + # Get all job results (including detect-changes; skipped jobs are fine, failed jobs are not) + results="${{ needs.detect-changes.result }} ${{ needs.dotnet-agentframework.result }} ${{ needs.dotnet-semantickernel.result }} ${{ needs.nodejs-claude.result }} ${{ needs.nodejs-langchain.result }} ${{ needs.nodejs-openai.result }} ${{ needs.nodejs-vercelsdk.result }} ${{ needs.python-agentframework.result }} ${{ needs.python-googleadk.result }} ${{ needs.python-openai.result }} ${{ needs.python-claude.result }}" + + echo "Job results: $results" + + # Check if any job failed or was cancelled + if echo "$results" | grep -qE "failure|cancelled"; then + echo "❌ One or more CI jobs failed or were cancelled" + exit 1 + fi + + echo "✅ All CI jobs passed (or were skipped because no relevant changes)" diff --git a/.github/workflows/ci-python-agentframework-sampleagent.yml b/.github/workflows/ci-python-agentframework-sampleagent.yml index b83e4ad7..462932ec 100644 --- a/.github/workflows/ci-python-agentframework-sampleagent.yml +++ b/.github/workflows/ci-python-agentframework-sampleagent.yml @@ -1,18 +1,13 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + name: CI - Build Python Agent Framework Sample Agent permissions: contents: read on: - push: - branches: [ main, master ] - paths: - - 'python/agent-framework/sample-agent/**/*' - - '.github/workflows/ci-python-agentframework-sampleagent.yml' - pull_request: - branches: [ main, master ] - paths: - - 'python/agent-framework/sample-agent/**/*' - - '.github/workflows/ci-python-agentframework-sampleagent.yml' + workflow_call: # Called by orchestrator + workflow_dispatch: # Manual trigger jobs: validate-sample: diff --git a/.github/workflows/ci-python-googleadk-sampleagent.yml b/.github/workflows/ci-python-googleadk-sampleagent.yml index e71cee7b..0aeb4f71 100644 --- a/.github/workflows/ci-python-googleadk-sampleagent.yml +++ b/.github/workflows/ci-python-googleadk-sampleagent.yml @@ -1,18 +1,13 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + name: CI - Build Python Google ADK Sample Agent permissions: contents: read on: - push: - branches: [ main, master ] - paths: - - 'python/google-adk/sample-agent/**/*' - - '.github/workflows/ci-python-googleadk-sampleagent.yml' - pull_request: - branches: [ main, master ] - paths: - - 'python/google-adk/sample-agent/**/*' - - '.github/workflows/ci-python-googleadk-sampleagent.yml' + workflow_call: # Called by orchestrator + workflow_dispatch: # Manual trigger jobs: validate-sample: diff --git a/.github/workflows/ci-python-openai-sampleagent.yml b/.github/workflows/ci-python-openai-sampleagent.yml index 9f9be478..40f4d131 100644 --- a/.github/workflows/ci-python-openai-sampleagent.yml +++ b/.github/workflows/ci-python-openai-sampleagent.yml @@ -1,18 +1,13 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + name: CI - Build Python OpenAI Sample Agent permissions: contents: read on: - push: - branches: [ main, master ] - paths: - - 'python/openai/sample-agent/**/*' - - '.github/workflows/ci-python-openai-sampleagent.yml' - pull_request: - branches: [ main, master ] - paths: - - 'python/openai/sample-agent/**/*' - - '.github/workflows/ci-python-openai-sampleagent.yml' + workflow_call: # Called by orchestrator + workflow_dispatch: # Manual trigger jobs: validate-sample: diff --git a/.github/workflows/python-claude-sample.yml b/.github/workflows/python-claude-sample.yml index 3e17eac1..42ec2105 100644 --- a/.github/workflows/python-claude-sample.yml +++ b/.github/workflows/python-claude-sample.yml @@ -1,20 +1,11 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + name: Python Claude Sample - Build Validation on: - push: - branches: - - main - - develop - paths: - - 'python/claude/sample-agent/**' - - '.github/workflows/python-claude-sample.yml' - pull_request: - branches: - - main - - develop - paths: - - 'python/claude/sample-agent/**' - - '.github/workflows/python-claude-sample.yml' + workflow_call: # Called by orchestrator + workflow_dispatch: # Manual trigger permissions: contents: read