Skip to content

Commit a6a6dd0

Browse files
Merge pull request #301 from microsoft/dev
chore: Dev merge to Main
2 parents 868bd5d + 295c9ba commit a6a6dd0

50 files changed

Lines changed: 2632 additions & 874 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/broken-links-checker.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ jobs:
3737
uses: lycheeverse/lychee-action@v2.8.0
3838
with:
3939
args: >
40-
--verbose --exclude-mail --no-progress --exclude ^https?://
40+
--verbose --no-progress --exclude ^https?:// --exclude ^mailto:
4141
${{ steps.changed-markdown-files.outputs.all_changed_files }}
4242
failIfEmpty: false
4343
env:
@@ -50,7 +50,7 @@ jobs:
5050
uses: lycheeverse/lychee-action@v2.8.0
5151
with:
5252
args: >
53-
--verbose --exclude-mail --no-progress --exclude ^https?://
53+
--verbose --no-progress --exclude ^https?:// --exclude ^mailto:
5454
'**/*.md'
5555
failIfEmpty: false
5656
env:

.github/workflows/deploy-orchestrator.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,8 @@ env:
6767

6868
jobs:
6969
docker-build:
70+
if: inputs.trigger_type == 'workflow_dispatch' && inputs.build_docker_image == true
7071
uses: ./.github/workflows/job-docker-build.yml
71-
with:
72-
trigger_type: ${{ inputs.trigger_type }}
73-
build_docker_image: ${{ inputs.build_docker_image }}
7472
secrets: inherit
7573

7674
deploy:

.github/workflows/job-deploy-linux.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ jobs:
266266
# Set ACR name only when building Docker image
267267
if [[ "$BUILD_DOCKER_IMAGE" == "true" ]]; then
268268
# Extract ACR name from login server and set as environment variable
269-
ACR_NAME=$(echo "${{ secrets.ACR_TEST_LOGIN_SERVER }}")
269+
ACR_NAME=$(echo "${{ vars.ACR_TEST_LOGIN_SERVER }}")
270270
azd env set AZURE_ENV_CONTAINER_REGISTRY_ENDPOINT="$ACR_NAME"
271271
echo "Set ACR host to: $ACR_NAME"
272272
else

.github/workflows/job-deploy-windows.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ jobs:
266266
267267
# Set ACR name only when building Docker image
268268
if ($env:BUILD_DOCKER_IMAGE -eq "true") {
269-
$ACR_NAME = "${{ secrets.ACR_TEST_LOGIN_SERVER }}"
269+
$ACR_NAME = "${{ vars.ACR_TEST_LOGIN_SERVER }}"
270270
azd env set AZURE_ENV_CONTAINER_REGISTRY_ENDPOINT="$ACR_NAME"
271271
Write-Host "Set ACR host to: $ACR_NAME"
272272
} else {

.github/workflows/job-docker-build.yml

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,22 @@
1-
name: Docker Build Job
1+
name: Build & Push Test Images (Feature Branch)
22

33
on:
44
workflow_call:
5-
inputs:
6-
trigger_type:
7-
description: 'Trigger type (workflow_dispatch, pull_request, schedule)'
8-
required: true
9-
type: string
10-
build_docker_image:
11-
description: 'Build And Push Docker Image (Optional)'
12-
required: false
13-
default: false
14-
type: boolean
155
outputs:
166
IMAGE_TAG:
177
description: "Generated Docker Image Tag"
188
value: ${{ jobs.docker-build.outputs.IMAGE_TAG }}
9+
workflow_dispatch:
10+
11+
permissions:
12+
contents: read
13+
id-token: write
1914

2015
env:
2116
BRANCH_NAME: ${{ github.event.workflow_run.head_branch || github.head_ref || github.ref_name }}
2217

2318
jobs:
2419
docker-build:
25-
if: inputs.trigger_type == 'workflow_dispatch' && inputs.build_docker_image == true
2620
runs-on: ubuntu-latest
2721
environment: production
2822
outputs:
@@ -56,7 +50,11 @@ jobs:
5650
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
5751

5852
- name: Log in to Azure Container Registry
59-
run: az acr login --name ${{ secrets.ACR_TEST_LOGIN_SERVER }}
53+
shell: bash
54+
run: |
55+
# Extract registry name from login server (e.g., myacr.azurecr.io -> myacr)
56+
ACR_NAME=$(echo "${{ vars.ACR_TEST_LOGIN_SERVER }}" | cut -d'.' -f1)
57+
az acr login --name "$ACR_NAME"
6058
6159
- name: Build and Push Backend API Docker Image
6260
id: build_push_image
@@ -69,8 +67,8 @@ jobs:
6967
push: true
7068
provenance: false
7169
tags: |
72-
${{ secrets.ACR_TEST_LOGIN_SERVER }}/backend-api:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}
73-
${{ secrets.ACR_TEST_LOGIN_SERVER }}/backend-api:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}_${{ github.run_number }}
70+
${{ vars.ACR_TEST_LOGIN_SERVER }}/backend-api:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}
71+
${{ vars.ACR_TEST_LOGIN_SERVER }}/backend-api:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}_${{ github.run_number }}
7472
7573
- name: Build and Push Processor Docker Image
7674
uses: docker/build-push-action@v7
@@ -82,8 +80,8 @@ jobs:
8280
push: true
8381
provenance: false
8482
tags: |
85-
${{ secrets.ACR_TEST_LOGIN_SERVER }}/processor:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}
86-
${{ secrets.ACR_TEST_LOGIN_SERVER }}/processor:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}_${{ github.run_number }}
83+
${{ vars.ACR_TEST_LOGIN_SERVER }}/processor:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}
84+
${{ vars.ACR_TEST_LOGIN_SERVER }}/processor:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}_${{ github.run_number }}
8785
8886
- name: Build and Push Front End Docker Image
8987
uses: docker/build-push-action@v7
@@ -95,8 +93,8 @@ jobs:
9593
push: true
9694
provenance: false
9795
tags: |
98-
${{ secrets.ACR_TEST_LOGIN_SERVER }}/frontend:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}
99-
${{ secrets.ACR_TEST_LOGIN_SERVER }}/frontend:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}_${{ github.run_number }}
96+
${{ vars.ACR_TEST_LOGIN_SERVER }}/frontend:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}
97+
${{ vars.ACR_TEST_LOGIN_SERVER }}/frontend:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}_${{ github.run_number }}
10098
10199
- name: Verify Docker Image Build
102100
shell: bash
@@ -108,7 +106,7 @@ jobs:
108106
if: always()
109107
shell: bash
110108
run: |
111-
ACR_NAME=$(echo "${{ secrets.ACR_TEST_LOGIN_SERVER }}")
109+
ACR_NAME=$(echo "${{ vars.ACR_TEST_LOGIN_SERVER }}")
112110
echo "## 🐳 Docker Build Job Summary" >> $GITHUB_STEP_SUMMARY
113111
echo "" >> $GITHUB_STEP_SUMMARY
114112
echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY

docs/LocalDevelopmentSetup.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ py -3.12 -m uv venv .venv
337337
py -3.12 -m uv sync --prerelease=allow
338338
```
339339

340-
> **⚠️ Important**: This repo currently depends on a prerelease/dev version of Microsoft Agent Framework. Always run `uv sync --prerelease=allow` (or `py -3.12 -m uv sync --prerelease=allow` on Windows) after creating the virtual environment to install all required dependencies. Missing dependencies will cause runtime errors like `ModuleNotFoundError: No module named 'pydantic'` or DNS resolution failures.
340+
> **⚠️ Important**: Always run `uv sync --prerelease=allow` (or `py -3.12 -m uv sync --prerelease=allow` on Windows) after creating the virtual environment to install all required dependencies. The `--prerelease=allow` flag is needed because some transitive dependencies may still use pre-release versions. Missing dependencies will cause runtime errors like `ModuleNotFoundError: No module named 'pydantic'` or DNS resolution failures.
341341
342342
### 5.4. Run the Processor
343343

docs/ProcessFrameworkGuide.md

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -118,23 +118,21 @@ Inside each step, the orchestrator can use multi-agent patterns (maker-checker l
118118

119119
- Implementation: [src/processor/src/steps/migration_processor.py](../src/processor/src/steps/migration_processor.py)
120120
- The processor creates a workflow with `WorkflowBuilder`.
121-
- It registers four executors, sets the start executor, and defines edges.
121+
- It instantiates four executors, passes the start executor to `WorkflowBuilder`, and chains them with `add_chain`.
122122

123123
Example from the repo (simplified):
124124

125125
```python
126126
from agent_framework import WorkflowBuilder
127127

128+
analysis_exec = AnalysisExecutor(id="analysis", app_context=app_context)
129+
design_exec = DesignExecutor(id="design", app_context=app_context)
130+
yaml_exec = YamlConvertExecutor(id="yaml", app_context=app_context)
131+
docs_exec = DocumentationExecutor(id="documentation", app_context=app_context)
132+
128133
workflow = (
129-
WorkflowBuilder()
130-
.register_executor(lambda: AnalysisExecutor(id="analysis", app_context=app_context), name="analysis")
131-
.register_executor(lambda: DesignExecutor(id="design", app_context=app_context), name="design")
132-
.register_executor(lambda: YamlConvertExecutor(id="yaml", app_context=app_context), name="yaml")
133-
.register_executor(lambda: DocumentationExecutor(id="documentation", app_context=app_context), name="documentation")
134-
.set_start_executor("analysis")
135-
.add_edge("analysis", "design")
136-
.add_edge("design", "yaml")
137-
.add_edge("yaml", "documentation")
134+
WorkflowBuilder(start_executor=analysis_exec)
135+
.add_chain([analysis_exec, design_exec, yaml_exec, docs_exec])
138136
.build()
139137
)
140138
```
@@ -355,7 +353,7 @@ To run processor unit tests locally (example):
355353

356354
```bash
357355
cd src/processor
358-
uv run --prerelease=allow python -m pytest src/processor/src/tests/unit -v
356+
uv run python -m pytest src/tests/unit -v
359357
```
360358

361359
## Extending the pipeline

infra/main.bicep

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,6 +1050,11 @@ module aiFoundryAiServices 'br/public:avm/res/cognitive-services/account:0.13.2'
10501050
// ========== AI Foundry Private Endpoint ========== //
10511051
module aiFoundryPrivateEndpoint 'br/public:avm/res/network/private-endpoint:0.8.1' = if (enablePrivateNetworking && !useExistingAiFoundryAiProject) {
10521052
name: take('pep-${aiFoundryAiServicesResourceName}-deployment', 64)
1053+
dependsOn: [
1054+
aiFoundryAiServices
1055+
virtualNetwork
1056+
avmPrivateDnsZones
1057+
]
10531058
params: {
10541059
name: 'pep-${aiFoundryAiServicesResourceName}'
10551060
customNetworkInterfaceName: 'nic-${aiFoundryAiServicesResourceName}'

infra/main.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35202,6 +35202,10 @@
3520235202
"[format('avmPrivateDnsZones[{0}]', variables('dnsZoneIndex').aiServices)]",
3520335203
"[format('avmPrivateDnsZones[{0}]', variables('dnsZoneIndex').cognitiveServices)]",
3520435204
"[format('avmPrivateDnsZones[{0}]', variables('dnsZoneIndex').openAI)]",
35205+
"[format('avmPrivateDnsZones[{0}]', variables('dnsZoneIndex').cosmosDB)]",
35206+
"[format('avmPrivateDnsZones[{0}]', variables('dnsZoneIndex').storageBlob)]",
35207+
"[format('avmPrivateDnsZones[{0}]', variables('dnsZoneIndex').storageQueue)]",
35208+
"[format('avmPrivateDnsZones[{0}]', variables('dnsZoneIndex').appConfig)]",
3520535209
"virtualNetwork"
3520635210
]
3520735211
},

infra/main_custom.bicep

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,11 @@ module aiFoundryAiServices 'br/public:avm/res/cognitive-services/account:0.13.2'
994994
// ========== AI Foundry Private Endpoint ========== //
995995
module aiFoundryPrivateEndpoint 'br/public:avm/res/network/private-endpoint:0.8.1' = if (enablePrivateNetworking && !useExistingAiFoundryAiProject) {
996996
name: take('pep-${aiFoundryAiServicesResourceName}-deployment', 64)
997+
dependsOn: [
998+
aiFoundryAiServices
999+
virtualNetwork
1000+
avmPrivateDnsZones
1001+
]
9971002
params: {
9981003
name: 'pep-${aiFoundryAiServicesResourceName}'
9991004
customNetworkInterfaceName: 'nic-${aiFoundryAiServicesResourceName}'

0 commit comments

Comments
 (0)