designetwork

ネットワークを軸としたIT技術メモ

Helm repo indexしたパッケージ更新で既存のtimestampを書き換えないようにする

helm repo index .してGitHub Pagesで公開している自作Helmチャートの更新運用時に、既存パッケージ(旧バージョン)のタイムスタンプが更新されてしまう事象が発生したので対処メモ。

QuickFix

./bump-index.sh <new_package.tgz>として、退避・index --mergeする。

bump-index.sh

if [ -z "$1" ]
  then
    echo "ERROR: File not specified"
    exit 1
fi
set -e
mkdir tmp
cp $1 tmp/
helm repo index --merge index.yaml tmp
mv tmp/index.yaml index.yaml
rm -rf tmp
git diff

単純にhelm repo index .すると既存パッケージのタイムスタンプが更新されてしまう

バージョンアップしたパッケージを追加し、

$ tree charts
charts
└── stable
    ├── bump-index.sh
    ├── elastalert-0.1.0.tgz
    ├── elastalert-0.1.1.tgz
    ├── index.yaml
    ├── praeco-0.1.0.tgz
    ├── praeco-0.1.1.tgz
    ├── praeco-0.1.2.tgz  <-- added
    └── refresh-index.sh

helm repo index .すると、

git diff
---
   praeco:
   - apiVersion: v1
     appVersion: 0.2.1-dev
-    created: "2020-02-24T18:02:55.253788+09:00"
+    created: "2020-03-19T00:13:14.429971+09:00"
+    description: Praeco Helm chart for Kubernetes
+    digest: xxx
+    name: praeco
+    urls:
+    - praeco-0.1.2.tgz
+    version: 0.1.2
+  - apiVersion: v1
+    appVersion: 0.2.1-dev
+    created: "2020-03-19T01:23:42.482821+09:00"
     description: Praeco Helm chart for Kubernetes
     digest: xxx
     name: praeco
@@ -40,7 +40,7 @@ entries:
     version: 0.1.2
   - apiVersion: v1
     appVersion: 1.0.1
-    created: "2020-02-24T18:02:55.260446+09:00"
+    created: "2020-03-19T01:23:42.482821+09:00"
     description: Praeco Helm chart for Kubernetes
     digest: xxx
     name: praeco
@@ -49,11 +49,11 @@ entries:
     version: 0.1.1
   - apiVersion: v1
     appVersion: 1.0.1
-    created: "2020-02-24T18:02:55.258274+09:00"
+    created: "2020-03-19T01:23:42.479318+09:00"
     description: A Helm chart for Kubernetes
     digest: xxx
     name: praeco
     urls:
     - praeco-0.1.0.tgz
     version: 0.1.0

古いバージョンのcreated (timestamp)もアップデートされ、差分となってしまう。

なぜこうなるのか?

github.com

こちらで回答されている通り、そもそもhelm repo indexは新規生成のためのコマンドなので、差分管理的には動かない。

helm repo index --mergeでバージョンアップ分を追加する

上記Issueに記載の通り、以下の流れで作業実施することで、期待通り新バージョンのパッケージをindex.yamlに追加できる。

  1. put your new chart in its own folder
  2. helm repo index --merge <path/to/existing/index.yaml> .
  3. mv index.yaml <path/to/existing/index.yaml
  4. mv <my-new-chart.tgz>
  5. git commit

私はシンプルにするために、charts/stableの配下でtmpフォルダを作成して、そこで新規index.yamlを生成(既存index.yamlマージ)、既存index.yaml上書きするようにしている。

cd charts/stable
mkdir tmp
cp <new_package.tgz> tmp/
helm repo index --merge index.yaml tmp
mv tmp/index.yaml index.yaml
rm -rf tmp

QuickFixとして冒頭に記載の通り、これをbump-index.shとして、

if [ -z "$1" ]
  then
    echo "ERROR: File not specified"
    exit 1
fi
set -e
mkdir tmp
cp $1 tmp/
helm repo index --merge index.yaml tmp
mv tmp/index.yaml index.yaml
rm -rf tmp
git diff

./bump-index.sh <new_package.tgz>で更新完了となる。あとはGit Commit, Pushで公開する。

まとめ - Helm repo indexしたパッケージ更新で既存のtimestampを書き換えないようにする

退避 + helm repo index --mergeで既存パッケージのタイムスタンプを更新することなく、新バージョンのパッケージを追加することができる。