はじめに
kubernatesでサービスを運用していたのですが、イメージを下記のような命名規則でレポジトリにあげていました
サービス名:Gitのコミットハッシュ7桁
この命名規則の都合上、helmを使ってvaluesからコミットハッシュを読み込む必要があったのですが、その時にハマった話です。
困ったこと
- helmでvaluesからgitのrevisionを呼び出したかった
- ほとんど場合特に問題なくvaluesの値をyamlに適応できた
- ただコミットハッシュが数字のみの場合は勝手に指数に変換されてうまくyamlに適応できなかった
-
42c53f2
みたいな英数字の場合は問題なし -
4502345
のように数字のみの場合に4.502345e+06
と勝手に変換される - また
45023e5
のよう場合も勝手に4.5023e+09
のように変換される
-
例
なんのこっちゃよくわからないと思うので例を挙げます。
test
┣━ .helmignore
┣━ Chart.yaml
┣━ charts
┣━ templates
┃ ┗━ hoge.yaml
┗━ values.yaml
revision: 4c4f198
git_revision: {{ .Values.revision }} # ここにValuesで設定したgitのrevisionを入れたい
対象のvalueの値が英数字のみの場合
全く問題なくvalueが適用される
revision: 4c4f198
$ helm template . -f values.yaml
---
# Source: test/templates/hoge.yaml
git_revision: 4c4f198 ← Valuesの値がそのまま入った
対象のvalueの値が数字のみの場合
revision: 5304952
このように指数に勝手に変換されます
$ helm template . -f values.yaml
---
# Source: test/templates/hoge.yaml
git_revision: 5.304952e+06 ←5304952ってそのまま入れてくれればいいのに、、
対象のvalueの値がたまたま指数形式になってしまった場合
revision: 53049e2
この場合も、eが指数のeと判断されて変換がかかる
$ helm template . -f values.yaml
---
# Source: test/templates/hoge.yaml
git_revision: 5.3049e+06 ←😡
原因
お察しの通りhelmで文字列が数値型として認識されて、ありがた迷惑なことに 勝手に変換される模様。issueにもいくつか上がってる。
[参考]https://github.com/helm/helm/issues/1707
解決方法
単純にvaluesにダブルクオーテーションつければOKです
revision: "5304952"
$ helm template . -f values.yaml
---
# Source: test/templates/hoge.yaml
git_revision: 5304952
またはvaluesのところに!!string
をつけてもいけます
https://helm.sh/ja/docs/chart_best_practices/values/
revision: !!string 5304952
$ helm template . -f values.yaml
---
# Source: test/templates/hoge.yaml
git_revision: 5304952
おまけ:values.yamlの作成にyq
コマンドを使ってる場合
values.yamlの作成をyqコマンドで環境変数からgit_revisionを読み込んで入れるように設定していたので、strenv
で読み込むことで対応しました。
# strenv使うとダブルクオーテーションで括ってくれる
$ export GIT_REVISION=1234567
$ yq eval -i '.revision=strenv(GIT_REVISION)' values.yaml
$ cat values.yaml
revision: "1234567"
※ env
やstrenv
はGo製のyq(macではbrewでインストールできるやつ)でないと使えなさそう
最後に
gitのコミットハッシュは16進数なので、a-f0-9(16種類)のうち0-9(10種類)が、7桁全てが数字で入る確率は以下のようになります。
(10/16)^7 * 100 = 3.725(%)
低確率ではありますが、起こり得ない確率ではないので気付けてよかったなと思います