🏗️

GitHubプライベートリポジトリをHelmリポジトリにする

2021/05/11に公開

問題

社内で利用するHelmチャートの共通化を始めてみたくなり、Helmリポジトリを用意したくなりました。
リポジトリはプライベートにしたいです。
できるだけ簡単に用意したいです。

パブリックでよければ

パブリックリポジトリで構わない場合は、chart-releaserを使えば簡単だと思います。
https://github.com/helm/chart-releaser
https://github.com/helm/chart-releaser-action

解決案

リポジトリに必要なこと

  • helm packageで生成される.tgzファイルをダウンロードできること
  • helm repo indexで生成されるindex.yamlをダウンロードできること
  • 上の二つを、限られた人(GitHub Organizationに所属する人)だけがダウンロードできること

チャートの置き場所

GitHubプライベートリポジトリに置くことにします。そうすればリポジトリの内容物は
https://raw.githubusercontent.com/
からダウンロードできますが、誰でもはアクセスできません。

Organizationに所属している、かつパーソナルアクセストークンを発行した人は
https://$GITHUB_TOKEN@raw.githubusercontent.com/
でダウンロードできます。

chartsブランチのルート階層にindex.yamlchart-version.tgzを置くことにした場合、このように利用できます。

helm repo add $HELM_REPO_NAME https://$GITHUB_TOKEN@raw.githubusercontent.com/$ORG/$REPO/charts/
helm template $HELM_REPO_NAME/$CHART_NAME -f values.yaml --version 0.1.0

自動的にチャートをリリースする

Chart.yamlが更新されたら、自動的にhelm packagehelm repo indexを実行し、生成物をchartsブランチにプッシュしてくれれば、チャートのリリースを自動化できます。

GitHub Actionsを使ってやってみます。

Chart.yamlが更新されたら

を調べるために
https://github.com/jitterbit/get-changed-files
を使っています。

name: Release Charts

on:
  push:
    branches:
      - main
    paths:
      - "**Chart.yaml"

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Configure Git
        run: |
          git config user.name "$GITHUB_ACTOR"
          git config user.email "$GITHUB_ACTOR@users.noreply.github.com"

      - name: Install Helm
        uses: azure/setup-helm@v1
        with:
          version: v3.5.4

      - name: Get changed files
        id: files
        uses: jitterbit/get-changed-files@v1
        with:
          format: 'csv'

      - name: Push archives and index
        shell: bash
        run: |
          echo ${{ steps.files.outputs.added_modified }}
          mapfile -d ',' -t added_modified_files < <(printf '%s,' '${{ steps.files.outputs.added_modified }}')
          for added_modified_file in "${added_modified_files[@]}"; do
            if [[ ${added_modified_file} == *Chart.yaml ]]; then
              echo ${added_modified_file} | sed -e 's/Chart.yaml//' | xargs helm package -d .package
            fi
          done
          if [[ -n $(ls .package) ]]; then
            git switch charts
            mv .package/* ./
            helm repo index .
            git add -Av
            git commit -m "update charts"
            git push origin charts
          else
            echo "Nothing to do."
          fi

Discussion