Files
Plugin_Test_Action/.gitea/workflows/release.yml
Michael Otto 067e0f3170
All checks were successful
Release Plugin / release (push) Successful in 5s
Release v33
2026-03-03 10:08:03 +01:00

435 lines
16 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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: bash
steps:
- name: Notwendige Abhängigkeiten installieren
shell: sh
run: |
apk add --no-cache git zip curl jq rsync bash
git config --global http.sslVerify false
- name: Code holen
run: |
# Tag aus GitHub Actions Kontext extrahieren
TAG="${GITHUB_REF#refs/tags/}"
echo "DEBUG | Tag erkannt: $TAG"
# Repo-URL dynamisch aus vars und github.repository bauen
REPO_URL="https://${RELEASE_TOKEN}:x-oauth-basic@${{ vars.RELEASE_URL }}/${GITHUB_REPOSITORY}.git"
echo "DEBUG | Klone von: $REPO_URL"
# Repository klonen
git clone "$REPO_URL" repo
cd repo
git checkout "$TAG"
env:
RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }}
- name: Version und Kanal bestimmen
id: releaseinfo
run: |
TAG="${{ github.ref_name }}"
VERSION="${TAG#v}"
case "$TAG" in
*-unstable*) CHANNEL="unstable" ;;
*-testing*) CHANNEL="testing" ;;
*) CHANNEL="stable" ;;
esac
echo "version=${VERSION}" >> $GITHUB_OUTPUT
echo "channel=${CHANNEL}" >> $GITHUB_OUTPUT
echo "DEBUG | Version: $VERSION"
echo "DEBUG | Kanal: $CHANNEL"
- name: metadata.txt erzeugen
run: |
cd repo
VERSION="${{ steps.releaseinfo.outputs.version }}"
# Vorlage kopieren
cp .plugin/metadata.template metadata.txt
# Platzhalter ersetzen
sed -i "s/@VERSION@/${VERSION}/g" metadata.txt
echo "DEBUG | metadata.txt erzeugt:"
cat metadata.txt
- name: ZIP-Datei erstellen
id: zip
run: |
cd repo
# Plugin-Ordnername aus .plugin/zip_folder lesen
ZIP_FOLDER=$(cat .plugin/zip_folder)
echo "DEBUG | Plugin-Ordnername: $ZIP_FOLDER"
VERSION="${{ steps.releaseinfo.outputs.version }}"
REPO_NAME="${GITHUB_REPOSITORY##*/}"
ZIP_NAME="${REPO_NAME}-${VERSION}.zip"
echo "DEBUG | ZIP wird erzeugt: $ZIP_NAME"
# Temporären Build-Ordner anlegen
mkdir -p dist/${ZIP_FOLDER}
# Plugin-Dateien kopieren (alles außer CI-/Meta-Verzeichnisse)
rsync -a \
--exclude='.git' \
--exclude='.gitea' \
--exclude='.plugin' \
--exclude='dist' \
./ dist/${ZIP_FOLDER}/
# ZIP erzeugen
cd dist
zip -r "${ZIP_NAME}" "${ZIP_FOLDER}/" \
-x "*.pyc" -x "*/__pycache__/*"
cd ..
# ZIP-Name für spätere Steps bereitstellen
echo "zip_name=${ZIP_NAME}" >> $GITHUB_OUTPUT
echo "DEBUG | ZIP-Datei erzeugt: dist/${ZIP_NAME}"
- name: GiteaRelease erstellen
id: create_release
run: |
TAG="${{ github.ref_name }}"
VERSION="${{ steps.releaseinfo.outputs.version }}"
CHANNEL="${{ steps.releaseinfo.outputs.channel }}"
echo "Erstelle Release für Tag: $TAG"
echo "Version: $VERSION"
echo "Kanal: $CHANNEL"
API_URL="https://${{ vars.RELEASE_URL }}/api/v1/repos/${GITHUB_REPOSITORY}/releases"
# JSONBody erzeugen
JSON=$(jq -n \
--arg tag "$TAG" \
--arg name "Version $VERSION" \
--arg body "Automatisch erzeugtes Release für Kanal: $CHANNEL" \
'{tag_name: $tag, name: $name, body: $body, draft: false, prerelease: false}')
echo "Sende APIRequest an: $API_URL"
echo "JSONPayload:"
echo "$JSON"
# Release erstellen
API_RESPONSE=$(curl -s -X POST "$API_URL" \
-H "accept: application/json" \
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
-H "Content-Type: application/json" \
-d "$JSON")
RELEASE_ID=$(echo "$API_RESPONSE" | jq -r '.id')
if [ "$RELEASE_ID" = "null" ] || [ -z "$RELEASE_ID" ]; then
echo "Fehler beim Erstellen des Releases!"
echo "APIAntwort:"
echo "$API_RESPONSE"
exit 1
fi
echo "Release erfolgreich erstellt. ID: $RELEASE_ID"
echo "release_id=$RELEASE_ID" >> $GITHUB_OUTPUT
- name: ZIP-Datei hochladen
run: |
RELEASE_ID="${{ steps.create_release.outputs.release_id }}"
ZIP_NAME="${{ steps.zip.outputs.zip_name }}"
echo "Lade ZIP-Datei hoch: $ZIP_NAME"
echo "Release-ID: $RELEASE_ID"
API_URL="https://${{ vars.RELEASE_URL }}/api/v1/repos/${GITHUB_REPOSITORY}/releases/${RELEASE_ID}/assets?name=${ZIP_NAME}"
curl -s -X POST "$API_URL" \
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
-H "Content-Type: application/zip" \
--data-binary "@repo/dist/${ZIP_NAME}" \
-o upload_response.json
echo "Upload-Antwort:"
cat upload_response.json
# Optional: Fehlerprüfung
if jq -e '.id' upload_response.json >/dev/null 2>&1; then
echo "ZIP erfolgreich hochgeladen."
else
echo "Fehler beim Hochladen der ZIP!"
exit 1
fi
- name: Payload erzeugen
run: |
cd repo
PLUGIN_NAME=$(grep '^name=' metadata.txt | cut -d '=' -f2)
DESCRIPTION=$(grep '^description=' metadata.txt | cut -d '=' -f2)
AUTHOR=$(grep '^author=' metadata.txt | cut -d '=' -f2)
EMAIL=$(grep '^email=' metadata.txt | cut -d '=' -f2)
VERSION="${{ steps.releaseinfo.outputs.version }}"
CHANNEL="${{ steps.releaseinfo.outputs.channel }}"
ZIP_NAME="${{ steps.zip.outputs.zip_name }}"
CHANGELOG="${{ steps.changelog.outputs.log }}"
DOWNLOAD_URL="https://${{ vars.RELEASE_URL }}/${GITHUB_REPOSITORY}/releases/download/${{ github.ref_name }}/${ZIP_NAME}"
jq -n \
--arg plugin "$PLUGIN_NAME" \
--arg version "$VERSION" \
--arg channel "$CHANNEL" \
--arg description "$DESCRIPTION" \
--arg author "$AUTHOR" \
--arg email "$EMAIL" \
--arg url "$DOWNLOAD_URL" \
--arg changelog "$CHANGELOG" \
'{
plugin: $plugin,
version: $version,
channel: $channel,
description: $description,
author: $author,
email: $email,
url: $url,
changelog: $changelog
}' > payload.json
echo "Payload:"
cat payload.json
- name: Repository aktualisieren
run: |
OWNER="AG_QGIS"
WORKFLOW="update.yml"
curl -X POST \
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
-H "Content-Type: application/json" \
-d "{\"ref\": \"feature/release\", \"client_payload\": $(cat repo/payload.json) }" \
"https://${{ vars.RELEASE_URL }}/api/v1/repos/${OWNER}/Repository/actions/workflows/${WORKFLOW}/dispatches?event_type=update_plugin"
# - name: Repository aktualisieren
# run: |
# OWNER="AG_QGIS" # z. B. dein Benutzername oder deine Organisation
# WORKFLOW="update.yml" # Name der Workflow-Datei im Repository-Repo
# curl -X POST \
# -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
# -H "Content-Type: application/json" \
# -d "{\"ref\": \"feature/release\", \"inputs\": {}, \"event_type\": \"update_plugin\", \"client_payload\": $(cat repo/payload.json) }" \
# "https://${{ vars.RELEASE_URL }}/api/v1/repos/${OWNER}/Repository/actions/workflows/${WORKFLOW}/dispatches"
# curl -X POST \
# -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
# -H "Content-Type: application/json" \
# -d @repo/payload.json \
# "https://${{ vars.RELEASE_URL }}/api/v1/repos/${OWNER}/Repository/actions/workflows/${WORKFLOW}/dispatches"
- name: Debug Info
run: |
echo "Tag: $GITEA_REF_NAME"
uname -a
# - 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: |
# echo "Lade release_${{ github.ref_name }}.zip (${{ env.ZIP_NAME }}) hoch..."
# RESPONSE=$(curl -s -k -X POST \
# "https://${{ vars.RELEASE_URL }}/api/v1/repos/${{ github.repository }}/releases/${{ env.RELEASE_ID }}/assets?name=${{ env.ZIP_NAME }}" \
# -H "accept: application/json" \
# -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
# -H "Content-Type: multipart/form-data" \
# -F "attachment=@dist/${{ env.ZIP_NAME }}")
# echo "Upload response: $RESPONSE"
# DOWNLOAD_URL=$(echo "$RESPONSE" | grep -o '"browser_download_url":"[^"]*' | cut -d'"' -f4)
# echo "download_url=${DOWNLOAD_URL}" >> $GITHUB_OUTPUT
# - name: Build XML block
# id: xmlblock
# run: |
# NAME="${{ steps.cfg.outputs.name }}"
# VERSION="${{ steps.info.outputs.version }}"
# BLOCK=$(cat <<EOF
# <pyqgis_plugin name="${NAME}" version="${VERSION}">
# <description>${{ steps.cfg.outputs.description }}</description>
# <qgisMinimumVersion>${{ steps.cfg.outputs.qgis_min }}</qgisMinimumVersion>
# <qgisMaximumVersion>${{ steps.cfg.outputs.qgis_max }}</qgisMaximumVersion>
# <author>${{ steps.cfg.outputs.author }}</author>
# <email>${{ steps.cfg.outputs.email }}</email>
# <homepage>${{ steps.cfg.outputs.homepage }}</homepage>
# <tracker>${{ steps.cfg.outputs.tracker }}</tracker>
# <repository>${{ steps.cfg.outputs.repository }}</repository>
# <download_url>${{ steps.upload_asset.outputs.download_url }}</download_url>
# <experimental>${{ steps.cfg.outputs.experimental }}</experimental>
# <deprecated>${{ steps.cfg.outputs.deprecated }}</deprecated>
# </pyqgis_plugin>
# EOF
# )
# {
# echo "block<<EOF"
# echo "$BLOCK"
# echo "EOF"
# } >> "$GITHUB_OUTPUT"
# - name: Dispatch to Repository
# shell: bash
# 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 }}\"
# }
# }"