chore: helm-release のリリース判定を registry/tag/release の3独立フラグに分離
Helm Chart Release / release-chart (push) Successful in 5s

「Registry 発行済み」と「タグ/リリース作成」が同一フラグに束ねられていたため、
タグ push だけ失敗しても回復できなかった。各成果物を個別に冪等チェックし、
不足分だけを作る構造に変更。途中失敗しても次の push で自己修復する。
タグ有無は git ls-remote でリモート基準に確認。
This commit is contained in:
2026-09-08 13:37:04 +09:00
parent e7792211df
commit 13cb27a5ec
3 changed files with 102 additions and 62 deletions
+68 -58
View File
@@ -3,11 +3,17 @@
# secret-manager 用のチャート公開ワークフロー。
#
# 他リポジトリの「毎 push で無条件公開」する共通版とは異なり、この版は
# 「Chart.yaml の version が Package Registry に未公開のときだけリリースする」。
# 既に同じバージョンが公開済みなら何もしない(README や examples だけの
# 変更で push してもリリースは発生しない)。
# 3 つのリリース成果物を **それぞれ独立に冪等チェック** する:
#
# リリース = Package Registry への発行 + Git タグ + Gitea リリース(tgz 添付)。
# 1. Package Registry ... `Chart.yaml` の version が未登録なら発行
# 2. Git タグ v<version> ... リモートに無ければ作成して push
# 3. Gitea リリース ... 同名リリースが無ければ作成(tgz 添付)
#
# 独立チェックにしている理由: いずれかのステップだけ失敗しても、次の push で
# 不足分だけが再実行されて自己修復する(例: registry 発行は成功したがタグ
# push が権限エラーで失敗 → 次回 push でタグだけ作成される)。
# どれも不要なら全ステップが no-op(README や examples だけの変更で発火しても
# リリースは発生しない)。
# -------------------------------------------------------------------------
name: Helm Chart Release
@@ -60,31 +66,42 @@ jobs:
- name: Validate chart
run: helm lint --strict .
- name: Check whether this version is already released
- name: Decide what is missing (registry / tag / release)
id: check
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
run: |
set -e
NAME="${{ steps.info.outputs.name }}"
VERSION="${{ steps.info.outputs.version }}"
TAG="v${VERSION}"
# --- 1. Package Registry ---
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 REG=false; else REG=true; fi
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
# --- 2. Git タグ(リモート基準)---
if [ -n "$(git ls-remote --tags origin "refs/tags/${TAG}" 2>/dev/null)" ]; then TAG_NEEDED=false; else TAG_NEEDED=true; fi
# --- 3. Gitea リリース ---
REL_ID=$(curl -s -H "Authorization: token ${GITEA_TOKEN}" \
"${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases/tags/${TAG}" | jq -r '.id // empty')
if [ -n "${REL_ID}" ]; then REL=false; else REL=true; fi
if [ "$REG" = "true" ] || [ "$TAG_NEEDED" = "true" ] || [ "$REL" = "true" ]; then ANY=true; else ANY=false; fi
echo "registry_needed=${REG}" >> $GITHUB_OUTPUT
echo "tag_needed=${TAG_NEEDED}" >> $GITHUB_OUTPUT
echo "release_needed=${REL}" >> $GITHUB_OUTPUT
echo "any_needed=${ANY}" >> $GITHUB_OUTPUT
echo "registry=${REG} / tag=${TAG_NEEDED} / release=${REL} (${NAME} ${TAG})"
- name: Package chart
if: steps.check.outputs.release_needed == 'true'
if: steps.check.outputs.any_needed == 'true'
run: |
set -e
helm package .
@@ -92,8 +109,19 @@ jobs:
echo "CHART_FILE=${CHART_FILE}" >> $GITHUB_ENV
echo "Packaged: ${CHART_FILE}"
- name: Create Git tag
if: steps.check.outputs.tag_needed == 'true'
run: |
set -e
VERSION="${{ steps.info.outputs.version }}"
git config user.name "Claude"
git config user.email "claude@cafepieters.com"
git tag -a "v${VERSION}" -m "Release ${VERSION}" || true
git push origin "v${VERSION}"
echo "Git tag v${VERSION} pushed"
- name: Publish to Gitea Package Registry
if: steps.check.outputs.release_needed == 'true'
if: steps.check.outputs.registry_needed == 'true'
run: |
set -e
curl --fail-with-body \
@@ -103,21 +131,6 @@ jobs:
"${REGISTRY_URL}/api/packages/${OWNER}/helm/api/charts"
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:
@@ -128,37 +141,34 @@ jobs:
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')
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')
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}"
if [ -z "${RELEASE_ID}" ] || [ "${RELEASE_ID}" = "null" ]; then
echo "❌ リリース作成に失敗しました" >&2
exit 1
fi
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}"
- name: Summary
run: |
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"
REG="${{ steps.check.outputs.registry_needed }}"
TAG="${{ steps.check.outputs.tag_needed }}"
REL="${{ steps.check.outputs.release_needed }}"
V="${{ steps.info.outputs.version }}"
if [ "$REG" = "true" ] || [ "$TAG" = "true" ] || [ "$REL" = "true" ]; then
echo "✅ secret-manager v${V} — registry:${REG} tag:${TAG} release:${REL} を処理しました"
else
echo "ℹ️ No release: v${{ steps.info.outputs.version }} is already published."
echo " バージョンを上げたい場合は Chart.yaml の version / appVersion を更新して push してください。"
echo "ℹ️ v${V} は registry / タグ / リリース すべて揃っています。処理なし。"
echo " 新バージョンを出すには Chart.yaml の version / appVersion を上げて push。"
fi