Templated packages
Luet supports the sprig rendering engine template, like helm. It’s being used to interpolate build.yaml and finalize.yaml files before their execution. The following document assumes you are familiar with the helm templating.
The build.yaml and finalize.yaml files are rendered during build time, and it’s possible to use the helm templating syntax inside such files. The definition.yaml file will be used to interpolate templating values available in build.yaml
Given the following definition.yaml:
name: "test"
category: "foo"
version: "1.1"
additional_field: "baz"
A build.yaml can look like the following, and interpolates it’s values during build time:
image: ...
steps:
- echo {{.Values.name}} > /package_name
- echo {{.Values.additional_field}} > /extra
Which would be for example automatically rendered by luet like the following:
image: ...
steps:
- echo test > /package_name
- echo baz > /extra
This mechanism can be used in collections as well, and each stanza in packages is used to interpolate each single package.
Interpolating globally
It’s possible to interpolate during build phase all the package specs targeted for build with the --values flag, which takes a yaml file of an arbitrary format, if variables are clashing, the yaml supplied in --values takes precedence and overwrite the values of each single definition.yaml file.
Shared templates
Since luet 0.17.5 it is possible to share templates across different packages. All templates blocks found inside the templates folder inside the root luet tree of a repository gets templated and shared across all the packages while rendering each compilation spec of the given tree.
Consider the following:
shared_templates
├── templates
│ └── writefile.yaml
└── test
├── build.yaml
└── collection.yaml
collection.yaml
We define here two packages with a collection. They will share the same compilation spec to generate two different packages
packages:
- category: "test"
name: "foo"
version: "1.0"
- category: "test"
name: "bar"
version: "1.0"
writefile.yaml
All the files in the templates folder will get rendered by the template for each package in the tree. We define here a simple block to write out a file from the context which is passed by:
{{ define "writefile" }}
- echo conflict > /foo/{{.}}
{{end}}build.yaml
Finally the build spec consumes the template block we declared above, passing by the name of the package:
image: "alpine"
prelude:
- mkdir /foo
steps:
{{ template "writefile" .Values.name }}
package_dir: /fooLimitations
The finalize.yaml file has access only to the package fields during templating. Extra fields that are present in the definition.yaml file are not accessible during rendering in the finalize.yaml file, but only the package fields (name, version, labels, annotations, …)
References
Examples
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.