Day-2 tasks: feature-branch development, adding federations, adding clusters, adding shared apps, customising values.
To deploy a feature branch alongside main without disturbing it:
The hook prevents accidentally committing main revisions while on a feature branch (and runs the AppProject RBAC lint).
cp .githooks/pre-commit .git/hooks/
chmod +x .git/hooks/pre-commitIf your changes need base/mip-infrastructure/mip-infrastructure.yaml to track your branch, edit:
spec.generators[*].git.revisionspec.template.spec.source.targetRevision
Change main → <your-branch>. The pre-commit hook blocks the commit if you forget.
Same flow as the main bootstrap, but scoped to your branch name:
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
SAFE_BRANCH_NAME=$(echo "$CURRENT_BRANCH" | sed 's/[^a-zA-Z0-9]/-/g')
# Refresh the AppProject generators from your branch
kubectl apply -f base/argo-projects/argo-projects.yaml
argocd app create "${SAFE_BRANCH_NAME}-infra-clusterset" \
--repo https://github.com/Medical-Informatics-Platform/mip-infra.git \
--path base/mip-infrastructure \
--revision "$CURRENT_BRANCH" \
--project mip-argo-project-infrastructure \
--dest-server https://kubernetes.default.svc \
--dest-namespace argocd-mip-team
argocd app sync "${SAFE_BRANCH_NAME}-infra-clusterset"
argocd app get "${SAFE_BRANCH_NAME}-infra-clusterset"argocd app delete "${SAFE_BRANCH_NAME}-infra-clusterset" --yes
argocd app delete "${SAFE_BRANCH_NAME}-argo-projects" --yes- Create a new directory under
deployments/local/federations/, e.g.federation-B/in the correct repository. - Copy
kustomization.yamlandcustomizations/from an existing federation (thefederation-Askeleton is a good starting point). - Update
namePrefixinkustomization.yamlto your federation name. - Adjust per-federation values in
customizations/. - Commit and push to the branch the ApplicationSet tracks. The
mip-infrastructureApplicationSet auto-discovers the new directory and creates the wrapper Application;argo-projectsApplicationSet creates the matchingmip-argo-project-federation-<name>AppProject. - Provision the per-federation secrets — see getting-started.md §6.
- Notebooks need no RBAC step: within five minutes the
mip-notebook-rbac-managerCronJob binds the notebook operator and JupyterHub in the new namespace and adds it to the operator's watch list. Check withkubectl -n federation-<name> get rolebinding mip-notebook-operator mip-jupyterhub.
- Create
deployments/hybrid/federations/<federation>/mip-infrastructure/fromfederation-Z: the kustomization, thecustomizations/,network-policies.yamlandsubmariner-policies/(worker DNS entries, oneipBlockper remote node, ServiceExports). - Copy
deployments/hybrid/federations/<federation>/remote-node/as the procedure handed to each remote site. - Commit and push. Both ApplicationSets discover
deployments/hybrid/federations/*/mip-infrastructure. - Provision the per-federation secrets as for a local federation.
- Join each remote node — see hybrid-federations.md.
- Notebook RBAC follows the namespace label as for a local federation (step 7 above).
The proxy (common/notebook-operator/manifests/api-proxy.yaml) is deployed and verified
before any hub uses it; the hub side needs the madgik/mip chart value
jupyterhub.apiProxy (see
how-to-implement-the-notebook-properly.md).
- Check the proxy:
kubectl -n mip-notebooks-system get deploy notebook-api-proxy certificate notebook-api-proxyandkubectl -n federation-<x> get configmap notebook-api-proxy-ca. - Set
jupyterhub.apiProxy.enabled: trueindeployments/shared-apps/mip-stack/values.yaml; sync; spawn a notebook. - Set
apiServer.hubDirect: falseincommon/security/federation/values.yaml; sync; spawn again. The hub can no longer reach the API server directly.
See hybrid-federations.md and the step-by-step runbook in deployments/hybrid/federations/<federation>/remote-node/README.md.
Each federation patches the shared app templates from deployments/shared-apps/. To override values:
- Edit
deployments/local/federations/<fed>/customizations/<app>-values.yaml. - If you need structural overrides, modify the matching kustomize patch(e.g.
exareme2-kustomize.yaml).
Argo CD detects the change on the next sync.
To make a new application available to every federation:
- Add the app under
deployments/shared-apps/<my-app>/(manifests or Helm chart + values). - Reference it from each federation's
kustomization.yamlthat should pull it in. - Verify the destination AppProject permits the resource kinds your app needs by reviewing the relevant manifests under
../projects/static/or../projects/templates/federation/.
See argo-setup/README.md.
Two bots keep dependencies current, split by ecosystem. Nothing is automerged — every PR needs human review.
The Mend Renovate GitHub App opens PRs on its recurring schedule (roughly hourly), configured in renovate.json5 at the repo root. The Dependency Dashboard issue on GitHub lists every tracked dependency and pending update.
- External app charts (exareme2, mip-stack, datacatalog): bumps the
targetRevisioncommit SHA and its# <version>comment together, resolved from the upstream repo's tags. The shared-apps baselines and the per-federation overrides underdeployments/hybrid/federations/**get separate PRs; the exareme2 chart SHA andexaflow_images.versionmove in one PR. - Argo CD upstream (
argo-setup/patches/kustomization.yaml): bump PRs automatically trigger the ClusterRole drift check and the kind smoke test — follow argo-setup/README.md before merging. - Submariner charts, the ECK/Elastic stack (annotated
version:/tag:keys incommon/monitoring/eck/values.yaml, grouped into one PR), and the HAProxy ingress controller image. - yq/kustomize CI binaries: version and SHA256 checksum are bumped together (checksum resolved from the GitHub release assets).
Deliberately ignored: bitnami/kubectl in the submariner copy-secret hook (the hook is scheduled for removal).
.github/dependabot.yml updates action versions monthly, grouped into a single PR, keeping the SHA-pinned-with-# vX.Y.Z-comment style. Renovate's github-actions manager is disabled so the two bots never open duplicate PRs.