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: Create or update Gitea release if: 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 api="${GITEA_BASE_URL}/api/v1/repos/${GITEA_REPO}" release_name="$TAG" release_body="Release ${TAG}" 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\":\"${release_name}\",\"body\":\"${release_body}\",\"target_commitish\":\"${GITHUB_SHA}\"}") else release_id=$(python3 -c 'import json,sys; print(json.loads(sys.stdin.read())["id"])' <<< "$release_json") curl -fsS -X PATCH \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ "${api}/releases/${release_id}" \ -d "{\"name\":\"${release_name}\",\"body\":\"${release_body}\"}" >/dev/null release_json=$(curl -fsS \ -H "Authorization: token ${GITEA_TOKEN}" \ "${api}/releases/tags/${TAG}") fi if [ "${{ steps.version.outputs.is_app_release }}" != "true" ]; then exit 0 fi if [ ! -f "$CHART_PACKAGE" ]; then echo "Chart package not found: $CHART_PACKAGE" exit 1 fi release_id=$(python3 -c 'import json,sys; print(json.loads(sys.stdin.read())["id"])' <<< "$release_json") file_name=$(basename "$CHART_PACKAGE") 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-public/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