# .gitea/workflows/helm-release.yaml # ------------------------------------------------------------------------- # secret-manager 用のチャート公開ワークフロー。 # # 他リポジトリの「毎 push で無条件公開」する共通版とは異なり、この版は # 「Chart.yaml の version が Package Registry に未公開のときだけリリースする」。 # 既に同じバージョンが公開済みなら何もしない(README や examples だけの # 変更で push してもリリースは発生しない)。 # # リリース = Package Registry への発行 + Git タグ + Gitea リリース(tgz 添付)。 # ------------------------------------------------------------------------- name: Helm Chart Release on: push: branches: - main - master paths: - 'Chart.yaml' - 'values.yaml' - 'values.schema.json' - 'templates/**' - '.gitea/workflows/helm-release.yaml' workflow_dispatch: env: REGISTRY_URL: https://git.cafepieters.com OWNER: helmchart jobs: release-chart: 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 - 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 "================================" 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