KubernetesTemplateRendering
The invoca-kubernetes_template gem is a thin wrapper around jsonnet and erb to allow for the generation of
Kubernetes manifests from a set of templates combined with a definitions.yaml file which stores environmental
configuration for various deployment environments.
Installation
Install the gem and add to the application's Gemfile by executing:
bundle add kubernetes_template_rendering
If bundler is not being used to manage dependencies, install the gem by executing:
gem install kubernetes_template_rendering
Usage
This gem is meant to be used as a command line tool for rendering templates that are either written in jsonnet or erb.
To use this gem you can either install it, and use the render_kubernetes_template executable directly, or you can use
gem exec to execute the command without first installing the gem.
Example Usage
gem exec -g kubernetes_template_rendering render_templates \
--jsonnet-library-path deployment/vendor \
--rendered-directory path/to/resources \
deployment/templates
Options
To see a full list of options and how to use them, run the following command:
gem exec -g kubernetes_template_rendering render_templates --help
Cleaning up stale output: --prune vs --reconcile
Both flags remove output left over from templates/entries that no longer render, but they differ in how:
--prunedeletes each entry's output directory withrm -rfbefore rendering. It never removes the directories of fully deleted/renamed entries and can clobber sibling directories when one entry renders at a prefix root above another.--reconcileperforms a safer, bounded sweep: it touches a marker, renders, then deletes only files older than the marker under each scope root<region>/<cluster_type>/<color>/(honoring--cluster_type/--region/--color), and finally removes any now-empty directories. This cleans up directories of deleted/renamed entries without clobbering freshly-rendered siblings, and two identical reconcile runs produce the same result.
Notes:
--reconcileand--pruneare mutually exclusive (passing both exits with an error).--reconcileand--onlyare likewise mutually exclusive, since a filtered render would leave un-rendered siblings looking stale under the shared base root.spp/subtrees are fenced out of the base sweep. Without--spp, only theSPP-PLACEHOLDERsubtree is swept. With--spp NAME, reconcile sweepsSPP-PLACEHOLDER(always re-rendered, as the expansion source) plus each requested per-SPP subtree, leaving unrequested SPP siblings intact. Deleted-SPP cleanup for unrequested siblings remains a manualgit rmin the teardown runbook. See ADR-0002.- If any rendered entry resolves to a path outside its scope prefix (a full-path or relative
..escape), reconcile hard-errors before deleting anything. - Reconcile enforces the SPP layout: every SPP entry (name contains
SPP-PLACEHOLDER) must render under<region>/<cluster_type>/<color>/spp/SPP-PLACEHOLDER/, and no non-SPP entry may render under anspp/segment. Adirectory:override that still resolves to that prefix is allowed; anything else hard-errors before rendering. (This guard runs only under--reconcile.) See ADR-0002.
Filtering to specific entries
Pass --only NAME (repeatable) to render only the definitions.yaml entries whose top-level key exactly matches NAME. Composes with --cluster_type/--region/--color/--spp — all filters are AND'd.
gem exec -g kubernetes_template_rendering render_templates \
--rendered-directory path/to/resources \
--cluster_type staging \
--only staging.test \
deployment/templates
Useful when one --cluster_type matches multiple sibling entries (e.g. staging and staging.test both match --cluster_type staging after the suffix-strip rule) and you want to render only one of them. Repeated --only values are deduped.
If an --only value matches no entry across any template directory, the gem raises with the list of valid keys so the caller can self-correct.
Staging Partial Platforms
Pass --spp NAME (repeatable) to expand any entry whose definitions.yaml name contains SPP-PLACEHOLDER into a per-SPP sibling output. Substitutes SPP-PLACEHOLDER with NAME and the PLACEHOLDER suffix with the suffix of NAME (everything after the last -), in both file paths and contents. Source mtimes are preserved.
gem exec -g kubernetes_template_rendering render_templates \
--rendered-directory path/to/resources \
--spp staging-qa02a \
--spp staging-qa08a \
deployment/templates
This is purely additive — the placeholder-bearing output tree is still produced, and per-SPP trees are written alongside it. Repeated --spp values are deduped.
Development
After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/invoca/kubernetes_template_rendering.