LoginSignup
1
0

More than 1 year has passed since last update.

Helmで数字を入れようとすると勝手に指数に変換される現象

Last updated at Posted at 2022-11-27

はじめに

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
values.yaml
revision: 4c4f198
template/hoge.yaml
git_revision: {{ .Values.revision }} # ここにValuesで設定したgitのrevisionを入れたい

対象のvalueの値が英数字のみの場合

全く問題なくvalueが適用される

values.yaml
revision: 4c4f198
実行結果
$ helm template . -f values.yaml
---
# Source: test/templates/hoge.yaml
git_revision: 4c4f198  ← Valuesの値がそのまま入った

対象のvalueの値が数字のみの場合

values.yaml
revision: 5304952

このように指数に勝手に変換されます

実行結果
$ helm template . -f values.yaml
---
# Source: test/templates/hoge.yaml
git_revision: 5.304952e+06 ←5304952ってそのまま入れてくれればいいのに、、

対象のvalueの値がたまたま指数形式になってしまった場合

values.yaml
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です

values.yaml
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/

values.yaml
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" 

envstrenvはGo製のyq(macではbrewでインストールできるやつ)でないと使えなさそう

最後に

gitのコミットハッシュは16進数なので、a-f0-9(16種類)のうち0-9(10種類)が、7桁全てが数字で入る確率は以下のようになります。

(10/16)^7 * 100 = 3.725(%)

低確率ではありますが、起こり得ない確率ではないので気付けてよかったなと思います

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0