# .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//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