Files
secret-manager/.gitea/workflows/image-update-and-release.yaml
T
claude 257699fbff
Helm Chart Release / release-chart (push) Successful in 7s
自動更新・リリースワークフローを2本体制に整備
他チャート(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 に自動化ワークフローの節を追加
2026-09-03 10:29:53 +09:00

189 lines
8.2 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# .gitea/workflows/image-update-and-release.yaml
# -------------------------------------------------------------------------
# 週次の自動更新 & リリース ワークフロー(毎週月曜 3:00 AM / JST 12:00 PM)。
#
# ■ 他チャートとの違い
# phpfpm / n8n などは「Docker Hub の上流イメージ最新版」を毎週チェックし、
# 更新があれば values.yaml / Chart.yaml のバージョンを上げてリリースする。
# secret-manager は Secret を生成するだけで **追従すべき上流イメージが無い**
# ため、バージョンの自動採番は行わない(バージョンは常に手動で Chart.yaml
# を更新する)。
#
# ■ このワークフローの役割
# 1. (将来用)追従対象が増えたときに上流チェックを追加する場所を用意する
# (下部のコメントアウト済みサンプルを参照)。
# 2. リリースの取りこぼし対策 — Chart.yaml の version が Package Registry に
# 未公開なら、週次でリリースを実行する(push トリガの helm-release.yaml が
# レジストリ障害等で失敗していた場合のセーフティネット)。
# -------------------------------------------------------------------------
name: Weekly Update and Release
on:
schedule:
- cron: '0 3 * * 1' # 毎週月曜 3:00 AM UTC(JST 12:00 PM)
workflow_dispatch:
env:
REGISTRY_URL: https://git.cafepieters.com
OWNER: helmchart
jobs:
update-and-release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Install Helm
uses: azure/setup-helm@v3
with:
version: 'v3.12.0'
- name: Ensure jq
run: |
command -v jq >/dev/null 2>&1 || { apt-get update -qq && apt-get install -y -qq jq; }
jq --version
# -------------------------------------------------------------------
# ▼▼▼ 将来、追従対象(イメージ / サブチャート等)が増えたらここに追加 ▼▼▼
#
# 例: 上流コンテナの最新タグを Docker Hub から取得して values.yaml を書き換え、
# 必要なら Chart.yaml の version / appVersion も更新する。
#
# - name: Check upstream image
# id: upstream
# run: |
# set -e
# CURRENT=$(grep 'tag:' values.yaml | head -1 | sed 's/.*tag: *"\([^"]*\)".*/\1/')
# LATEST=$(curl -s "https://registry.hub.docker.com/v2/repositories/<repo>/tags?page_size=100" \
# | jq -r '.results[].name' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -1)
# echo "current=$CURRENT" >> $GITHUB_OUTPUT
# echo "latest=$LATEST" >> $GITHUB_OUTPUT
#
# - name: Apply update
# if: steps.upstream.outputs.current != steps.upstream.outputs.latest
# run: |
# set -e
# sed -i "s/tag: \"${{ steps.upstream.outputs.current }}\"/tag: \"${{ steps.upstream.outputs.latest }}\"/" values.yaml
# sed -i "s/^version: .*/version: ${{ steps.upstream.outputs.latest }}/" Chart.yaml
# sed -i "s/^appVersion: .*/appVersion: \"${{ steps.upstream.outputs.latest }}\"/" Chart.yaml
# git config user.name "Claude"; git config user.email "claude@cafepieters.com"
# git add values.yaml Chart.yaml
# git commit -m "chore: update upstream to ${{ steps.upstream.outputs.latest }}"
# git push origin main
#
# ▲▲▲ ここまで ▲▲▲
# -------------------------------------------------------------------
- name: Get chart info
id: info
run: |
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: Validate chart
run: helm lint --strict .
- name: Check whether this version is already released
id: check
run: |
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 "${{ 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: |
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 "✅ 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
run: |
if [ "${{ steps.check.outputs.release_needed }}" = "true" ]; then
echo "✅ Weekly release done: secret-manager v${{ steps.info.outputs.version }}"
else
echo "ℹ️ Nothing to do: v${{ steps.info.outputs.version }} already published."
fi