GitHubのプライベートリポジトリをHelm Chartリポジトリにする方法

今回は、GitHubのプライベートリポジトリを使って、自分だけの（あるいはチームだけの）Helm Chartリポジトリを作る方法をご紹介します。

## なぜGitHubをHelm Chartリポジトリにするの？

本番環境というより検証用に気軽にHelm Chartをホスティングしたいから:

- プライベートなKubernetesマニフェストを安全に管理できる
- チーム内でHelm Chartを共有しやすい
- 追加のインフラ管理が不要

## 必要なもの

- GitHubのプライベートリポジトリ
- GitHubのPersonal Access Token
  - Classic Tokenの場合：`repo`スコープが必要
  - Fine-grained Tokenの場合：「Contents」の読み取り権限があれば OK
- Helm CLIがインストールされている環境
- `git`コマンド

## サンプルチャートの説明

この記事では例として`hello-world`という最小構成のチャートを使用します。チャートの内容は以下の通りです：

```yaml
# Chart.yaml
apiVersion: v2
name: hello-world
description: A simple Helm chart that creates hello-world namespace
type: application
version: 0.1.0
appVersion: "1.0.0"
```

```yaml
# templates/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: hello-world
```

このチャートは非常にシンプルで：
- `hello-world`という名前の名前空間を作成するだけ
- 設定可能な値（values）は持っていない
- Kubernetesクラスタ上で実行すると、新しい名前空間が作られる

実際の業務では、より複雑なチャートを扱うことになるでしょうが、ここではプライベートリポジトリの作り方に焦点を当てるため、最小限の構成にしています。

## やり方

### 1. チャートを作ってパッケージング

まずは、上記の`hello-world`チャートをパッケージングします：

```bash
cd private-repo
helm package hello-world/
```

これで`hello-world-0.1.0.tgz`というアーカイブファイルが作成されます。このファイルには、先ほどのChart.yamlとtemplates/namespace.yamlが含まれています。

### 2. インデックスファイルを作る

Helmに「どんなチャートがあるよ」って教えてあげるファイルを作ります：

```bash
helm repo index .
```

これにより`index.yaml`が作成され、以下のような内容が含まれます：

```yaml
apiVersion: v1
entries:
  hello-world:
    - apiVersion: v2
      appVersion: 1.0.0
      created: "2024-11-21T10:00:00.000000000Z"
      description: A simple Helm chart that creates hello-world namespace
      digest: 1234567890abcdef... # 実際のハッシュ値
      name: hello-world
      type: application
      urls:
        - hello-world-0.1.0.tgz
      version: 0.1.0
```

### 3. GitHubにプッシュ

できたファイルたちをGitHubに送り込みます：

```bash
git init
git add .
git commit -s -m "Initial commit"
git branch -M main
git remote add origin git@github.com:あなたのユーザー名/リポジトリ名.git
git push -u origin main
```

### 4. Helmの設定

ローカルのHelmに「このリポジトリ使っていいよ」って教えてあげます：

```bash
helm repo add --username あなたのGitHubユーザー名 --password GitHubトークン private-repo 'https://raw.githubusercontent.com/あなたのユーザー名/リポジトリ名/main'
```

リポジトリ情報を更新：

```bash
helm repo update
```

### 5. 確認してみる

ちゃんとチャートが見えるか確認：

```bash
helm search repo private-repo/hello-world
```

こんな感じで出てくるはずです：
```
NAME                        CHART VERSION   APP VERSION   DESCRIPTION
private-repo/hello-world    0.1.0          1.0.0        A simple Helm chart that creates hello-world namespace
```

## 実際に使ってみる

チャートをインストールする前に、dry-runで確認するのがおすすめです：

```bash
helm install test-hello private-repo/hello-world --dry-run
```

出力：
```yaml
# Source: hello-world/templates/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: hello-world
```

問題なさそうなら、実際にインストール：

```bash
helm install hello-world private-repo/hello-world
```

インストールが成功すると：
```
NAME: hello-world
LAST DEPLOYED: Thu Nov 21 14:45:40 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
```

確認：
```bash
kubectl get namespace hello-world
```

## ファイル構成

最終的なリポジトリの構成はこんな感じになります：

```
.
├── README.md
├── index.yaml              # Helmリポジトリのインデックス
├── hello-world-0.1.0.tgz   # パッケージングされたチャート
└── hello-world/           # チャートのソース
    ├── Chart.yaml         # チャートのメタデータ
    └── templates/         # Kubernetesマニフェストのテンプレート
        └── namespace.yaml # 名前空間を作成するマニフェスト
```


これで、あなただけのプライベートなHelm Chartリポジトリの完成です！チーム内でチャートを気軽に共有したり、バージョン管理したりする際に便利に使えると思います。