-
Notifications
You must be signed in to change notification settings - Fork 109
feat(specs): credential sidecar isolation architecture #1599
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 8 commits
288d275
1cc2dc6
f1f070a
b018062
0ab4da9
e373777
a29f2b1
eb027eb
0a96c00
469ca40
8ed5d4d
d0ecdc6
fa13c83
0e29da7
68bea15
0c7e419
5ef445f
37fefc9
6d05767
9184faf
ee898e6
9173526
8823a9a
b18a2d5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -146,3 +146,4 @@ hack/ | |
|
|
||
| # Personal exports | ||
| *.csv | ||
| components/credential-sidecars/entrypoint/credential-entrypoint | ||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -21,6 +21,39 @@ const ( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| mcpSidecarURL = "http://localhost:8090" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| type credentialSidecarSpec struct { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Name string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ImageField string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Port int64 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ProviderEnvs map[string]string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var credentialSidecarRegistry = map[string]credentialSidecarSpec{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "github": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Name: "credential-github", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ImageField: "GitHubMCPImage", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Port: 8091, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ProviderEnvs: map[string]string{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "GITHUB_PERSONAL_ACCESS_TOKEN": "__CREDENTIAL_TOKEN__", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "jira": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Name: "credential-jira", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ImageField: "JiraMCPImage", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Port: 8092, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "kubeconfig": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Name: "credential-k8s", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ImageField: "K8sMCPImage", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Port: 8093, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "google": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Name: "credential-google", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ImageField: "GoogleMCPImage", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Port: 8094, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| type KubeReconcilerConfig struct { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| RunnerImage string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| BackendURL string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -36,6 +69,10 @@ type KubeReconcilerConfig struct { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| RunnerImageNamespace string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| MCPImage string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| MCPAPIServerURL string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| GitHubMCPImage string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| JiraMCPImage string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| K8sMCPImage string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| GoogleMCPImage string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| RunnerLogLevel string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CPRuntimeNamespace string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CPTokenURL string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -451,6 +488,19 @@ func (r *SimpleKubeReconciler) ensurePod(ctx context.Context, namespace string, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| r.logger.Info().Str("session_id", session.ID).Msg("MCP sidecar enabled for session") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| credSidecars, credMCPURLs := r.buildCredentialSidecars(session.ID, credentialIDs) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| containers = append(containers, credSidecars...) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if len(credMCPURLs) > 0 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| raw, err := json.Marshal(credMCPURLs) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if err == nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| containers[0].(map[string]interface{})["env"] = append( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| containers[0].(map[string]interface{})["env"].([]interface{}), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| envVar("CREDENTIAL_MCP_URLS", string(raw)), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| r.logger.Info().Int("count", len(credSidecars)).Str("session_id", session.ID).Msg("credential sidecars injected") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Gate credential sidecar injection on token-exchange prerequisites. This path injects sidecars and Suggested fix- credSidecars, credMCPURLs := r.buildCredentialSidecars(session.ID, credentialIDs)
- containers = append(containers, credSidecars...)
- if len(credMCPURLs) > 0 {
+ canUseCredentialSidecars := r.cfg.CPTokenURL != "" && r.cfg.CPTokenPublicKey != ""
+ if !canUseCredentialSidecars && len(credentialIDs) > 0 {
+ r.logger.Warn().
+ Str("session_id", session.ID).
+ Msg("credential sidecars disabled: CP token exchange config missing")
+ }
+ credSidecars, credMCPURLs := []interface{}{}, map[string]string{}
+ if canUseCredentialSidecars {
+ credSidecars, credMCPURLs = r.buildCredentialSidecars(session.ID, credentialIDs)
+ containers = append(containers, credSidecars...)
+ }
+ if len(credMCPURLs) > 0 {
raw, err := json.Marshal(credMCPURLs)
if err == nil {
containers[0].(map[string]interface{})["env"] = append(
containers[0].(map[string]interface{})["env"].([]interface{}),
envVar("CREDENTIAL_MCP_URLS", string(raw)),
)
}
r.logger.Info().Int("count", len(credSidecars)).Str("session_id", session.ID).Msg("credential sidecars injected")
}As per coding guidelines "Never silently swallow partial failures; every error path must propagate or be explicitly collected, never discarded". 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pod := &unstructured.Unstructured{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Object: map[string]interface{}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "apiVersion": "v1", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -827,6 +877,106 @@ func boolToStr(b bool) string { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return "false" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| func (r *SimpleKubeReconciler) credentialSidecarImage(provider string) string { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| switch provider { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case "github": | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return r.cfg.GitHubMCPImage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case "jira": | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return r.cfg.JiraMCPImage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case "kubeconfig": | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return r.cfg.K8sMCPImage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case "google": | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return r.cfg.GoogleMCPImage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| default: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return "" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| func (r *SimpleKubeReconciler) buildCredentialSidecars(sessionID string, credentialIDs map[string]string) ([]interface{}, map[string]string) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var sidecars []interface{} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| mcpURLs := map[string]string{} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for provider := range credentialIDs { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| spec, ok := credentialSidecarRegistry[provider] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if !ok { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| continue | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| image := r.credentialSidecarImage(provider) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if image == "" { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| continue | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| imagePullPolicy := "Always" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if strings.HasPrefix(image, "localhost/") { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| imagePullPolicy = "IfNotPresent" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| env := []interface{}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| envVar("SESSION_ID", sessionID), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| envVar("AMBIENT_API_URL", r.cfg.MCPAPIServerURL), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| envVar("AMBIENT_CP_TOKEN_URL", r.cfg.CPTokenURL), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| envVar("AMBIENT_CP_TOKEN_PUBLIC_KEY", r.cfg.CPTokenPublicKey), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| envVar("SSL_CERT_FILE", "/etc/pki/ca-trust/extracted/pem/service-ca.crt"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for k, v := range spec.ProviderEnvs { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| env = append(env, envVar(k, v)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if r.cfg.HTTPProxy != "" { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| env = append(env, envVar("HTTP_PROXY", r.cfg.HTTPProxy)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if r.cfg.HTTPSProxy != "" { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| env = append(env, envVar("HTTPS_PROXY", r.cfg.HTTPSProxy)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if r.cfg.NoProxy != "" { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| env = append(env, envVar("NO_PROXY", r.cfg.NoProxy)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| sidecar := map[string]interface{}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "name": spec.Name, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "image": image, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "imagePullPolicy": imagePullPolicy, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "ports": []interface{}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| map[string]interface{}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "name": fmt.Sprintf("cred-%s", provider), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "containerPort": spec.Port, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "protocol": "TCP", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "env": env, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "volumeMounts": []interface{}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| map[string]interface{}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "name": "service-ca", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "mountPath": "/etc/pki/ca-trust/extracted/pem/service-ca.crt", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "subPath": "service-ca.crt", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "readOnly": true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "resources": map[string]interface{}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "requests": map[string]interface{}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "cpu": "100m", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "memory": "128Mi", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "limits": map[string]interface{}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "cpu": "500m", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "memory": "256Mi", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "securityContext": map[string]interface{}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "allowPrivilegeEscalation": false, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "capabilities": map[string]interface{}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "drop": []interface{}{"ALL"}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| sidecars = append(sidecars, sidecar) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| mcpURLs[provider] = fmt.Sprintf("http://localhost:%d", spec.Port) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| r.logger.Debug().Str("provider", provider).Str("image", image).Int64("port", spec.Port).Msg("credential sidecar configured") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return sidecars, mcpURLs | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| func (r *SimpleKubeReconciler) buildMCPSidecar(sessionID string) interface{} { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| mcpImage := r.cfg.MCPImage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| imagePullPolicy := "Always" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Declare new credential-sidecar targets as
.PHONY.The targets added at Lines 228, 230, 237, 243, and 249 are missing from
.PHONY(Lines 1-13). If same-named files appear, recipes may not run.Suggested patch
🧰 Tools
🪛 checkmake (0.3.2)
[warning] 228-228: Target "build-credential-sidecars" should be declared PHONY.
(phonydeclared)
🤖 Prompt for AI Agents
Credential sidecar build targets are currently orphaned from primary workflows.
At Line 228 you add sidecar build targets, but
build-all(Line 170),push-all(Line 299), and_kind-load-images(Line 1263) still omit these images. This meansmake kind-up LOCAL_IMAGES=trueandmake push-allcan skip sidecar images even when sidecars are required.Suggested patch
🧰 Tools
🪛 checkmake (0.3.2)
[warning] 228-228: Target "build-credential-sidecars" should be declared PHONY.
(phonydeclared)
🤖 Prompt for AI Agents