165 lines
5.7 KiB
YAML
165 lines
5.7 KiB
YAML
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: Log in to registry
|
|
if: steps.version.outputs.is_app_release == 'true'
|
|
run: |
|
|
echo "${{ secrets.REGISTRY_PASS }}" | helm registry login registry.kloude.ir \
|
|
--username "${{ secrets.REGISTRY_USER }}" \
|
|
--password-stdin \
|
|
--plain-http
|
|
|
|
- name: Push chart to OCI registry
|
|
if: steps.version.outputs.is_app_release == 'true'
|
|
run: |
|
|
helm push --plain-http "$CHART_PACKAGE" "oci://registry.kloude.ir/kloude/kks-provider-plugin-charts"
|
|
|
|
- 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
|