From b38c73c511d8fbad6e79767aa1eefe19dfadc7d6 Mon Sep 17 00:00:00 2001 From: adtpdn Date: Mon, 13 Jul 2026 12:38:49 +0800 Subject: [PATCH] feat: fix the asset broken link, and use the gitea .workflow --- .gitea/workflows/ci.yml | 154 ++++++++++++++++++ .gitea/workflows/deploy_patch.yml | 68 ++++++++ .github/workflows/deploy_patch.yml | 81 --------- .../clothing/oldpop_mat_cloth_white_pant.tres | 9 - assets/models/ancient-lightning-stones.tres | 4 - .../models/meshes/ancient_lightning_stone.mtl | 2 +- tiles_armagedon_a1.res | Bin 11552 -> 0 bytes 7 files changed, 223 insertions(+), 95 deletions(-) create mode 100644 .gitea/workflows/ci.yml create mode 100644 .gitea/workflows/deploy_patch.yml delete mode 100644 .github/workflows/deploy_patch.yml delete mode 100644 assets/characters/skins/clothing/oldpop_mat_cloth_white_pant.tres delete mode 100644 tiles_armagedon_a1.res diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..83aff09 --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,154 @@ +name: Release + +on: + push: + tags: + - "v*" + +jobs: + release: + name: Build & Release + runs-on: ubuntu-latest + timeout-minutes: 30 + env: + GITEA_TOKEN: ${{ secrets.TEKTON_RELEASE_TOKEN }} + TAG_NAME: ${{ github.ref_name }} + steps: + - name: Install tools + run: apt-get update -qq && apt-get install -y -qq curl unzip zip + + - name: Checkout Code + run: | + git config --global credential.helper store + echo "https://god:${{ secrets.TEKTON_RELEASE_TOKEN }}@git.klud.top" > ~/.git-credentials + git clone https://git.klud.top/danchie/tekton.git . + git checkout $TAG_NAME + + - name: Setup Godot (Cached) + run: | + apt-get update -qq && apt-get install -y -qq unzip curl + if [ ! -f /cache/godot_4.6.3 ]; then + echo "Downloading Godot 4.6.3..." + curl -sL -o /tmp/godot.zip "https://github.com/godotengine/godot-builds/releases/download/4.6.3-stable/Godot_v4.6.3-stable_linux.x86_64.zip" + unzip -q -o /tmp/godot.zip -d /cache/ + mv /cache/Godot_v4.6.3-stable_linux.x86_64 /cache/godot_4.6.3 + fi + cp /cache/godot_4.6.3 /usr/local/bin/godot + chmod +x /usr/local/bin/godot + mkdir -p ~/.local/share/godot/export_templates/4.6.3.stable + if [ ! -f /cache/Godot_v4.6.3-stable_export_templates.tpz ]; then + echo "Downloading templates..." + curl -sL -o /cache/Godot_v4.6.3-stable_export_templates.tpz \ + "https://github.com/godotengine/godot-builds/releases/download/4.6.3-stable/Godot_v4.6.3-stable_export_templates.tpz" + fi + cd ~/.local/share/godot/export_templates/4.6.3.stable + unzip -q -o /cache/Godot_v4.6.3-stable_export_templates.tpz + mv templates/* . + rm -rf templates + cd $GITHUB_WORKSPACE + mkdir -p build + + - name: Export Windows + run: | + mkdir -p build/windows + cp addons/godotsteam/libgodotsteam* build/windows/ 2>/dev/null || true + godot --headless --export-release "Windows Desktop" build/windows/tekton_armageddon_windows.exe || true + cd build/windows && zip -r ../tekton_armageddon_windows_${TAG_NAME}.zip . + + - name: Export Linux + run: | + mkdir -p build/linux + godot --headless --export-release "Linux/X11" build/linux/tekton_armageddon_linux.x86_64 || true + cd build/linux && zip -r ../tekton_armageddon_linux_${TAG_NAME}.zip . + + - name: Export macOS + run: | + mkdir -p build/macos + godot --headless --export-release "macOS" build/macos/tekton_armageddon_macos.zip 2>&1 | tail -5 || true + if [ -f build/macos/tekton_armageddon_macos.zip ]; then + mv build/macos/tekton_armageddon_macos.zip build/tekton_armageddon_macos_${TAG_NAME}.zip + fi + + - name: Extract changelog + run: | + # Extract changelog for this tag version from CHANGELOG_DRAFT.md + V="${TAG_NAME#v}" + BODY=$(awk -v ver="[$V]" ' + /^## / { if (found) exit } + /^## / && index($0, ver) { found=1; next } + found { print } + ' CHANGELOG_DRAFT.md | sed 's/^ *//') + echo "CHANGELOG_BODY<> $GITHUB_ENV + echo "$BODY" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + - name: Create Gitea Release + run: | + set -e + API="https://git.klud.top/api/v1/repos/danchie/tekton/releases" + TAG="$TAG_NAME" + echo "Checking existing release for $TAG..." + RELEASE_JSON=$(curl -s -H "Authorization: token $GITEA_TOKEN" "$API/tags/$TAG" 2>/dev/null || echo "") + RELEASE_ID=$(echo "$RELEASE_JSON" | grep -o '"id":[0-9]*' | head -1 | grep -o '[0-9]*' || true) + if [ -z "$RELEASE_ID" ]; then + echo "Creating new release for $TAG..." + # Escape body for JSON + BODY_ESCAPED=$(echo "$CHANGELOG_BODY" | python3 -c "import json,sys; print(json.dumps(sys.stdin.read().strip()))" 2>/dev/null || echo '""') + RELEASE_JSON=$(curl -s -X POST \ + -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + -d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"body\":$BODY_ESCAPED,\"draft\":true}" \ + "$API") + echo "API response: $RELEASE_JSON" + RELEASE_ID=$(echo "$RELEASE_JSON" | grep -o '"id":[0-9]*' | head -1 | grep -o '[0-9]*') + if [ -z "$RELEASE_ID" ]; then + echo "FATAL: Could not create release" + exit 1 + fi + fi + echo "release_id=$RELEASE_ID" + echo "$RELEASE_ID" > /tmp/release_id.txt + + - name: Upload Windows asset + run: | + RELEASE_ID=$(cat /tmp/release_id.txt) + curl -s -X POST \ + -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: multipart/form-data" \ + -F "attachment=@build/tekton_armageddon_windows_${TAG_NAME}.zip" \ + "https://git.klud.top/api/v1/repos/danchie/tekton/releases/$RELEASE_ID/assets" + echo "Windows uploaded" + + - name: Upload Linux asset + run: | + RELEASE_ID=$(cat /tmp/release_id.txt) + curl -s -X POST \ + -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: multipart/form-data" \ + -F "attachment=@build/tekton_armageddon_linux_${TAG_NAME}.zip" \ + "https://git.klud.top/api/v1/repos/danchie/tekton/releases/$RELEASE_ID/assets" + echo "Linux uploaded" + + - name: Upload macOS asset + run: | + RELEASE_ID=$(cat /tmp/release_id.txt) + if [ -f "build/tekton_armageddon_macos_${TAG_NAME}.zip" ]; then + curl -s -X POST \ + -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: multipart/form-data" \ + -F "attachment=@build/tekton_armageddon_macos_${TAG_NAME}.zip" \ + "https://git.klud.top/api/v1/repos/danchie/tekton/releases/$RELEASE_ID/assets" + echo "macOS uploaded" + else + echo "macOS asset not built, skipping" + fi + + - name: Publish release + run: | + RELEASE_ID=$(cat /tmp/release_id.txt) + curl -s -X PATCH \ + -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"draft":false}' \ + "https://git.klud.top/api/v1/repos/danchie/tekton/releases/$RELEASE_ID" + echo "Published: https://git.klud.top/danchie/tekton/releases/tag/$TAG_NAME" diff --git a/.gitea/workflows/deploy_patch.yml b/.gitea/workflows/deploy_patch.yml new file mode 100644 index 0000000..a17c96a --- /dev/null +++ b/.gitea/workflows/deploy_patch.yml @@ -0,0 +1,68 @@ +name: Deploy Patch + +on: + workflow_dispatch: + inputs: + version: + description: "Patch version (e.g., 2.4.4)" + required: true + type: string + notes: + description: "Release notes" + required: false + type: string + +jobs: + build-and-deploy: + name: Build & Deploy Patch + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repository (shallow) + env: + GITEA_TOKEN: ${{ secrets.TEKTON_RELEASE_TOKEN }} + run: | + git clone --depth 1 https://god:$GITEA_TOKEN@git.klud.top/danchie/tekton.git . + git config user.name "god" + git config user.email "god@noreply.git.klud.top" + + - name: Setup Godot (Cached) + run: | + if [ ! -f /cache/godot_4.6.3 ]; then + echo "Downloading Godot 4.6.3..." + apt-get update -qq && apt-get install -y -qq unzip curl + curl -sL -o /tmp/godot.zip "https://github.com/godotengine/godot-builds/releases/download/4.6.3-stable/Godot_v4.6.3-stable_linux.x86_64.zip" + unzip -q -o /tmp/godot.zip -d /cache/ + mv /cache/Godot_v4.6.3-stable_linux.x86_64 /cache/godot_4.6.3 + fi + cp /cache/godot_4.6.3 /usr/local/bin/godot + chmod +x /usr/local/bin/godot + mkdir -p build + + - name: Generate version.json & bump version + env: + PATCH_VERSION: ${{ github.event.inputs.version }} + PATCH_NOTES: ${{ github.event.inputs.notes }} + run: | + python3 tools/generate_version_json.py --skip-changelog + + - name: Export patch PCK + run: | + godot --headless --export-pack "Windows Desktop" build/patch.pck 2>&1 | tail -5 + + - name: Push to patches branch + env: + GITEA_TOKEN: ${{ secrets.TEKTON_RELEASE_TOKEN }} + run: | + mkdir -p patch-deploy + cp build/patch.pck patch-deploy/ + cp assets/data/version.json patch-deploy/ + cd patch-deploy + git init + git config user.name "god" + git config user.email "god@noreply.git.klud.top" + git remote add origin https://god:$GITEA_TOKEN@git.klud.top/danchie/tekton.git + git checkout -b patches + git add . + git commit -m "patch ${{ github.event.inputs.version }}" + git push -f origin patches diff --git a/.github/workflows/deploy_patch.yml b/.github/workflows/deploy_patch.yml deleted file mode 100644 index 0083ba7..0000000 --- a/.github/workflows/deploy_patch.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: Build and Release Patch PCK - -on: - push: - branches: - - 'patch-release' - paths: - - 'scripts/**' - - 'scenes/**' - - 'assets/**' - - 'CHANGELOG_DRAFT.md' - workflow_dispatch: - -jobs: - build-and-deploy-patch: - runs-on: ubuntu-latest - permissions: - contents: write - - steps: - - name: Checkout Source Code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - # ── 1. Auto-generate version.json from CHANGELOG_DRAFT.md ──────────── - - name: Generate Version JSON & Bump Version - run: python3 tools/generate_version_json.py - - # ── 2. Commit bumped files back to the repo ─────────────────────────── - - name: Commit Version Bump - run: | - git config user.name "PatchBot" - git config user.email "action@github.com" - git add assets/data/version.json project.godot CHANGELOG_DRAFT.md - git diff --staged --quiet || git commit -m "[AUTO] Version bump & changelog update" - git push - - # ── 3. Detect changed files for patch PCK ──────────────────────────── - - name: Generate Changed Files List - run: | - git diff --name-only HEAD^ HEAD -- 'scripts/**' 'scenes/**' 'assets/**' > changed_files.txt - echo "Files to patch:" - cat changed_files.txt - - # ── 4. Build patch.pck ──────────────────────────────────────────────── - - name: Setup Godot - uses: chickensoft-games/setup-godot@v1 - with: - version: '4.3.0' - use-dotnet: false - - - name: Run Build Patch Script - run: godot --headless -s tools/build_patch.gd - - # ── 5. Push patch.pck to public repo ───────────────────────────────── - - name: Push patch.pck to Public Repository - uses: dmnemec/copy_file_to_another_repo_action@main - env: - API_TOKEN_GITHUB: ${{ secrets.PUBLIC_REPO_PAT }} - with: - source_file: 'patch.pck' - destination_repo: '${{ github.actor }}/tekton-updates' - destination_folder: 'latest' - user_email: 'action@github.com' - user_name: 'PatchBot' - commit_message: '[AUTO] Pushed new patch.pck' - - # ── 6. Push version.json to public repo ────────────────────────────── - - name: Push version.json to Public Repository - uses: dmnemec/copy_file_to_another_repo_action@main - env: - API_TOKEN_GITHUB: ${{ secrets.PUBLIC_REPO_PAT }} - with: - source_file: 'assets/data/version.json' - destination_repo: '${{ github.actor }}/tekton-updates' - destination_folder: 'latest' - user_email: 'action@github.com' - user_name: 'PatchBot' - commit_message: '[AUTO] Pushed new version.json' diff --git a/assets/characters/skins/clothing/oldpop_mat_cloth_white_pant.tres b/assets/characters/skins/clothing/oldpop_mat_cloth_white_pant.tres deleted file mode 100644 index 6c47561..0000000 --- a/assets/characters/skins/clothing/oldpop_mat_cloth_white_pant.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="StandardMaterial3D" format=3 uid="uid://v1qdug4x2ifm"] - -[ext_resource type="Texture2D" uid="uid://d0egs6j3sg0me" path="res://assets/characters/skins/clothing/oldpop_cloth_white_pant.png" id="1_fw7uu"] - -[resource] -transparency = 2 -alpha_scissor_threshold = 0.5 -alpha_antialiasing_mode = 0 -albedo_texture = ExtResource("1_fw7uu") diff --git a/assets/models/ancient-lightning-stones.tres b/assets/models/ancient-lightning-stones.tres index 3953676..658c67b 100644 --- a/assets/models/ancient-lightning-stones.tres +++ b/assets/models/ancient-lightning-stones.tres @@ -1,7 +1,3 @@ [gd_resource type="StandardMaterial3D" format=3 uid="uid://deufkavgeo0jg"] -[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_ywepx"] -load_path = "res://.godot/imported/4e3103ab214e443c83147afcd786aa6e_RGB_M_Buche_albedo.jpeg-69394e445366683380463d4afc846305.s3tc.ctex" - [resource] -albedo_texture = SubResource("CompressedTexture2D_ywepx") diff --git a/assets/models/meshes/ancient_lightning_stone.mtl b/assets/models/meshes/ancient_lightning_stone.mtl index c934b9f..d42a220 100644 --- a/assets/models/meshes/ancient_lightning_stone.mtl +++ b/assets/models/meshes/ancient_lightning_stone.mtl @@ -9,4 +9,4 @@ Ke 0.000000 0.000000 0.000000 Ni 1.500000 d 1.000000 illum 2 -map_Kd C:/Users/beng/Downloads/3d_Ripper_Pro_v103/Downloads/SarahMyriamMadi/01- Handpainted.Log/4e3103ab214e443c83147afcd786aa6e_RGB_M_Buche_albedo.jpeg + diff --git a/tiles_armagedon_a1.res b/tiles_armagedon_a1.res deleted file mode 100644 index db713e88672f701c858f670eb2d521335e777f4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11552 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