OSAC-1677: drop kustomize from CI deployment pipeline - #398
omer-vishlitzky merged 10 commits into
Conversation
Remove all kustomize overlays, base kustomization files, GH Actions workflow, build scripts, and references from the installer. Deployment is now Helm-only. - Delete overlays/, base/kustomization.yaml, base/shared/, base/hub-access/ - Delete .github/workflows/kustomize-build.yaml, scripts/kustomize-build-all.sh - Delete scripts/refresh-after-snapshot.sh (kustomize-era refresh) - Delete all prerequisites/*/kustomization.yaml files - Rewrite setup.sh, teardown.sh, sync-image-tags.sh, aap-configuration.sh to remove kustomize code paths - Convert prereq installation from oc apply -k to oc apply -f - Update keycloak deployment images from bare names to full refs - Rewrite AGENTS.md, README.md, prerequisites/README.md, .ai-bot/* - Update helm-deployment-guide.md, aap-configuration.md, OSAC-CLI-HOWTO.md Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
@omer-vishlitzky: This pull request references OSAC-1677 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "5.0.0" version, but no target version was set. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: omer-vishlitzky The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
|
Warning Review limit reached
Next review available in: 2 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Repository: osac-project/coderabbit/.coderabbit.yaml Review profile: ASSERTIVE Plan: Enterprise Run ID: 📒 Files selected for processing (18)
WalkthroughThe deployment mechanism is migrated from Kustomize overlays to a Helm umbrella chart. Installer scripts (setup.sh, teardown.sh, aap-configuration.sh, sync-image-tags.sh, and namespace-resolution helpers) are rewritten to use Helm and environment-scoped values files. AI-bot automation configs, AGENTS.md, README.md, and other docs are updated accordingly, and numerous Kustomize base/overlay manifests and scripts are removed. ChangesKustomize to Helm migration
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant Operator
participant SetupScript as setup.sh
participant Cluster as OpenShift Cluster
participant Helm
Operator->>SetupScript: Run ./scripts/setup.sh
SetupScript->>Cluster: Apply prerequisites (cert-manager, Keycloak)
SetupScript->>Cluster: Create namespace, ca-bundle, secrets
SetupScript->>Cluster: Label pre-created resources for Helm adoption
SetupScript->>Helm: helm upgrade --install charts/osac with VALUES_FILE
Helm->>Cluster: Deploy OSAC chart resources
SetupScript->>Cluster: Run aap-configuration.sh, wait for bootstrap job
Cluster-->>SetupScript: Bootstrap job complete
SetupScript-->>Operator: Setup finished
Estimated code review effort: 4 (Complex) | ~60 minutes Suggested labels: documentation, infrastructure, breaking-change Suggested reviewers: none identified from the provided diff Poem: 🚥 Pre-merge checks | ✅ 5 | ❌ 6❌ Failed checks (6 inconclusive)
✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 10
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
prerequisites/keycloak/service/deployment.yaml (1)
38-52: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick winAvoid
:latestimage tags for reproducible deployments.Both
wait-for-databaseandkeycloakcontainers now pull:latestinstead of a pinned version. Combined withimagePullPolicy: IfNotPresent, this makes deployments non-reproducible: different clusters/nodes can silently drift to different image versions depending on cache state, and upstream releases can introduce breaking changes without any corresponding change in this repo.Pin to a specific, known-good tag (or digest) for both images.
🔒 Suggested fix
initContainers: - name: wait-for-database - image: quay.io/sclorg/postgresql-18-c10s:latest + image: quay.io/sclorg/postgresql-18-c10s:c10s imagePullPolicy: IfNotPresentcontainers: - name: keycloak - image: quay.io/keycloak/keycloak:latest + image: quay.io/keycloak/keycloak:26.0 imagePullPolicy: IfNotPresent🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@prerequisites/keycloak/service/deployment.yaml` around lines 38 - 52, The deployment manifest for the Keycloak workload is using mutable `:latest` tags for both the `wait-for-database` initContainer and the `keycloak` container, which makes the rollout non-reproducible. Update the image references in `deployment.yaml` to pinned, known-good versions or digests, and keep `imagePullPolicy` consistent with that choice so the `wait-for-database` and `keycloak` definitions always resolve to the same image versions.scripts/sync-image-tags.sh (1)
37-39: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winTag-mode lookup lacks the
|| trueguard the inline branch has.Line 50 protects its command substitution with
|| true, but line 38 does not. Underpipefail+errexit, if thetag:line is not the immediate line afterrepository:(e.g. reordered/annotated values),grep "tag:"fails, the pipe returns non-zero, and the script aborts before the[[ -z "${current}" ]] && continuefallback on line 39 can run. Add|| truefor symmetry and resilience.🛡️ Proposed guard
- current=$(grep -A1 "repository: ghcr.io/osac-project/${component}$" "${values_file}" | grep "tag:" | awk '{print $2}') + current=$(grep -A1 "repository: ghcr.io/osac-project/${component}$" "${values_file}" | grep "tag:" | awk '{print $2}' || true)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/sync-image-tags.sh` around lines 37 - 39, The tag-mode lookup in sync-image-tags.sh is missing the same failure guard used by the inline branch, so a non-matching grep pipeline can abort the script before the empty-value fallback runs. Update the command substitution assigned to current in the tag-based repository lookup to include a trailing || true, matching the inline branch behavior, and keep the existing [[ -z "${current}" ]] check as the fallback. Use the grep/AWK pipeline around current in the component loop as the place to apply the fix.docs/helm-deployment-guide.md (1)
637-641: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winKeep the copy example in the documented values layout.
values/my-env.yamlbreaks the repo convention ofvalues/<env>/values.yamland will make the later Helm examples inconsistent.Fix
-cp values/development/values.yaml values/my-env.yaml +mkdir -p values/my-env +cp values/development/values.yaml values/my-env/values.yaml🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/helm-deployment-guide.md` around lines 637 - 641, The copy example in the Helm guide uses an inconsistent target path and should follow the repo’s values layout. Update the example in the deployment guide so it copies to the documented `values/<env>/values.yaml` structure instead of `values/my-env.yaml`, keeping the naming consistent with the rest of the Helm examples and the values directory convention.Source: Path instructions
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.ai-bot/config.yaml:
- Around line 12-16: The validation list is missing the per-values-file render
check, so update the configuration used by the validation workflow to include
the same templating step that iterates through each values file under
values/*/values.yaml. Add this alongside the existing validation_commands in the
config so the environment-specific render check runs in CI, and make sure the
command targets the chart referenced by the helm lint setup.
In @.ai-bot/feedback-workflow.md:
- Around line 28-31: The post-change validation workflow is missing the chart
template render check for each values file, so update the validation steps
alongside helm lint in the feedback workflow to also run the same templating
command used by CI against every values/*/values.yaml file. Keep this near the
existing chart validation in the workflow so it catches values-specific
rendering failures before review.
In @.ai-bot/instructions.md:
- Around line 88-92: The “What Not to Modify” guardrail in instructions.md is
missing one submodule from the repository structure, so update that exclusion
list to also include base/bare-metal-fulfillment-operator/ alongside the
existing submodule paths. Keep the wording consistent with the current bullet
list so the ignore rule clearly covers every submodule mentioned in the repo
layout.
- Around line 23-35: The validation section is missing the environment-specific
Helm rendering step, so update the playbook to include a per-values-file
template pass alongside helm lint. Add the same check CI uses by templating
charts/osac/ against each values/*/values.yaml file, and keep the guidance in
the validation list near helm lint and the image tag sync step so it is easy to
find.
In @.ai-bot/new-ticket-workflow.md:
- Around line 23-28: The validation steps in the new-ticket workflow are missing
the same per-environment Helm rendering check used by CI, so update the workflow
instructions to include the `helm template` pass for every
`values/*/values.yaml` file alongside the existing `yamllint`, `pre-commit`,
`helm lint`, and sync script steps. Keep this aligned with the CI validation
flow in the new-ticket workflow document so rendering failures are caught before
merge.
In `@AGENTS.md`:
- Around line 36-47: The fenced code block in AGENTS.md is missing a language
tag, which triggers markdownlint. Update the bare fence in the chart/values
directory listing snippet to use the appropriate language tag (text) while
keeping the content unchanged, so the rendered output stays the same and the
linter passes.
In `@README.md`:
- Around line 249-250: Create the target values directory before the copy step
in the README example, since the current cp command in the values setup
instructions assumes values/<project-name> already exists. Update the setup
guidance around the values/development/values.yaml copy so it explicitly
includes creating values/<project-name> first, then copying the file, using the
same values path references shown in the existing instructions.
- Around line 118-120: The README submodule setup commands are using git
submodule update with --remote, which pulls moving branch tips instead of the
pinned commits. Update both submodule init commands in the README to remove
--remote and keep them aligned with the snapshot workflow, preserving the
checked-in submodule state and image tags.
In `@scripts/setup.sh`:
- Around line 307-322: The Helm adoption loop in setup.sh is applying Helm
labels/annotations to a shared configmap/ca-bundle that is not owned by
charts/osac. Remove ca-bundle from the resource list processed by the adoption
block, and only keep fulfillment-db in this loop when bundledPostgres.enabled is
true so the adoption logic matches the chart-managed resources. Use the existing
setup.sh adoption section and the resource entries in the for-loop to locate the
change.
- Around line 262-263: The explicit osac-controller secret error path in
setup.sh is currently unreachable because the FC_CLIENT_SECRET jq assignment
fails fast under set -e before the [[ -n ... ]] check can run. Update the secret
lookup around FC_CLIENT_SECRET so the jq failure does not abort the script
immediately, letting the subsequent empty-value check execute and print the
custom error message; keep the existing validation flow intact in that block.
---
Outside diff comments:
In `@docs/helm-deployment-guide.md`:
- Around line 637-641: The copy example in the Helm guide uses an inconsistent
target path and should follow the repo’s values layout. Update the example in
the deployment guide so it copies to the documented `values/<env>/values.yaml`
structure instead of `values/my-env.yaml`, keeping the naming consistent with
the rest of the Helm examples and the values directory convention.
In `@prerequisites/keycloak/service/deployment.yaml`:
- Around line 38-52: The deployment manifest for the Keycloak workload is using
mutable `:latest` tags for both the `wait-for-database` initContainer and the
`keycloak` container, which makes the rollout non-reproducible. Update the image
references in `deployment.yaml` to pinned, known-good versions or digests, and
keep `imagePullPolicy` consistent with that choice so the `wait-for-database`
and `keycloak` definitions always resolve to the same image versions.
In `@scripts/sync-image-tags.sh`:
- Around line 37-39: The tag-mode lookup in sync-image-tags.sh is missing the
same failure guard used by the inline branch, so a non-matching grep pipeline
can abort the script before the empty-value fallback runs. Update the command
substitution assigned to current in the tag-based repository lookup to include a
trailing || true, matching the inline branch behavior, and keep the existing [[
-z "${current}" ]] check as the fallback. Use the grep/AWK pipeline around
current in the component loop as the place to apply the fix.
🪄 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: Repository: osac-project/coderabbit/.coderabbit.yaml
Review profile: ASSERTIVE
Plan: Enterprise
Run ID: 58ab3830-e05e-4ddc-9c0b-e9ee26e55fa9
📒 Files selected for processing (90)
.ai-bot/config.yaml.ai-bot/feedback-workflow.md.ai-bot/instructions.md.ai-bot/new-ticket-workflow.md.github/workflows/kustomize-build.yamlAGENTS.mdOSAC-CLI-HOWTO.mdREADME.mdbase/fulfillment-service/controller/deployment.yamlbase/hub-access/README.mdbase/hub-access/kustomization.yamlbase/hub-access/rbac.yamlbase/hub-access/sa.yamlbase/hub-access/secret.yamlbase/kustomization.yamlbase/nameReference.yamlbase/shared/kustomization.yamlbase/shared/namespace.yamlcharts/osac/templates/operator-rbac-supplement.yamldocs/aap-configuration.mddocs/helm-deployment-guide.mdoverlays/_shared/console-proxy-shared-dev/kustomization.yamloverlays/_shared/console-proxy-shared-dev/secret-reader-rolebinding.yamloverlays/caas-ci/.buildfilesoverlays/caas-ci/ca-trust-bundle.yamloverlays/caas-ci/console-proxy-replacements.yamloverlays/caas-ci/files/osac-aap-configuration.envoverlays/caas-ci/files/osac-aap-secrets.env.exampleoverlays/caas-ci/kustomization.yamloverlays/caas-ci/prefixTransformer.yamloverlays/development/.buildfilesoverlays/development/ca-trust-bundle.yamloverlays/development/capi-provider-role.yamloverlays/development/console-proxy-replacements.yamloverlays/development/files/clouds.yaml.exampleoverlays/development/files/inventory.yaml.exampleoverlays/development/files/management.yaml.exampleoverlays/development/files/osac-aap-configuration.envoverlays/development/files/osac-aap-secrets.env.exampleoverlays/development/files/profile.yaml.exampleoverlays/development/kustomization.yamloverlays/development/prefixTransformer.yamloverlays/hypershift2/console-proxy-replacements.yamloverlays/hypershift2/externalsecrets/cluster-fulfillment-ig.yamloverlays/hypershift2/externalsecrets/config-as-code-manifest-ig.yamloverlays/hypershift2/externalsecrets/default-cluster-credentials.yamloverlays/hypershift2/externalsecrets/kustomization.yamloverlays/hypershift2/externalsecrets/quay-pull-secret.yamloverlays/hypershift2/kustomization.yamloverlays/osac-integration/.buildfilesoverlays/osac-integration/README.mdoverlays/osac-integration/ca-trust-bundle.yamloverlays/osac-integration/console-proxy-replacements.yamloverlays/osac-integration/files/osac-aap-configuration.envoverlays/osac-integration/files/osac-aap-secrets.env.exampleoverlays/osac-integration/kustomization.yamloverlays/osac-integration/prefixTransformer.yamloverlays/vmaas-ci/.buildfilesoverlays/vmaas-ci/ca-trust-bundle.yamloverlays/vmaas-ci/console-proxy-replacements.yamloverlays/vmaas-ci/kustomization.yamloverlays/vmaas-ci/prefixTransformer.yamlprerequisites/README.mdprerequisites/aap-installation.yamlprerequisites/cert-manager/kustomization.yamlprerequisites/cnv/kustomization.yamlprerequisites/keycloak/database/kustomization.yamlprerequisites/keycloak/kustomization.yamlprerequisites/keycloak/service/deployment.yamlprerequisites/keycloak/service/kustomization.yamlprerequisites/kustomization.yamlprerequisites/lvms/kustomization.yamlprerequisites/mce/kustomization.yamlprerequisites/metallb/kustomization.yamlprerequisites/nfs-subdir-provisioner/base/kustomization.yamlprerequisites/nfs-subdir-provisioner/overlays/lab/kustomization.yamlscripts/aap-configuration.shscripts/ensure-ca-bundle.shscripts/kustomize-build-all.shscripts/prepare-aap.shscripts/prepare-fulfillment-service.shscripts/prepare-tenant.shscripts/refresh-after-snapshot.shscripts/setup-remote-cluster.shscripts/setup.shscripts/sync-image-tags.shscripts/teardown.shvalues/caas-ci/values.yamlvalues/development/values.yamlvalues/vmaas-ci/values.yaml
💤 Files with no reviewable changes (65)
- base/nameReference.yaml
- prerequisites/mce/kustomization.yaml
- base/hub-access/README.md
- overlays/osac-integration/.buildfiles
- overlays/vmaas-ci/.buildfiles
- overlays/hypershift2/externalsecrets/config-as-code-manifest-ig.yaml
- overlays/development/.buildfiles
- prerequisites/nfs-subdir-provisioner/overlays/lab/kustomization.yaml
- overlays/osac-integration/files/osac-aap-secrets.env.example
- overlays/development/files/inventory.yaml.example
- overlays/_shared/console-proxy-shared-dev/kustomization.yaml
- overlays/_shared/console-proxy-shared-dev/secret-reader-rolebinding.yaml
- base/hub-access/kustomization.yaml
- overlays/development/files/profile.yaml.example
- overlays/caas-ci/.buildfiles
- base/hub-access/secret.yaml
- prerequisites/keycloak/database/kustomization.yaml
- overlays/development/ca-trust-bundle.yaml
- prerequisites/keycloak/service/kustomization.yaml
- base/hub-access/sa.yaml
- overlays/hypershift2/kustomization.yaml
- overlays/vmaas-ci/kustomization.yaml
- overlays/vmaas-ci/console-proxy-replacements.yaml
- prerequisites/kustomization.yaml
- overlays/osac-integration/files/osac-aap-configuration.env
- prerequisites/nfs-subdir-provisioner/base/kustomization.yaml
- prerequisites/lvms/kustomization.yaml
- base/shared/kustomization.yaml
- overlays/development/kustomization.yaml
- scripts/kustomize-build-all.sh
- overlays/development/files/management.yaml.example
- overlays/hypershift2/externalsecrets/quay-pull-secret.yaml
- overlays/development/console-proxy-replacements.yaml
- overlays/caas-ci/prefixTransformer.yaml
- overlays/osac-integration/README.md
- overlays/caas-ci/kustomization.yaml
- overlays/osac-integration/console-proxy-replacements.yaml
- overlays/osac-integration/ca-trust-bundle.yaml
- base/shared/namespace.yaml
- overlays/development/files/osac-aap-configuration.env
- overlays/vmaas-ci/ca-trust-bundle.yaml
- prerequisites/cert-manager/kustomization.yaml
- overlays/hypershift2/externalsecrets/cluster-fulfillment-ig.yaml
- overlays/caas-ci/console-proxy-replacements.yaml
- base/kustomization.yaml
- base/hub-access/rbac.yaml
- overlays/vmaas-ci/prefixTransformer.yaml
- overlays/osac-integration/kustomization.yaml
- prerequisites/cnv/kustomization.yaml
- overlays/hypershift2/console-proxy-replacements.yaml
- base/fulfillment-service/controller/deployment.yaml
- overlays/caas-ci/files/osac-aap-secrets.env.example
- overlays/development/capi-provider-role.yaml
- overlays/development/files/clouds.yaml.example
- overlays/development/prefixTransformer.yaml
- scripts/refresh-after-snapshot.sh
- overlays/development/files/osac-aap-secrets.env.example
- overlays/caas-ci/ca-trust-bundle.yaml
- .github/workflows/kustomize-build.yaml
- overlays/caas-ci/files/osac-aap-configuration.env
- prerequisites/keycloak/kustomization.yaml
- overlays/osac-integration/prefixTransformer.yaml
- overlays/hypershift2/externalsecrets/default-cluster-credentials.yaml
- overlays/hypershift2/externalsecrets/kustomization.yaml
- prerequisites/metallb/kustomization.yaml
…heck
- Create keycloak ConfigMaps (db-server-config, db-access-config, realm)
explicitly via oc create configmap before applying keycloak resources.
These were previously generated by kustomize configMapGenerator.
- Add externalip{pools,s,attachments} RBAC entries to Helm hub-access
Role — was in kustomize base/hub-access/rbac.yaml but never ported.
- Remove duplicate AAP namespace check for -n aap in setup.sh.
- Update keycloak install docs in README, prerequisites/README,
helm-deployment-guide to include ConfigMap creation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Update aap-configuration.md, dns-backend.md, network-backend.md to remove references to deleted osac-aap-configuration.env, osac-aap-secrets.env, and overlay files/ directory. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ardown timeout - Fix VALUES_FILE default from values/development.yaml to values/development/values.yaml (pre-existing bug). - Remove dead DEPLOY_MODE variable and its usage in setup target. - Bump helm uninstall timeout from 5m to 20m. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Drop --remote from submodule init in README (defeats image pinning) - Add mkdir -p before cp in values customization docs - Fix values/my-env.yaml to values/my-env/values.yaml in helm guide - Guard jq -er with || true so set -e doesn't mask the error message - Remove ca-bundle from Helm adoption loop (trust-manager-managed) - Add || true to sync-image-tags grep pipeline under pipefail - Remove inaccurate managed-by label from AAP prerequisites Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…p only Keycloak is already installed on the snapshot. The old oc apply -k re-applied all keycloak resources (StatefulSet, Deployment, certs, services) as a no-op. Replace with a targeted realm configmap update — the only thing that actually changes between snapshot bake and refresh. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Set KC_SPI_IMPORT_REALM_FILE_STRATEGY=OVERWRITE so keycloak overwrites the existing realm from the configmap on every startup instead of silently skipping the import when the realm already exists in the database. Fixes stale realm configuration in CI snapshot boots. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This reverts commit 4ab2ee9.
Set KC_SPI_IMPORT_REALM_FILE_STRATEGY=OVERWRITE on the keycloak deployment during snapshot refresh only. This forces keycloak to re-import the realm from the configmap instead of silently skipping when the realm already exists in the database from the snapshot. Applied via oc set env in the refresh script (CI-only), not in the base deployment yaml, so dev clusters are unaffected. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add per-values-file helm template render check to all .ai-bot validation commands (config.yaml, instructions.md, feedback-workflow, new-ticket-workflow) - Add bare-metal-fulfillment-operator to submodule exclusion list - Add language tag to AGENTS.md fenced code block Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Summary
oc apply -ktooc apply -fKC_SPI_IMPORT_REALM_FILE_STRATEGY=OVERWRITEduring snapshot refresh so realm.json changes are always appliedTest plan
helm lint charts/osac/passesscripts/sync-image-tags.shpassesyamllint --strict .passessetup.shfrom scratch)🤖 Generated with Claude Code