name: Release on: push: tags: - "v*" - "kks-provider-plugin-*" permissions: contents: write packages: write jobs: release: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Resolve release version id: version run: | tag="${{ github.ref_name }}" if [[ "$tag" == v* ]]; then echo "app_version=${tag#v}" >> "$GITHUB_OUTPUT" echo "is_app_release=true" >> "$GITHUB_OUTPUT" else echo "is_app_release=false" >> "$GITHUB_OUTPUT" fi - name: Install Helm if: steps.version.outputs.is_app_release == 'true' uses: azure/setup-helm@v4 - name: Package Helm chart if: steps.version.outputs.is_app_release == 'true' run: | version="${{ steps.version.outputs.app_version }}" chart_dir="charts/kks-provider-plugin" sed -i "s/^version:.*/version: ${version}/" "${chart_dir}/Chart.yaml" sed -i "s/^appVersion:.*/appVersion: \"${version}\"/" "${chart_dir}/Chart.yaml" helm lint "${chart_dir}" mkdir -p dist helm package "${chart_dir}" --destination dist echo "CHART_PACKAGE=dist/kks-provider-plugin-${version}.tgz" >> "$GITHUB_ENV" - name: Build changelog id: changelog uses: mikepenz/release-changelog-builder-action@v5 with: configurationJson: | { "template": "#{{CHANGELOG}}\n\n**Full Changelog**: #{{RELEASE_DIFF}}", "categories": [ { "title": "## Features", "commits": ["^feat", "^feature"] }, { "title": "## Bug Fixes", "commits": ["^fix", "^Fix"] }, { "title": "## Other Changes", "commits": [".*"] } ] } env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Create or update GitHub release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAG: ${{ github.ref_name }} CHANGELOG: ${{ steps.changelog.outputs.changelog }} run: | if gh release view "$TAG" >/dev/null 2>&1; then gh release edit "$TAG" --notes "$CHANGELOG" else gh release create "$TAG" --title "$TAG" --notes "$CHANGELOG" fi - name: Upload Helm chart to release if: steps.version.outputs.is_app_release == 'true' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAG: ${{ github.ref_name }} run: gh release upload "$TAG" "$CHART_PACKAGE" --clobber - name: Upload Helm chart artifact to Gitea release if: steps.version.outputs.is_app_release == 'true' && secrets.GITEA_TOKEN != '' env: GITEA_BASE_URL: https://git.kloude.ir GITEA_REPO: kloude/kks-provider-plugin GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} TAG: ${{ github.ref_name }} run: | set -euo pipefail if [ ! -f "$CHART_PACKAGE" ]; then echo "Chart package not found: $CHART_PACKAGE" exit 1 fi api="${GITEA_BASE_URL}/api/v1/repos/${GITEA_REPO}" file_name=$(basename "$CHART_PACKAGE") release_json=$(curl -fsS \ -H "Authorization: token ${GITEA_TOKEN}" \ "${api}/releases/tags/${TAG}" || true) if [ -z "$release_json" ]; then release_json=$(curl -fsS -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ "${api}/releases" \ -d "{\"tag_name\":\"${TAG}\",\"name\":\"${TAG}\",\"target_commitish\":\"${GITHUB_SHA}\"}") fi release_id=$(python3 -c 'import json,sys; print(json.loads(sys.stdin.read())["id"])' <<< "$release_json") existing_assets=$(curl -fsS \ -H "Authorization: token ${GITEA_TOKEN}" \ "${api}/releases/${release_id}/assets") existing_asset_id=$(python3 -c 'import json,sys; assets=json.loads(sys.stdin.read()); name=sys.argv[1]; print(next((str(a["id"]) for a in assets if a.get("name")==name), ""))' "$file_name" <<< "$existing_assets") if [ -n "$existing_asset_id" ]; then curl -fsS -X DELETE \ -H "Authorization: token ${GITEA_TOKEN}" \ "${api}/releases/${release_id}/assets/${existing_asset_id}" fi curl -fsS -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/gzip" \ --data-binary "@${CHART_PACKAGE}" \ "${api}/releases/${release_id}/assets?name=${file_name}" - name: Push chart to OCI registry if: steps.version.outputs.is_app_release == 'true' run: | set -euo pipefail repo="oci://registry.kloude.ir/kloude/kks-provider-plugin-charts" if ! helm push --plain-http \ --username "${{ secrets.REGISTRY_USER }}" \ --password "${{ secrets.REGISTRY_PASS }}" \ "$CHART_PACKAGE" "$repo"; then echo "OCI push failed (registry token realm/protocol issue). Continuing because chart artifact is already published to Gitea release assets." fi - name: Make OCI chart public if: steps.version.outputs.is_app_release == 'true' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | owner=$(echo "${GITHUB_REPOSITORY_OWNER}" | tr '[:upper:]' '[:lower:]') gh api --method PATCH "/orgs/${owner}/packages/container/charts%2Fkks-provider-plugin/visibility" -f visibility=public || true