Skip to content

Commit 71de3e6

Browse files
Copilottherealjohn
andauthored
fix: defer project initialization in env refresh to avoid extension failures
Restructure envRefreshAction.Run() so that: 1. Infrastructure state is retrieved and environment is updated first 2. Service initialization (projectManager.Initialize) is deferred until after the core env refresh operation completes 3. Service initialization and ServiceEventEnvUpdated are best-effort - logged warnings instead of fatal errors This fixes azd env refresh for projects using the azure.ai.agent extension, where the extension's service target initialization could fail and block the entire env refresh operation. The core env refresh operation (reading deployment outputs and updating .env) doesn't require service targets or framework services to be initialized. Fixes #7195 Agent-Logs-Url: https://github.com/Azure/azure-dev/sessions/ec998279-c8d0-4ad1-98d3-830624a06afd Co-authored-by: therealjohn <1501196+therealjohn@users.noreply.github.com>
1 parent c081662 commit 71de3e6

1 file changed

Lines changed: 34 additions & 24 deletions

File tree

cli/azd/cmd/env.go

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"errors"
1010
"fmt"
1111
"io"
12+
"log"
1213
"os"
1314
"slices"
1415
"strings"
@@ -1151,14 +1152,6 @@ func (ef *envRefreshAction) Run(ctx context.Context) (*actions.ActionResult, err
11511152
Title: fmt.Sprintf("Refreshing environment %s (azd env refresh)", ef.env.Name()),
11521153
})
11531154

1154-
if err := ef.projectManager.Initialize(ctx, ef.projectConfig); err != nil {
1155-
return nil, err
1156-
}
1157-
1158-
if err := ef.projectManager.EnsureAllTools(ctx, ef.projectConfig, nil); err != nil {
1159-
return nil, err
1160-
}
1161-
11621155
infra, err := ef.importManager.ProjectInfrastructure(ctx, ef.projectConfig)
11631156
if err != nil {
11641157
return nil, err
@@ -1223,23 +1216,40 @@ func (ef *envRefreshAction) Run(ctx context.Context) (*actions.ActionResult, err
12231216
}
12241217
}
12251218

1226-
servicesStable, err := ef.importManager.ServiceStable(ctx, ef.projectConfig)
1227-
if err != nil {
1228-
return nil, err
1229-
}
1230-
1231-
for _, svc := range servicesStable {
1232-
eventArgs := project.ServiceLifecycleEventArgs{
1233-
Project: ef.projectConfig,
1234-
Service: svc,
1235-
ServiceContext: project.NewServiceContext(),
1236-
Args: map[string]any{
1237-
"bicepOutput": state.Outputs,
1238-
},
1239-
}
1219+
// After the environment has been refreshed, try to initialize services
1220+
// and raise ServiceEventEnvUpdated. This is best-effort: if initialization
1221+
// fails (e.g. an extension service target can't initialize), we log a
1222+
// warning but consider the refresh successful since the .env file has
1223+
// already been updated with the latest deployment outputs.
1224+
if err := ef.projectManager.Initialize(ctx, ef.projectConfig); err != nil {
1225+
log.Printf(
1226+
"project initialization after env refresh: %v (service events will be skipped)",
1227+
err,
1228+
)
1229+
} else {
1230+
servicesStable, err := ef.importManager.ServiceStable(ctx, ef.projectConfig)
1231+
if err != nil {
1232+
log.Printf("failed to list services for env update events: %v", err)
1233+
} else {
1234+
for _, svc := range servicesStable {
1235+
eventArgs := project.ServiceLifecycleEventArgs{
1236+
Project: ef.projectConfig,
1237+
Service: svc,
1238+
ServiceContext: project.NewServiceContext(),
1239+
Args: map[string]any{
1240+
"bicepOutput": state.Outputs,
1241+
},
1242+
}
12401243

1241-
if err := svc.RaiseEvent(ctx, project.ServiceEventEnvUpdated, eventArgs); err != nil {
1242-
return nil, err
1244+
if err := svc.RaiseEvent(
1245+
ctx, project.ServiceEventEnvUpdated, eventArgs,
1246+
); err != nil {
1247+
log.Printf(
1248+
"failed to raise env updated event for service %s: %v",
1249+
svc.Name, err,
1250+
)
1251+
}
1252+
}
12431253
}
12441254
}
12451255

0 commit comments

Comments
 (0)