🏗️
GitHubプライベートリポジトリをHelmリポジトリにする
問題
社内で利用するHelmチャートの共通化を始めてみたくなり、Helmリポジトリを用意したくなりました。
リポジトリはプライベートにしたいです。
できるだけ簡単に用意したいです。
パブリックでよければ
パブリックリポジトリで構わない場合は、chart-releaserを使えば簡単だと思います。
解決案
リポジトリに必要なこと
-
helm package
で生成される.tgz
ファイルをダウンロードできること -
helm repo index
で生成されるindex.yaml
をダウンロードできること - 上の二つを、限られた人(GitHub Organizationに所属する人)だけがダウンロードできること
チャートの置き場所
GitHubプライベートリポジトリに置くことにします。そうすればリポジトリの内容物は
https://raw.githubusercontent.com/
からダウンロードできますが、誰でもはアクセスできません。
Organizationに所属している、かつパーソナルアクセストークンを発行した人は
https://$GITHUB_TOKEN@raw.githubusercontent.com/
でダウンロードできます。
例
charts
ブランチのルート階層にindex.yaml
とchart-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 package
とhelm repo index
を実行し、生成物をcharts
ブランチにプッシュしてくれれば、チャートのリリースを自動化できます。
GitHub Actionsを使ってやってみます。
Chart.yamlが更新されたら
を調べるために
を使っています。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