# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json name: Release Plugin on: push: tags: - 'v*' jobs: release: runs-on: alpine-latest defaults: run: shell: sh steps: - name: Install dependencies run: | apk add --no-cache git zip curl jq rsync git config --global http.sslVerify false - name: Checkout run: | git clone --depth 1 \ --branch ${{ github.ref_name }} \ https://x-access-token:${{ secrets.RELEASE_TOKEN }}@${{ vars.RELEASE_URL }}/${{ github.repository }}.git \ . - name: Determine version and channel id: info run: | TAG="${{ github.ref_name }}" VERSION="${TAG#v}" case "$TAG" in *-dev*) CHANNEL="dev" ;; *-beta*) CHANNEL="beta" ;; *) CHANNEL="stable" ;; esac echo "version=${VERSION}" >> $GITHUB_OUTPUT echo "channel=${CHANNEL}" >> $GITHUB_OUTPUT # Nur fürs Log: echo "VERSION: $VERSION" echo "CHANNEL: $CHANNEL" - name: Read plugin.cfg id: cfg run: | CFG=".plugin/plugin.cfg" get_value() { grep -i "^$1" "$CFG" | head -1 | cut -d= -f2- | tr -d '\r' | xargs } echo "zip_folder=$(get_value zip_folder)" >> $GITHUB_OUTPUT echo "name=$(get_value name)" >> $GITHUB_OUTPUT echo "qgis_min=$(get_value qgisMinimumVersion)" >> $GITHUB_OUTPUT echo "qgis_max=$(get_value qgisMaximumVersion)" >> $GITHUB_OUTPUT echo "description=$(get_value description)" >> $GITHUB_OUTPUT echo "author=$(get_value author)" >> $GITHUB_OUTPUT echo "email=$(get_value email)" >> $GITHUB_OUTPUT echo "homepage=$(get_value homepage)" >> $GITHUB_OUTPUT echo "tracker=$(get_value tracker)" >> $GITHUB_OUTPUT echo "repository=$(get_value repository)" >> $GITHUB_OUTPUT echo "experimental=$(get_value experimental)" >> $GITHUB_OUTPUT echo "deprecated=$(get_value deprecated)" >> $GITHUB_OUTPUT # Nur fürs Log: echo "zip_folder=$(get_value zip_folder)" echo "name=$(get_value name)" echo "qgis_min=$(get_value qgisMinimumVersion)" echo "qgis_max=$(get_value qgisMaximumVersion)" echo "description=$(get_value description)" echo "author=$(get_value author)" echo "email=$(get_value email)" echo "homepage=$(get_value homepage)" echo "tracker=$(get_value tracker)" echo "repository=$(get_value repository)" echo "experimental=$(get_value experimental)" echo "deprecated=$(get_value deprecated)" - name: Generate metadata.txt run: | VERSION="${{ steps.info.outputs.version }}" CHANGELOG=$(cat .plugin/changelog.txt) cat > metadata.txt << EOF [general] name=${{ steps.cfg.outputs.name }} version=${VERSION} qgisMinimumVersion=${{ steps.cfg.outputs.qgis_min }} qgisMaximumVersion=${{ steps.cfg.outputs.qgis_max }} description=${{ steps.cfg.outputs.description }} author=${{ steps.cfg.outputs.author }} email=${{ steps.cfg.outputs.email }} homepage=${{ steps.cfg.outputs.homepage }} tracker=${{ steps.cfg.outputs.tracker }} repository=${{ steps.cfg.outputs.repository }} experimental=${{ steps.cfg.outputs.experimental }} deprecated=${{ steps.cfg.outputs.deprecated }} changelog=${VERSION} $(cat .plugin/changelog.txt) EOF # Nur fürs Log: cat metadata.txt - name: Build plugin ZIP run: | REPO_NAME="${{ github.event.repository.name }}" ZIP_FOLDER="${{ steps.cfg.outputs.zip_folder }}" VERSION="${{ steps.info.outputs.version }}" ZIP_NAME="${REPO_NAME}-${VERSION}.zip" # Temporären Ordner mit zip_folder-Namen anlegen mkdir -p dist/${ZIP_FOLDER} # Alle Plugin-Dateien hineinkopieren (ohne .gitea, .plugin, dist) rsync -a \ --exclude='.gitea' \ --exclude='.plugin' \ --exclude='.git' \ --exclude='dist' \ ./ dist/${ZIP_FOLDER}/ # ZIP bauen cd dist zip -r ${ZIP_NAME} ${ZIP_FOLDER}/ \ -x "*.pyc" -x "*/__pycache__/*" cd .. echo "ZIP_NAME=${ZIP_NAME}" >> $GITHUB_ENV # Nur fürs Log: echo "ZIP_NAME=${ZIP_NAME}" - name: Create Gitea Release id: create_release run: | echo "Kommuniziere mit Gitea API über HTTPS..." API_RESPONSE=$(curl -s -k -X POST "https://${{ vars.RELEASE_URL }}/api/v1/repos/${{ github.repository }}/releases" \ -H "accept: application/json" \ -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \ -H "Content-Type: application/json" \ -d '{ "body": "Dieses Release wurde automatisch vom Gitea Runner erstellt.", "draft": false, "name": "Version ${{ github.ref_name }}", "prerelease": false, "tag_name": "${{ github.ref_name }}" }') RELEASE_ID=$(echo $API_RESPONSE | jq -r '.id') if [ "$RELEASE_ID" = "null" ] || [ -z "$RELEASE_ID" ]; then echo "Fehler beim Erstellen des Releases. API Antwort:" echo $API_RESPONSE exit 1 fi echo "Release ID: $RELEASE_ID" echo "RELEASE_ID=$RELEASE_ID" >> $GITHUB_ENV - name: Upload ZIP asset id: upload_asset run: | RESPONSE=$(curl -s -k -X POST "https://${{ vars.RELEASE_URL }}/api/v1/repos/${{ github.repository }}/releases/${{ env.RELEASE_ID }}/assets?name=${ZIP_NAME}" \ -H "accept: application/json" \ -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \ -H "Content-Type: multipart/form-data" \ -F "attachment=${ZIP_NAME}") DOWNLOAD_URL=$(echo "$RESPONSE" | grep -o '"browser_download_url":"[^"]*' | cut -d'"' -f4) echo "download_url=${DOWNLOAD_URL}" >> $GITHUB_OUTPUT echo "Upload response: $RESPONSE" - name: Build XML block id: xmlblock run: | NAME="${{ steps.cfg.outputs.name }}" VERSION="${{ steps.info.outputs.version }}" BLOCK=$(printf ' \n %s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n ' \ "$NAME" \ "$VERSION" \ "${{ steps.cfg.outputs.description }}" \ "${{ steps.cfg.outputs.qgis_min }}" \ "${{ steps.cfg.outputs.qgis_max }}" \ "${{ steps.cfg.outputs.author }}" \ "${{ steps.cfg.outputs.email }}" \ "${{ steps.cfg.outputs.homepage }}" \ "${{ steps.cfg.outputs.tracker }}" \ "${{ steps.cfg.outputs.repository }}" \ "${{ steps.download_url.outputs.download_url }}" \ "${{ steps.cfg.outputs.experimental }}" \ "${{ steps.cfg.outputs.deprecated }}") BLOCK_ESCAPED=$(printf '%s' "$BLOCK" | sed 's/"/\\"/g') echo "block=${BLOCK_ESCAPED}" >> $GITHUB_OUTPUT - name: Dispatch to Repository run: | curl -s -X POST \ -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \ -H "Content-Type: application/json" \ "https://${{ vars.RELEASE_URL }}/api/v1/repos/${{ github.repository_owner }}/Repository/dispatches" \ -d "{ \"type\": \"plugin-released\", \"payload\": { \"plugin\": \"${{ steps.cfg.outputs.name }}\", \"channel\": \"${{ steps.info.outputs.channel }}\", \"xml_block\": \"${{ steps.xmlblock.outputs.block }}\" } }"