Skip to content

Feat/sops#16

Merged
patrickleet merged 4 commits intomainfrom
feat/sops
Apr 3, 2026
Merged

Feat/sops#16
patrickleet merged 4 commits intomainfrom
feat/sops

Conversation

@patrickleet
Copy link
Copy Markdown
Contributor

@patrickleet patrickleet commented Apr 2, 2026

Summary by CodeRabbit

  • New Features

    • Configurable SecretStore (namespaced or cluster scope) and optional SOPS KMS key; KMS ARN surfaced in status.
  • Documentation

    • Expanded README with SecretStore/SOPS examples, role/tag examples, and added make e2e development command.
  • Tests

    • Added render and e2e tests covering KMS key, SecretStore rendering, scope variants, status wiring, and tagging.
  • Chores

    • CI/Makefile updated to run additional observed-resource scenarios; e2e workflow timing/cleanup and resource deletion adjusted; added mock observed-resource fixtures.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 2, 2026

📝 Walkthrough

Walkthrough

Adds optional SOPS KMS key and AWS-backed SecretStore support to SecretStack: new CRD fields and status, templates to render KMS Key and SecretStore, observed-resource mocks and expanded tests, CI/Make changes to run example validations with observed-resources steps, updated project dependencies and README docs.

Changes

Cohort / File(s) Summary
CI / Make
/.github/workflows/on-pr.yaml, /.github/workflows/on-push-main.yaml, Makefile
Expanded example matrix to include observed-resources step variants (steps/1/, steps/2/), narrowed e2e debug types, adjusted e2e timeouts/cleanup and added delete-extra-resources; updated Makefile EXAMPLES entries and line-continuation whitespace.
API Schema
apis/secretstacks/definition.yaml
Added spec.kubernetesProviderConfigRef, spec.secretStore (enabled/scope/name), spec.sops (enabled), and status.kmsKeyArn.
Observed-resource mocks
examples/test/mocks/observed-resources/standard/steps/1/*, examples/test/mocks/observed-resources/standard/steps/2/*
Added step-1 mocks for ExternalSecrets, KMS Key, PodIdentity (Ready/Synced); step-2 files reference step-1 entries and add a secret-store mock.
Render state init
functions/render/000-state-init.yaml.gotmpl
Initialize defaults for kubernetesProviderConfigRef (name defaults to clusterName, kind=ProviderConfig), secretStore (enabled=true, scope=Namespaced, name=default), sops (enabled=true); add empty observed/status containers.
State status extraction
functions/render/010-state-status.yaml.gotmpl
Compute kmsKey and secretStore readiness, extract KMS ARN into $state.observed and set $state.status.kmsKeyArn.
KMS Key rendering
functions/render/220-kms-key.yaml.gotmpl
New template to conditionally render Crossplane AWS KMS Key when sops.enabled with region, rotation, merged tags, and providerConfigRef wiring.
SecretStore rendering
functions/render/230-secret-store.yaml.gotmpl
New template to conditionally render namespaced SecretStore or cluster ClusterSecretStore (via Crossplane Object) when secretStore.enabled and ESO is ready; configures SecretsManager provider, JWT serviceAccountRef, and optional protection Usage for deletion ordering.
Status output
functions/render/999-status.yaml.gotmpl
Render status.kmsKeyArn when present in state.
Render tests
tests/test-render/main.k
Added CompositionTest cases (3–10) validating KMS/SecretStore rendering, suppression, custom names, KMS ARN wiring, tags, and cluster-scoped SecretStore behavior.
Project config
upbound.yaml
Added provider dependencies: provider-aws-kms (>=v2) and provider-kubernetes (>=v1); updated Project description mentioning optional SOPS KMS and SecretStore.
E2E test config
tests/e2etest-secretstacks/main.k
Moved AutoEKSCluster to extraResources for separate deletion, bumped package/version and Kubernetes version, added SecretStack secretStore.scope: "Cluster", and adjusted cleanup behavior.
Documentation
README.md
Documented optional SecretStore and SOPS KMS key, added examples (rolePrefix+tags, cluster SecretStore, ESO-only), converted “What Gets Created” to conditional tables, and added make e2e to development commands.

Sequence Diagram(s)

sequenceDiagram
    participant Dev as Developer/CLI
    participant Render as Render Function
    participant Composition as Composition Engine
    participant Crossplane as Crossplane Providers
    participant ESO as ExternalSecrets Operator
    Dev->>Render: submit SecretStack spec (sops, secretStore, provider refs)
    Render->>Render: init state (kubernetesProviderConfigRef, sops, secretStore)
    Render->>Composition: emit KMS Key (if sops.enabled) and SecretStore objects (if secretStore.enabled and ESO ready)
    Composition->>Crossplane: apply KMS Key and Kubernetes Object resources
    Crossplane->>Composition: report observed statuses (kms-key ARN, ready conditions)
    Composition->>Render: provide observed resource statuses
    Render->>Dev: populate status.kmsKeyArn and final composed manifests
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐰 I hop through templates, bright and spry,

Keys and stores beneath the sky.
Tests align and CI hums along,
State reports the KMS song.
A tidy warren of manifests—cheerful and sprong.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The PR title 'Feat/sops' is vague and does not clearly convey the main changes, using a non-descriptive prefix that doesn't meaningfully summarize what SOPS integration entails. Revise the title to be more descriptive, such as 'Add SOPS KMS key and SecretStore support' or 'Implement SOPS encryption and AWS Secrets Manager integration' to clearly communicate the primary changes.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/sops

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

Published Crossplane Package

The following Crossplane package was published as part of this PR:

Package: ghcr.io/hops-ops/aws-secret-stack:pr-16-0d1576e2609d724454ffb6df34d5e875a34834fc

View Package

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@functions/render/000-state-init.yaml.gotmpl`:
- Around line 87-93: The template uses ($secretStoreSpec.enabled | default true)
and ($sopsSpec.enabled | default true), but Sprig's default treats explicit
false as empty; change these to explicit presence checks so false is preserved:
replace each use with an if/else that checks hasKey on the spec (e.g. if hasKey
$secretStoreSpec "enabled" then use $secretStoreSpec.enabled else true end) and
do the same for $sopsSpec.enabled so an explicit false is honored.

In `@README.md`:
- Line 16: The README's "Minimal" example incorrectly states the default scope
includes ClusterSecretStore; update the minimal example description to reflect
that the default scope is Namespaced and the default resource is SecretStore
(i.e., replace any mention of "ClusterSecretStore" with "SecretStore" and, if
present, explicitly note the default scope is Namespaced) so the documentation
matches the actual default behavior.

In `@tests/test-render/main.k`:
- Around line 368-403: The test header/comment for metav1alpha1.CompositionTest
with metadata.name = "secret-store-disabled" is misleading (says “renders
nothing” and mentions `Usage`) while the assertResources actually expect Helm +
PodIdentity; update the title/comment to accurately describe the expected result
(e.g., "SecretStore disabled renders Helm + PodIdentity" or similar) and remove
or correct the stray reference to `Usage` so the comment matches the assertions
in the test.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 98d65756-8ec6-45e1-beac-25efb0a12c91

📥 Commits

Reviewing files that changed from the base of the PR and between 822a375 and 33c333d.

📒 Files selected for processing (19)
  • .github/workflows/on-pr.yaml
  • .github/workflows/on-push-main.yaml
  • Makefile
  • README.md
  • apis/secretstacks/definition.yaml
  • examples/test/mocks/observed-resources/standard/steps/1/helm-external-secrets.yaml
  • examples/test/mocks/observed-resources/standard/steps/1/kms-key.yaml
  • examples/test/mocks/observed-resources/standard/steps/1/pod-identity.yaml
  • examples/test/mocks/observed-resources/standard/steps/2/helm-external-secrets.yaml
  • examples/test/mocks/observed-resources/standard/steps/2/kms-key.yaml
  • examples/test/mocks/observed-resources/standard/steps/2/pod-identity.yaml
  • examples/test/mocks/observed-resources/standard/steps/2/secret-store.yaml
  • functions/render/000-state-init.yaml.gotmpl
  • functions/render/010-state-status.yaml.gotmpl
  • functions/render/220-kms-key.yaml.gotmpl
  • functions/render/230-secret-store.yaml.gotmpl
  • functions/render/999-status.yaml.gotmpl
  • tests/test-render/main.k
  • upbound.yaml

Comment on lines +87 to +93
"enabled" ($secretStoreSpec.enabled | default true)
"scope" ($secretStoreSpec.scope | default "Namespaced")
"name" ($secretStoreSpec.name | default "default")
)
"sops" (dict
"enabled" ($sopsSpec.enabled | default true)
)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🌐 Web query:

In the Sprig template library, does default true .valuereturntruewhen.valueis explicitlyfalse?

💡 Result:

Yes, in the Sprig template library, default true .value returns true when .value is explicitly false.

Citations:


🏁 Script executed:

fd -t f "000-state-init.yaml.gotmpl" -x cat -n {}

Repository: hops-ops/aws-secret-stack

Length of output: 4279


🏁 Script executed:

# Check for other uses of | default true or | default false
rg '\| default (true|false)' functions/render/000-state-init.yaml.gotmpl -n

# Also check if there are other boolean defaults that might have the same issue
rg '\| default ' functions/render/000-state-init.yaml.gotmpl -n

Repository: hops-ops/aws-secret-stack

Length of output: 1994


🌐 Web query:

Is hasKey a valid Sprig function in Go templates?

💡 Result:

Yes, hasKey is a valid Sprig function in Go templates. It checks if a dictionary (dict) contains a given key and returns true if the key exists, false otherwise.

Citations:


🏁 Script executed:

# Verify hasKey syntax in Go templates and check if the proposed fix syntax is correct
rg 'hasKey' --type go --type template -A 2 -B 2 | head -30

Repository: hops-ops/aws-secret-stack

Length of output: 101


🏁 Script executed:

# Search for hasKey usage in all files
rg 'hasKey' -n

Repository: hops-ops/aws-secret-stack

Length of output: 51


🏁 Script executed:

# Check for conditional patterns with if statements in template files
rg 'if hasKey|if \(' functions/render/ -n -A 2

Repository: hops-ops/aws-secret-stack

Length of output: 51


🏁 Script executed:

# Look for if statements in the template files to see the pattern used
rg '{{-.*if ' functions/render/ -n -A 2 | head -40

Repository: hops-ops/aws-secret-stack

Length of output: 152


🏁 Script executed:

# Look for if statements in the template files
rg 'if ' functions/render/ -n -A 2 | head -40

Repository: hops-ops/aws-secret-stack

Length of output: 2880


🏁 Script executed:

# Search for any existing hasKey usage or similar patterns in the repository
find . -name "*.gotmpl" -o -name "*.tpl" | xargs rg -l "hasKey\|has " 2>/dev/null || echo "No matches found"

# Check if there are any assignment patterns like $var :=
rg '\$\w+ :=' functions/render/000-state-init.yaml.gotmpl -n

Repository: hops-ops/aws-secret-stack

Length of output: 1138


Fix enabled: false cannot be set for secretStore and sops due to Sprig default filter behavior.

Lines 87 and 92 use | default true, which treats explicit false as empty and replaces it with true per Sprig semantics. This breaks the ability to disable these features.

Proposed fix
 {{- $sopsSpec := $spec.sops | default dict }}
 {{- $secretStoreSpec := $spec.secretStore | default dict }}
+{{- $secretStoreEnabled := true }}
+{{- if hasKey $secretStoreSpec "enabled" }}
+  {{- $secretStoreEnabled = $secretStoreSpec.enabled }}
+{{- end }}
+{{- $sopsEnabled := true }}
+{{- if hasKey $sopsSpec "enabled" }}
+  {{- $sopsEnabled = $sopsSpec.enabled }}
+{{- end }}
 {{- $state := dict
   ...
   "secretStore" (dict
-    "enabled" ($secretStoreSpec.enabled | default true)
+    "enabled" $secretStoreEnabled
     "scope" ($secretStoreSpec.scope | default "Namespaced")
     "name" ($secretStoreSpec.name | default "default")
   )
   "sops" (dict
-    "enabled" ($sopsSpec.enabled | default true)
+    "enabled" $sopsEnabled
   )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@functions/render/000-state-init.yaml.gotmpl` around lines 87 - 93, The
template uses ($secretStoreSpec.enabled | default true) and ($sopsSpec.enabled |
default true), but Sprig's default treats explicit false as empty; change these
to explicit presence checks so false is preserved: replace each use with an
if/else that checks hasKey on the spec (e.g. if hasKey $secretStoreSpec
"enabled" then use $secretStoreSpec.enabled else true end) and do the same for
$sopsSpec.enabled so an explicit false is honored.

Comment thread README.md

## Usage

Minimal — installs ESO, PodIdentity, ClusterSecretStore, and SOPS KMS key:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Default scope is documented incorrectly in the minimal example description.

Line 16 says default includes ClusterSecretStore, but the default scope is Namespaced (so default resource is SecretStore).

📝 Suggested doc fix
-Minimal — installs ESO, PodIdentity, ClusterSecretStore, and SOPS KMS key:
+Minimal — installs ESO, PodIdentity, SecretStore (namespaced), and SOPS KMS key:
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Minimal — installs ESO, PodIdentity, ClusterSecretStore, and SOPS KMS key:
Minimal — installs ESO, PodIdentity, SecretStore (namespaced), and SOPS KMS key:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` at line 16, The README's "Minimal" example incorrectly states the
default scope includes ClusterSecretStore; update the minimal example
description to reflect that the default scope is Namespaced and the default
resource is SecretStore (i.e., replace any mention of "ClusterSecretStore" with
"SecretStore" and, if present, explicitly note the default scope is Namespaced)
so the documentation matches the actual default behavior.

Comment thread tests/test-render/main.k
Comment on lines +368 to +403
# Test 9: SecretStore disabled renders nothing
# ==========================================================================
metav1alpha1.CompositionTest {
metadata.name = "secret-store-disabled"
spec = {
compositionPath = "apis/secretstacks/composition.yaml"
xrdPath = "apis/secretstacks/definition.yaml"
timeoutSeconds = 60
validate = False
xr = {
apiVersion = "aws.hops.ops.com.ai/v1alpha1"
kind = "SecretStack"
metadata.name = "no-store"
spec = {
clusterName = "my-cluster"
secretStore.enabled = False
sops.enabled = False
aws.region = "us-east-1"
}
}
observedResources = [
{
apiVersion = "helm.hops.ops.com.ai/v1alpha1"
kind = "ExternalSecrets"
metadata = {
name = "no-store"
annotations = {"crossplane.io/composition-resource-name" = "helm-external-secrets"}
}
status.conditions = [
{type = "Ready", status = "True"}
{type = "Synced", status = "True"}
]
}
]
# Only Helm + PodIdentity + Usage, no SecretStore, no KMS Key
assertResources = [
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Align Test 9 title/comment with actual assertions.

The test says “renders nothing” and mentions Usage, but it asserts Helm + PodIdentity. This is only a naming/comment mismatch, but it can confuse future readers.

✏️ Suggested wording fix
-    # Test 9: SecretStore disabled renders nothing
+    # Test 9: SecretStore disabled skips SecretStore and KMS resources
...
-            # Only Helm + PodIdentity + Usage, no SecretStore, no KMS Key
+            # Only Helm + PodIdentity should render; no SecretStore, Usage, or KMS Key
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/test-render/main.k` around lines 368 - 403, The test header/comment for
metav1alpha1.CompositionTest with metadata.name = "secret-store-disabled" is
misleading (says “renders nothing” and mentions `Usage`) while the
assertResources actually expect Helm + PodIdentity; update the title/comment to
accurately describe the expected result (e.g., "SecretStore disabled renders
Helm + PodIdentity" or similar) and remove or correct the stray reference to
`Usage` so the comment matches the assertions in the test.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
tests/test-render/main.k (1)

168-222: Add coverage for the Usage render path.

The new SecretStore cases only assert the Object. None of them set observed.secretStore.ready and verify the Usage emitted by functions/render/230-secret-store.yaml.gotmpl, so the delete-order branch can regress silently.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/test-render/main.k` around lines 168 - 222, The test misses asserting
the Usage render path: update the "secret-store-default-namespaced"
CompositionTest (metav1alpha1.CompositionTest) to include an observed resource
entry that sets observed.secretStore.ready = True (i.e., simulate the
SecretStore being ready) and add an assertResources entry verifying the Usage
resource emitted by functions/render/230-secret-store.yaml.gotmpl (the Usage
object and its expected fields/owner reference), so the test covers the
delete-order branch and the Usage render path.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@functions/render/230-secret-store.yaml.gotmpl`:
- Line 12: The template currently gates rendering of the SecretStore on
$ss.enabled and $state.observed.helmExternalSecrets.ready which causes
long‑lived SecretStore resources to be dropped when ESO is transiently NotReady;
change the condition so SecretStore rendering is gated by CRD availability (e.g.
a CRD-ready flag in $state.observed.helmExternalSecrets or by presence of the
SecretStore object) instead of the transient ready condition, and ensure the
Usage resource only waits for CRD availability (not ESO Ready) so the
delete-order guard is present during create; update the conditional around
$ss.enabled/$state.observed.helmExternalSecrets.ready and the Usage gating logic
to reference the CRD-ready/existence check while leaving SecretStore rendering
once the object exists.

---

Nitpick comments:
In `@tests/test-render/main.k`:
- Around line 168-222: The test misses asserting the Usage render path: update
the "secret-store-default-namespaced" CompositionTest
(metav1alpha1.CompositionTest) to include an observed resource entry that sets
observed.secretStore.ready = True (i.e., simulate the SecretStore being ready)
and add an assertResources entry verifying the Usage resource emitted by
functions/render/230-secret-store.yaml.gotmpl (the Usage object and its expected
fields/owner reference), so the test covers the delete-order branch and the
Usage render path.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 226227a5-f879-4f50-a265-0e701f174898

📥 Commits

Reviewing files that changed from the base of the PR and between 33c333d and 84df01a.

📒 Files selected for processing (2)
  • functions/render/230-secret-store.yaml.gotmpl
  • tests/test-render/main.k


{{- $ss := $state.secretStore }}

{{- if and $ss.enabled $state.observed.helmExternalSecrets.ready }}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Don't key long-lived resources off transient Ready conditions.

Line 12 drops the SecretStore from desired state whenever ESO is temporarily NotReady, so a chart upgrade or sync blip can make Crossplane delete it even though the CRDs still exist. Line 78 also delays the Usage until the store is Ready, which leaves the delete-order guard absent during creation. Gate initial creation on CRD availability, but keep rendering once the SecretStore object exists.

Also applies to: 78-78

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@functions/render/230-secret-store.yaml.gotmpl` at line 12, The template
currently gates rendering of the SecretStore on $ss.enabled and
$state.observed.helmExternalSecrets.ready which causes long‑lived SecretStore
resources to be dropped when ESO is transiently NotReady; change the condition
so SecretStore rendering is gated by CRD availability (e.g. a CRD-ready flag in
$state.observed.helmExternalSecrets or by presence of the SecretStore object)
instead of the transient ready condition, and ensure the Usage resource only
waits for CRD availability (not ESO Ready) so the delete-order guard is present
during create; update the conditional around
$ss.enabled/$state.observed.helmExternalSecrets.ready and the Usage gating logic
to reference the CRD-ready/existence check while leaving SecretStore rendering
once the object exists.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
tests/e2etest-secretstacks/main.k (1)

218-222: Minor syntax inconsistency.

Line 221 uses colon (:) for property assignment while adjacent lines use equals (=). KCL accepts both, but consistent style improves readability.

🔧 Suggested fix for consistency
                         tags = {
                             "e2etest" = "true"
                             "test-run" = _now
-                            "repo": "https://github.com/hops-ops/aws-secret-stack"
+                            "repo" = "https://github.com/hops-ops/aws-secret-stack"
                         }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/e2etest-secretstacks/main.k` around lines 218 - 222, The tags map has a
mixed assignment style: two entries use = while the "repo" entry uses :, so
update the "tags" mapping to use consistent equals assignment for the "repo" key
(i.e., change the "repo": "https://github.com/hops-ops/aws-secret-stack" entry
to use =) to match the other keys in the tags map.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@tests/e2etest-secretstacks/main.k`:
- Around line 218-222: The tags map has a mixed assignment style: two entries
use = while the "repo" entry uses :, so update the "tags" mapping to use
consistent equals assignment for the "repo" key (i.e., change the "repo":
"https://github.com/hops-ops/aws-secret-stack" entry to use =) to match the
other keys in the tags map.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c17c9681-b647-4276-a1e2-804a81cf1bf9

📥 Commits

Reviewing files that changed from the base of the PR and between 84df01a and cee8362.

📒 Files selected for processing (3)
  • .github/workflows/on-pr.yaml
  • .github/workflows/on-push-main.yaml
  • tests/e2etest-secretstacks/main.k
🚧 Files skipped from review as they are similar to previous changes (2)
  • .github/workflows/on-pr.yaml
  • .github/workflows/on-push-main.yaml

@patrickleet patrickleet merged commit 7378979 into main Apr 3, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant