他チャート(phpfpm/n8n)を参照し、リリース自動化を実装。 - helm-release.yaml(push トリガ): 「毎 push 無条件公開」から 「Chart.yaml の version が Package Registry に未公開のときだけリリース」に変更。 helm search repo --version で存在確認し、未公開時のみ Package Registry 発行 + Git タグ v<version> + Gitea リリース(tgz 添付)を実施。 paths フィルタで Chart.yaml/values.yaml/values.schema.json/templates/** 変更時のみ発火。 helm lint --strict でスキーマ検証。 - image-update-and-release.yaml(週次 月曜03:00 UTC): 新設。 このチャートは Secret を生成するだけで追従すべき上流イメージが無いため バージョン自動採番はしない。push 側がレジストリ障害等で取りこぼした 未公開バージョンを週次でリリースするセーフティネットとして動作。 将来サブチャート等の追従対象が増えたときの追加ポイントをコメントで用意。 - タグ/リリース作成は既存なら skip(冪等)。jq 未導入環境向けのガードを追加。 - README.md / CLAUDE.md に自動化ワークフローの節を追加
This commit is contained in:
@@ -1,6 +1,14 @@
|
||||
# .gitea/workflows/helm-release.yaml
|
||||
# 汎用Helmチャート公開ワークフロー(全リポジトリ共通)
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# secret-manager 用のチャート公開ワークフロー。
|
||||
#
|
||||
# 他リポジトリの「毎 push で無条件公開」する共通版とは異なり、この版は
|
||||
# 「Chart.yaml の version が Package Registry に未公開のときだけリリースする」。
|
||||
# 既に同じバージョンが公開済みなら何もしない(README や examples だけの
|
||||
# 変更で push してもリリースは発生しない)。
|
||||
#
|
||||
# リリース = Package Registry への発行 + Git タグ + Gitea リリース(tgz 添付)。
|
||||
# -------------------------------------------------------------------------
|
||||
name: Helm Chart Release
|
||||
|
||||
on:
|
||||
@@ -8,6 +16,12 @@ on:
|
||||
branches:
|
||||
- main
|
||||
- master
|
||||
paths:
|
||||
- 'Chart.yaml'
|
||||
- 'values.yaml'
|
||||
- 'values.schema.json'
|
||||
- 'templates/**'
|
||||
- '.gitea/workflows/helm-release.yaml'
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
@@ -19,88 +33,132 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
run: |
|
||||
echo "🔄 Cloning repository..."
|
||||
git clone --depth 1 $GITHUB_SERVER_URL/$GITHUB_REPOSITORY.git .
|
||||
echo "✅ Repository cloned"
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install Helm
|
||||
run: |
|
||||
echo "📦 Installing Helm..."
|
||||
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
|
||||
helm version
|
||||
echo "✅ Helm installed"
|
||||
uses: azure/setup-helm@v3
|
||||
with:
|
||||
version: 'v3.12.0'
|
||||
|
||||
- name: Get Chart Info
|
||||
id: chart_info
|
||||
- name: Ensure jq
|
||||
run: |
|
||||
# Chart.yamlからチャート名とバージョンを取得
|
||||
CHART_NAME=$(grep '^name:' Chart.yaml | awk '{print $2}')
|
||||
CHART_VERSION=$(grep '^version:' Chart.yaml | awk '{print $2}')
|
||||
|
||||
echo "Chart Name: ${CHART_NAME}"
|
||||
echo "Chart Version: ${CHART_VERSION}"
|
||||
|
||||
# GitHub Actionsの環境変数として設定
|
||||
echo "CHART_NAME=${CHART_NAME}" >> $GITHUB_ENV
|
||||
echo "CHART_VERSION=${CHART_VERSION}" >> $GITHUB_ENV
|
||||
command -v jq >/dev/null 2>&1 || { apt-get update -qq && apt-get install -y -qq jq; }
|
||||
jq --version
|
||||
|
||||
- name: Validate Chart
|
||||
- name: Get chart info
|
||||
id: info
|
||||
run: |
|
||||
echo "🔍 Validating Helm chart..."
|
||||
helm lint .
|
||||
echo "✅ Chart validation passed"
|
||||
set -e
|
||||
CHART_NAME=$(grep '^name:' Chart.yaml | head -1 | sed 's/^name:[[:space:]]*//; s/"//g; s/[[:space:]]*$//')
|
||||
CHART_VERSION=$(grep '^version:' Chart.yaml | head -1 | sed 's/^version:[[:space:]]*//; s/"//g; s/[[:space:]]*$//')
|
||||
echo "name=${CHART_NAME}" >> $GITHUB_OUTPUT
|
||||
echo "version=${CHART_VERSION}" >> $GITHUB_OUTPUT
|
||||
echo "Chart: ${CHART_NAME} v${CHART_VERSION}"
|
||||
|
||||
- name: Package Chart
|
||||
- name: Validate chart
|
||||
run: helm lint --strict .
|
||||
|
||||
- name: Check whether this version is already released
|
||||
id: check
|
||||
run: |
|
||||
echo "📦 Packaging Helm chart..."
|
||||
set -e
|
||||
NAME="${{ steps.info.outputs.name }}"
|
||||
VERSION="${{ steps.info.outputs.version }}"
|
||||
|
||||
helm repo add cafepieters "${REGISTRY_URL}/api/packages/${OWNER}/helm" \
|
||||
--username "${{ secrets.REGISTRY_USER }}" \
|
||||
--password "${{ secrets.REGISTRY_TOKEN }}" >/dev/null 2>&1 || true
|
||||
helm repo update cafepieters >/dev/null 2>&1 || true
|
||||
|
||||
FOUND=$(helm search repo "cafepieters/${NAME}" --version "${VERSION}" --output json 2>/dev/null | jq 'length' 2>/dev/null || echo 0)
|
||||
echo "Registry entries for ${NAME} ${VERSION}: ${FOUND}"
|
||||
|
||||
if [ "${FOUND:-0}" -gt 0 ]; then
|
||||
echo "release_needed=false" >> $GITHUB_OUTPUT
|
||||
echo "✅ v${VERSION} は既にリリース済み。処理をスキップします。"
|
||||
else
|
||||
echo "release_needed=true" >> $GITHUB_OUTPUT
|
||||
echo "🆕 v${VERSION} は未リリース。リリースを実行します。"
|
||||
fi
|
||||
|
||||
- name: Package chart
|
||||
if: steps.check.outputs.release_needed == 'true'
|
||||
run: |
|
||||
set -e
|
||||
helm package .
|
||||
|
||||
CHART_FILE=$(ls *.tgz)
|
||||
echo "✅ Packaged: ${CHART_FILE}"
|
||||
CHART_FILE=$(ls "${{ steps.info.outputs.name }}"-*.tgz | head -1)
|
||||
echo "CHART_FILE=${CHART_FILE}" >> $GITHUB_ENV
|
||||
echo "Packaged: ${CHART_FILE}"
|
||||
|
||||
- name: Publish to Gitea Package Registry
|
||||
if: steps.check.outputs.release_needed == 'true'
|
||||
run: |
|
||||
echo "🚀 Publishing ${CHART_FILE} to Gitea Package Registry..."
|
||||
|
||||
set -e
|
||||
curl --fail-with-body \
|
||||
-u "${{ secrets.REGISTRY_USER }}:${{ secrets.REGISTRY_TOKEN }}" \
|
||||
-X POST \
|
||||
--upload-file "${CHART_FILE}" \
|
||||
"${REGISTRY_URL}/api/packages/${OWNER}/helm/api/charts"
|
||||
|
||||
echo "✅ Chart published successfully!"
|
||||
echo "✅ Published ${CHART_FILE} to Package Registry"
|
||||
|
||||
- name: Create Git tag
|
||||
if: steps.check.outputs.release_needed == 'true'
|
||||
run: |
|
||||
set -e
|
||||
VERSION="${{ steps.info.outputs.version }}"
|
||||
git config user.name "Claude"
|
||||
git config user.email "claude@cafepieters.com"
|
||||
if git rev-parse "v${VERSION}" >/dev/null 2>&1; then
|
||||
echo "Tag v${VERSION} already exists, skipping"
|
||||
else
|
||||
git tag -a "v${VERSION}" -m "Release ${VERSION}"
|
||||
git push origin "v${VERSION}"
|
||||
echo "Git tag v${VERSION} created"
|
||||
fi
|
||||
|
||||
- name: Create Gitea Release
|
||||
if: steps.check.outputs.release_needed == 'true'
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||
run: |
|
||||
set -e
|
||||
VERSION="${{ steps.info.outputs.version }}"
|
||||
NAME="${{ steps.info.outputs.name }}"
|
||||
PACKAGE_FILE="${NAME}-${VERSION}.tgz"
|
||||
|
||||
EXISTING=$(curl -s -H "Authorization: token ${GITEA_TOKEN}" \
|
||||
"${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases/tags/v${VERSION}" | jq -r '.id // empty')
|
||||
|
||||
if [ -n "${EXISTING}" ]; then
|
||||
echo "Release v${VERSION} already exists (id=${EXISTING}), skipping"
|
||||
else
|
||||
RELEASE_ID=$(curl -s -X POST \
|
||||
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"tag_name\":\"v${VERSION}\",\"name\":\"v${VERSION}\",\"body\":\"secret-manager Helm Chart v${VERSION}\"}" \
|
||||
"${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases" | jq -r '.id')
|
||||
|
||||
curl -s -X POST \
|
||||
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||
-H "Content-Type: application/gzip" \
|
||||
--data-binary "@${PACKAGE_FILE}" \
|
||||
"${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases/${RELEASE_ID}/assets?name=${PACKAGE_FILE}"
|
||||
|
||||
echo "Gitea release v${VERSION} created with asset ${PACKAGE_FILE}"
|
||||
fi
|
||||
|
||||
- name: Summary
|
||||
if: success()
|
||||
run: |
|
||||
echo "================================"
|
||||
echo "✅ Deployment Successful!"
|
||||
echo "================================"
|
||||
echo "Repository: ${{ github.repository }}"
|
||||
echo "Chart Name: ${CHART_NAME}"
|
||||
echo "Chart Version: ${CHART_VERSION}"
|
||||
echo "Chart File: ${CHART_FILE}"
|
||||
echo "Branch: ${{ github.ref }}"
|
||||
echo "Commit: ${{ github.sha }}"
|
||||
echo "================================"
|
||||
echo ""
|
||||
echo "📦 Install with:"
|
||||
echo "helm repo add cafepieters ${REGISTRY_URL}/api/packages/${OWNER}/helm"
|
||||
echo "helm repo update"
|
||||
echo "helm install my-${CHART_NAME} cafepieters/${CHART_NAME}"
|
||||
|
||||
- name: Error Report
|
||||
if: failure()
|
||||
run: |
|
||||
echo "================================"
|
||||
echo "❌ Deployment Failed!"
|
||||
echo "================================"
|
||||
echo "Check the logs above for details"
|
||||
echo "Common issues:"
|
||||
echo "- Missing Chart.yaml"
|
||||
echo "- Invalid Helm chart structure"
|
||||
echo "- Missing REGISTRY_USER or REGISTRY_TOKEN secrets"
|
||||
echo "- Insufficient permissions on Personal Access Token"
|
||||
echo "================================"
|
||||
if [ "${{ steps.check.outputs.release_needed }}" = "true" ]; then
|
||||
echo "================================"
|
||||
echo "✅ Released secret-manager v${{ steps.info.outputs.version }}"
|
||||
echo "================================"
|
||||
echo "helm repo add cafepieters ${REGISTRY_URL}/api/packages/${OWNER}/helm"
|
||||
echo "helm repo update"
|
||||
echo "helm upgrade --install secrets cafepieters/secret-manager"
|
||||
else
|
||||
echo "ℹ️ No release: v${{ steps.info.outputs.version }} is already published."
|
||||
echo " バージョンを上げたい場合は Chart.yaml の version / appVersion を更新して push してください。"
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user