Skip to content

Commit 505ef91

Browse files
authored
Merge pull request #378 from vidispine/release-1.34
Release 1.34
2 parents 74c439f + f88606a commit 505ef91

35 files changed

+480
-202
lines changed

README.md

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,37 @@ One major design aspect of [Helm](https://helm.sh) is that it forces the user to
2222

2323
The primary feature of the HULL library is the ability to remove customized YAML template files entirely from Helm chart workflows and thereby allowing to remove a level of abstraction. Using the HULL library chart, Kubernetes objects including all their properties can be completely and transparently specified in the `values.yaml`. The HULL library chart itself provides the uniform layer to streamline specification, configuration and rendering of Helm charts to achieve this. You can also think of it as a thin layer on top of the Kubernetes API to avoid the middleman between Helm Chart and Kubernetes API object configuration, yet providing flexibility when it is required to customize individual configuration options instead of requiring you to add each configuration switch manually to the templates. JSON schema validation based on the [Helm JSON validation feature](https://helm.sh/docs/topics/charts/#schema-files) (via `values.schema.json`) aids in writing Kubernetes API conforming objects right from the beginning when [using an IDE that supports live JSON schema validation](./hull/doc/json_schema_validation.md). Additional benefits (uniform inheritable object metadata, simplified inclusion of ConfigMaps/Secrets, cross-referencing values within the `values.yaml`, ...) are available with HULL which you can read about below in the **Key Features Overview**. But maybe most importantly, the HULL library can be added as a dependency to any existing Helm chart and be used side-by-side without breaking any existing Helm charts functionalities, see [adding the HULL library chart to a Helm chart](./hull/doc/setup.md) for more information. And lastly, by being a library chart itself, everything works 100% within the functionality that plain Helm offers - no additional tooling is introduced or involved.
2424

25+
### Versioning
26+
HULL release versions are closely tied to Kubernetes release versions due to the incorporation of the release specific Kubernetes API schemas. Each HULL release branch therefore matches a Kubernetes release branch (such as `1.34`). Kubernetes patch releases provide non-breaking updates to a Kubernetes release while maintaining API stability and therefore play no role in the HULL versioning process. HULL's patch releases contain fixes and changes to HULL alone while maintaining compatibility to the Kubernetes releases API schema.
27+
28+
HULLs compatibility with Helm matches the respective Kubernetes versions compatibility with Helm, see [Helm Version Support Policy for Helm 4](https://helm.sh/docs/topics/version_skew) and [Helm Version Support Policy for Helm 3](https://helm.sh/docs/v3/topics/version_skew) for the matching version ranges.
29+
30+
Each new release of HULL is thoroughly tested and, unless explicitly noted in the `CHANGELOG.md`, they do not contain breaking changes. Hence, it is usually safe to keep HULL versions up-to-date keeping compatibility with targeted Kubernetes cluster versions in mind.
31+
32+
### Helm v3 vs Helm v4
33+
34+
HULL remains compatible with existing Helm 3 releases and is fully compatible with Helm v4 starting with versions `1.34.2`, `1.33.3` and `1.32.6`.
35+
36+
However, note that minor (however potentially chart-breaking) differences were introduced on the Helm side when moving to Helm v4:
37+
38+
- (technical) property names under the `Chart` object in the Helm root context have changed. This is with respect to capitalization of first letters mostly (eg. `maintainers` is now `Maintainers`), but for some properties capitalization is changed in multiple places (eg. `apiVersion` is now `APIVersion`).
39+
40+
- treatment of unset values has changed. To clarify what is mean with 'unset', consider property `field_unset` in this snippet:
41+
42+
```
43+
field_string: "some_text" # string text
44+
field_int: 123 # number
45+
field_bool: true # boolean
46+
field_unset:
47+
field_dict:
48+
key_1: value_1
49+
```
50+
51+
The behavior of Helm 3, when accessing such a field's property value, was to treat it as an empty string value from observation. This means, the key value pair exists in the `.Values` object tree and it's value is empty and of string type. With Helm 4 on the other hand, the field is absent from the object tree and accessing it will lead to an error.
52+
53+
Both aspects should typically be less relevant for HULL based charts, however it shall be documented here to avoid confusion. More detailed information can be found in the [related Helm issue](https://github.com/helm/helm/issues/31344).
54+
55+
2556
**Your feedback on this project is valued, hence please comment or start a discussion in the `Issues` section or create feature wishes and bug reports. Thank you!**
2657

2758
The HULL library chart idea is partly inspired by the [common](
@@ -271,10 +302,12 @@ In contrast to the `config.specific` section, which should be populated with arb
271302
| `render.emptyTemplateLabels` | If `true`, HULL renders out `labels: {}` in the `template` of pods ` if no labels exist for an object, if `false` the `labels` key is omitted. | `false` | `true`
272303
| `render.emptyHullObjects` | If `true`, HULL renders out arrays as empty arrays if no elements exist for some fields processed by HULL. If false, the key-value pair is ommited. <br><br> This affects fields which are mapped from a dictionary in HULL configuration to a Kubernetes array in the rendered YAML. The following is a list of affected fields in HULL's object configuration:<br><br><ul><li>`data` in `secret` and `configmap` objects</li><li>`initContainers`, `containers`, `volumes` and `imagePullSecrets` in `cronjob`,`daemonset`, `deployment`, `job` and `statefulset` `pod` objects</li><li>`ports`, `env`, `envFrom` and `volumeMounts` in `initContainers`, `containers` and `volumes` in `cronjob`,`daemonset`, `deployment`, `job` and `statefulset` `pod` objects</li><li>`ports` in `service` objects</li><li>`rules` and `tls` in `ingress` objects</li><li>`http.paths` in `rules` in `ingress` objects</li><li>`webhooks` in `validatingwebhookconfiguration` and `mutatingwebhookconfiguration`</li><li>`rules` in `clusterrole` and `role`</li>| `false` | `true`
273304
| `postRender` | After HULL has fully rendered an object it is possible to manipulate the resulting YAML string. Possibilities to do so are provided as `postRender` actions here. <br><br><b>WARNING: Use with caution as this may corrupt the YAML structure!</b> | | |
274-
| `postRender.globalStringReplacements` | A dictionary of replacement possibilities that may be applied to the rendered object's YAML. The main use case for this is in combination with extensive defaulting in `_HULL_OBJECT_TYPE_DEFAULT_` and `sources` object instances where it allows to inject instance specific strings into the defaulted YAML. The preconfigured mappings provided may be `enabled: true` on demand. Each mapping consists of following fields:<ul><li>`enabled`: execute mapping if `true`</li><li>`string`: the exact string part to be replaced</li><li>`replacement`: the type of value inserted instead of `string`. Not a free string but one of the following values: `OBJECT_INSTANCE_KEY`, `OBJECT_INSTANCE_KEY_RESOLVED` or `OBJECT_INSTANCE_NAME`
305+
| `postRender.globalStringReplacements` | A dictionary of replacement possibilities that may be applied to the rendered object's YAML. The main use case for this is in combination with extensive defaulting in `_HULL_OBJECT_TYPE_DEFAULT_` and `sources` object instances where it allows to inject instance specific strings into the defaulted YAML. Also, for down stream content that needs to preserve double curly braces as used in templating expressions, it allows to replace custonmizable placeholders with double curly opening and closing braces. The preconfigured mappings provided may be `enabled: true` on demand. Each mapping consists of following fields:<ul><li>`enabled`: execute mapping if `true`</li><li>`string`: the exact string part to be replaced</li><li>`replacement`: the type of value inserted instead of `string`. Can be one of the following static values `OBJECT_INSTANCE_KEY`, `OBJECT_INSTANCE_KEY_RESOLVED` and `OBJECT_INSTANCE_NAME` which are interpreted and resolved as explained below. Any other value is treated as a string value.
275306
| `postRender.globalStringReplacements.instanceKey` | If `enabled`, the `string` value will be replaced with the actual object's `instance_key` as in `hull.objects.<object_type>.<instance_key>`. The value of `replacement` is `OBJECT_INSTANCE_KEY` for this mapping. | `instanceKey:`<br>&#160;&#160;`enabled:`&#160;`false`<br>&#160;&#160;`string:`&#160;`_HULL_OBJECT_TYPE_DEFAULT_`<br>&#160;&#160;`replacement:`&#160;`OBJECT_INSTANCE_KEY` |
276307
| `postRender.globalStringReplacements.instanceKeyResolved` | If `enabled`, the `string` value will be replaced with the actual object's `instance_key` as in `hull.objects.<object_type>.<instance_key>` or by `hull.objects.<object_type>.<instance_key>.metadataNameOverride` if this is defined. The value of `replacement` is `OBJECT_INSTANCE_KEY_RESOLVED` for this mapping. | `instanceKeyResolved:`<br>&#160;&#160;`enabled:`&#160;`false`<br>&#160;&#160;`string:`&#160;`_HULL_OBJECT_TYPE_DEFAULT_`<br>&#160;&#160;`replacement:`&#160;`OBJECT_INSTANCE_KEY_RESOLVED`
277308
| `postRender.globalStringReplacements.instanceName` | If `enabled`, the `string` value will be replaced with the actual object's rendered `metadata.name`. The value of `replacement` is `OBJECT_INSTANCE_NAME` for this mapping. | `instanceName:`<br>&#160;&#160;`enabled:`&#160;`false`<br>&#160;&#160;`string:`&#160;`_HULL_OBJECT_TYPE_DEFAULT_`<br>&#160;&#160;`replacement:`&#160;`OBJECT_INSTANCE_NAME`
309+
| `postRender.globalStringReplacements.openingDoubleCurlyBraces` | If `enabled`, the `string` value (default `{+{`) will be replaced with opening double curly braces `{{`. The value of `replacement` is thus `{{` for this mapping. | `openingDoubleCurlyBraces:`<br>&#160;&#160;`enabled:`&#160;`false`<br>&#160;&#160;`string:`&#160;`{+{`<br>&#160;&#160;`replacement:`&#160;`{{`
310+
| `postRender.globalStringReplacements.closingDoubleCurlyBraces` | If `enabled`, the `string` value (default `}+}`) will be replaced with closing double curly braces `}}`. The value of `replacement` is thus `}}` for this mapping. | `closingDoubleCurlyBraces:`<br>&#160;&#160;`enabled:`&#160;`false`<br>&#160;&#160;`string:`&#160;`}+}`<br>&#160;&#160;`replacement:`&#160;`}}`
278311
| `serialization` | General serialization options. |
279312
| `serialization.configmap.enabled` | If `enabled`, the mapped file extensions under `fileExtensions` are serialized with the given serialization method by default. If the `data` key ends with one of the mapped extensions the serialization method in the value is used to write the content to string. A specific `serialization` field on a configmaps `data` entry overwrites any default settings. | `true`
280313
| `serialization.configmap.fileExtensions` | A dictionary of mappings from file extensions to serialization methods. | `fileExtensions:`<br>&#160;&#160;`json:`&#160;`toPrettyJson`<br>&#160;&#160;`yaml:`&#160;`toYaml`<br>&#160;&#160;`yml:`&#160;`toYaml`

azure-pipelines-gated.yml

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,30 +21,19 @@ jobs:
2121
strategy:
2222
maxParallel: 5
2323
matrix:
24-
Helm_3_16_4_single:
25-
HelmVersion: "3.16.4"
24+
Helm_3_19_2_single:
25+
HelmVersion: "3.19.2"
2626
TestType: single
27-
Helm_3_16_4_multi:
28-
HelmVersion: "3.16.4"
27+
Helm_3_19_2_multi:
28+
HelmVersion: "3.19.2"
2929
TestType: multi
30-
Helm_3_17_4_single:
31-
HelmVersion: "3.17.4"
30+
Helm_4_0_1_single:
31+
HelmVersion: "4.0.1"
3232
TestType: single
33-
Helm_3_17_4_multi:
34-
HelmVersion: "3.17.4"
35-
TestType: multi
36-
Helm_3_18_6_single:
37-
HelmVersion: "3.18.6"
38-
TestType: single
39-
Helm_3_18_6_multi:
40-
HelmVersion: "3.18.6"
41-
TestType: multi
42-
Helm_3_19_0_single:
43-
HelmVersion: "3.19.0"
44-
TestType: single
45-
Helm_3_19_0_multi:
46-
HelmVersion: "3.19.0"
33+
Helm_4_0_1_multi:
34+
HelmVersion: "4.0.1"
4735
TestType: multi
36+
4837
steps:
4938
- template: azure-pipelines-test.yml # Template reference
5039
parameters:

azure-pipelines-test.yml

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ steps:
2727

2828
- script: |
2929
set -euo pipefail
30-
echo installing helm
31-
wget https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
32-
sudo chmod +x ./get-helm-3
33-
sudo ./get-helm-3 --version v$(HelmVersion)
30+
echo installing helm v$(HelmVersion)
31+
helmmajor=$(echo "$(HelmVersion)" | cut -d. -f1)
32+
wget https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-${helmmajor}
33+
sudo chmod +x ./get-helm-${helmmajor}
34+
sudo ./get-helm-${helmmajor} --version v$(HelmVersion)
35+
echo running helm version for helm v$(HelmVersion) - major version is ${helmmajor}
3436
helm version
3537
displayName: 'install helm v$(HelmVersion)'
3638
condition: and(ne(variables['HelmVersion'],''),eq('${{ parameters.RunTests }}','True'))
@@ -51,10 +53,12 @@ steps:
5153

5254
- script: |
5355
set -euo pipefail
54-
echo installing helm
55-
wget https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
56-
sudo chmod +x ./get-helm-3
57-
sudo ./get-helm-3 --version v${{ version.version }}
56+
echo installing helm v$(HelmVersion)
57+
helmmajor=$(echo "$(HelmVersion)" | cut -d. -f1)
58+
wget https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-${helmmajor}
59+
sudo chmod +x ./get-helm-${helmmajor}
60+
sudo ./get-helm-${helmmajor} --version v$(HelmVersion)
61+
echo running helm version for helm v$(HelmVersion) - major version is ${helmmajor}
5862
helm version
5963
displayName: 'install helm v${{ version.version }}'
6064
condition: and(gt(length('${{join(' ',parameters.HelmVersions) }}'),0),eq('${{ parameters.RunTests }}','True'))

azure-pipelines.yml

Lines changed: 20 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -19,113 +19,35 @@ jobs:
1919
strategy:
2020
maxParallel: 5
2121
matrix:
22-
Helm_3_16_0_single:
23-
HelmVersion: "3.16.0"
24-
TestType: single
25-
Helm_3_16_0_multi:
26-
HelmVersion: "3.16.0"
27-
TestType: multi
28-
Helm_3_16_1_single:
29-
HelmVersion: "3.16.1"
30-
TestType: single
31-
Helm_3_16_1_multi:
32-
HelmVersion: "3.16.1"
33-
TestType: multi
34-
Helm_3_16_2_single:
35-
HelmVersion: "3.16.2"
36-
TestType: single
37-
Helm_3_16_2_multi:
38-
HelmVersion: "3.16.2"
39-
TestType: multi
40-
Helm_3_16_3_single:
41-
HelmVersion: "3.16.3"
42-
TestType: single
43-
Helm_3_16_3_multi:
44-
HelmVersion: "3.16.3"
45-
TestType: multi
46-
Helm_3_16_4_single:
47-
HelmVersion: "3.16.4"
48-
TestType: single
49-
Helm_3_16_4_multi:
50-
HelmVersion: "3.16.4"
51-
TestType: multi
52-
Helm_3_17_0_single:
53-
HelmVersion: "3.17.0"
54-
TestType: single
55-
Helm_3_17_0_multi:
56-
HelmVersion: "3.17.0"
57-
TestType: multi
58-
Helm_3_17_1_single:
59-
HelmVersion: "3.17.1"
60-
TestType: single
61-
Helm_3_17_1_multi:
62-
HelmVersion: "3.17.1"
63-
TestType: multi
64-
Helm_3_17_2_single:
65-
HelmVersion: "3.17.2"
66-
TestType: single
67-
Helm_3_17_2_multi:
68-
HelmVersion: "3.17.2"
69-
TestType: multi
70-
Helm_3_17_3_single:
71-
HelmVersion: "3.17.3"
72-
TestType: single
73-
Helm_3_17_3_multi:
74-
HelmVersion: "3.17.3"
75-
TestType: multi
76-
Helm_3_17_4_single:
77-
HelmVersion: "3.17.4"
78-
TestType: single
79-
Helm_3_17_4_multi:
80-
HelmVersion: "3.17.4"
81-
TestType: multi
82-
Helm_3_18_0_single:
83-
HelmVersion: "3.18.0"
84-
TestType: single
85-
Helm_3_18_0_multi:
86-
HelmVersion: "3.18.0"
87-
TestType: multi
88-
Helm_3_18_1_single:
89-
HelmVersion: "3.18.1"
90-
TestType: single
91-
Helm_3_18_1_multi:
92-
HelmVersion: "3.18.1"
93-
TestType: multi
94-
Helm_3_18_2_single:
95-
HelmVersion: "3.18.2"
96-
TestType: single
97-
Helm_3_18_2_multi:
98-
HelmVersion: "3.18.2"
99-
TestType: multi
100-
Helm_3_18_3_single:
101-
HelmVersion: "3.18.3"
22+
Helm_3_19_0_single:
23+
HelmVersion: "3.19.0"
10224
TestType: single
103-
Helm_3_18_3_multi:
104-
HelmVersion: "3.18.3"
25+
Helm_3_19_0_multi:
26+
HelmVersion: "3.19.0"
10527
TestType: multi
106-
Helm_3_18_4_single:
107-
HelmVersion: "3.18.4"
28+
Helm_3_19_1_single:
29+
HelmVersion: "3.19.1"
10830
TestType: single
109-
Helm_3_18_4_multi:
110-
HelmVersion: "3.18.4"
31+
Helm_3_19_1_multi:
32+
HelmVersion: "3.19.1"
11133
TestType: multi
112-
Helm_3_18_5_single:
113-
HelmVersion: "3.18.5"
34+
Helm_3_19_2_single:
35+
HelmVersion: "3.19.2"
11436
TestType: single
115-
Helm_3_18_5_multi:
116-
HelmVersion: "3.18.5"
37+
Helm_3_19_2_multi:
38+
HelmVersion: "3.19.2"
11739
TestType: multi
118-
Helm_3_18_6_single:
119-
HelmVersion: "3.18.6"
40+
Helm_4_0_0_single:
41+
HelmVersion: "4.0.0"
12042
TestType: single
121-
Helm_3_18_6_multi:
122-
HelmVersion: "3.18.6"
43+
Helm_4_0_0_multi:
44+
HelmVersion: "4.0.0"
12345
TestType: multi
124-
Helm_3_19_0_single:
125-
HelmVersion: "3.19.0"
46+
Helm_4_0_1_single:
47+
HelmVersion: "4.0.1"
12648
TestType: single
127-
Helm_3_19_0_multi:
128-
HelmVersion: "3.19.0"
49+
Helm_4_0_1_multi:
50+
HelmVersion: "4.0.1"
12951
TestType: multi
13052
steps:
13153
- template: azure-pipelines-test.yml # Template reference

0 commit comments

Comments
 (0)