From 7f5368bc8fc49d357f018a6aa26b8585e637307d Mon Sep 17 00:00:00 2001 From: DragonSlayer_14 Date: Mon, 21 Sep 2026 00:28:06 +0200 Subject: [PATCH] CI: Fuegt automatisiertes Nightly-Release und Testing-Registry-Publish hinzu, behebt Zeitzone bei geplanten Workflows - Neuer Workflow "nightly-pr.yaml": Erstellt und merged taeglich automatisch einen Pull Request von dev nach nightly (09:00 Uhr Europe/Berlin); legt den nightly-Branch bei Bedarf initial von dev an. - Neuer Workflow "nightly.yaml": Testet, paketiert und veroeffentlicht bei Aenderungen auf nightly eine Pre-Release-Version (-nightly.) in die Gitea Cargo Registry; erstellt bewusst kein Gitea-Release. - testing.yaml veroeffentlicht nun zusaetzlich eine Pre-Release-Version (-testing.) in die Gitea Cargo Registry, zusaetzlich zum bisherigen Preview-Release mit Crate-Anhang. - Beide Versions-Suffixe sind SemVer-Pre-Releases, wodurch Renovates Standardverhalten (ignoreUnstable) sie automatisch ignoriert. - CRON_TZ=Europe/Berlin in security-scan.yaml und trufflehog-scan.yaml ergaenzt: Gitea Actions interpretiert schedule-Cron sonst in der lokalen Zeitzone des Gitea-Servers statt in der beabsichtigten Zeitzone. Co-Authored-By: Claude Sonnet 5 --- .gitea/workflows/nightly-pr.yaml | 91 +++++++++++++++++++++++++ .gitea/workflows/nightly.yaml | 97 +++++++++++++++++++++++++++ .gitea/workflows/security-scan.yaml | 2 +- .gitea/workflows/testing.yaml | 49 +++++++++++++- .gitea/workflows/trufflehog-scan.yaml | 2 +- 5 files changed, 237 insertions(+), 4 deletions(-) create mode 100644 .gitea/workflows/nightly-pr.yaml create mode 100644 .gitea/workflows/nightly.yaml diff --git a/.gitea/workflows/nightly-pr.yaml b/.gitea/workflows/nightly-pr.yaml new file mode 100644 index 0000000..287b251 --- /dev/null +++ b/.gitea/workflows/nightly-pr.yaml @@ -0,0 +1,91 @@ +name: Nightly Auto-Merge (Dev → Nightly) + +on: + schedule: + # Gitea Actions interpretiert 'schedule'-Cron standardmaessig in der lokalen + # Zeitzone des Gitea-Servers (anders als GitHub Actions, das immer UTC nutzt). + # Das CRON_TZ-Praefix ist eine Gitea-Erweiterung und legt die Zeitzone explizit + # und DST-sicher fest, unabhaengig von der Server-Konfiguration. + - cron: "CRON_TZ=Europe/Berlin 0 9 * * *" + workflow_dispatch: + +jobs: + merge-dev-into-nightly: + name: Erstelle & merge automatisch PR von dev nach nightly + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v7 + with: + fetch-depth: 0 + token: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }} + + - name: Stelle sicher, dass der nightly-Branch existiert + run: | + git fetch origin dev + if git ls-remote --exit-code --heads origin nightly > /dev/null 2>&1; then + echo "nightly-Branch existiert bereits." + else + echo "nightly-Branch existiert noch nicht, erstelle ihn initial von dev..." + git push origin origin/dev:refs/heads/nightly + fi + + - name: Prüfe auf Unterschiede zwischen dev und nightly + id: diff + run: | + git fetch origin nightly + if git diff --quiet origin/nightly origin/dev; then + echo "Keine Unterschiede zwischen dev und nightly, überspringe." + echo "has_changes=false" >> "$GITHUB_OUTPUT" + else + echo "has_changes=true" >> "$GITHUB_OUTPUT" + fi + + - name: Prüfe auf bereits offenen PR nach nightly + id: check_pr + if: steps.diff.outputs.has_changes == 'true' + env: + GITEA_URL: ${{ gitea.server_url || github.server_url }} + REPO: ${{ gitea.repository || github.repository }} + TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }} + run: | + OPEN_PRS=$(curl -s -H "Authorization: token ${TOKEN}" "${GITEA_URL}/api/v1/repos/${REPO}/pulls?state=open&limit=50") + PR_NUMBER=$(echo "$OPEN_PRS" | jq -r '[.[] | select(.base.ref == "nightly" and .head.ref == "dev")][0].number // empty') + echo "Bereits offener dev→nightly PR: ${PR_NUMBER:-keiner}" + echo "pr_number=${PR_NUMBER}" >> "$GITHUB_OUTPUT" + + - name: Erstelle PR (dev -> nightly) + id: create_pr + if: steps.diff.outputs.has_changes == 'true' && steps.check_pr.outputs.pr_number == '' + env: + GITEA_URL: ${{ gitea.server_url || github.server_url }} + REPO: ${{ gitea.repository || github.repository }} + TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }} + run: | + DATE="$(date -u +%Y-%m-%d)" + PAYLOAD=$(jq -n --arg title "Nightly-Build: Merge dev in nightly (${DATE})" --arg head "dev" --arg base "nightly" \ + '{title: $title, head: $head, base: $base}') + RESP=$(curl -f -s -S -X POST \ + -H "Authorization: token ${TOKEN}" \ + -H "Content-Type: application/json" \ + -d "$PAYLOAD" \ + "${GITEA_URL}/api/v1/repos/${REPO}/pulls") + PR_NUMBER=$(echo "$RESP" | jq -r '.number') + echo "PR #${PR_NUMBER} erstellt." + echo "pr_number=${PR_NUMBER}" >> "$GITHUB_OUTPUT" + + - name: Merge PR automatisch + if: steps.diff.outputs.has_changes == 'true' + env: + GITEA_URL: ${{ gitea.server_url || github.server_url }} + REPO: ${{ gitea.repository || github.repository }} + TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }} + PR_NUMBER: ${{ steps.create_pr.outputs.pr_number || steps.check_pr.outputs.pr_number }} + run: | + echo "Merge PR #${PR_NUMBER} automatisch (dev -> nightly)..." + curl -f -s -S -X POST \ + -H "Authorization: token ${TOKEN}" \ + -H "Content-Type: application/json" \ + -d '{"Do": "merge"}' \ + "${GITEA_URL}/api/v1/repos/${REPO}/pulls/${PR_NUMBER}/merge" + echo "PR #${PR_NUMBER} erfolgreich gemerged." diff --git a/.gitea/workflows/nightly.yaml b/.gitea/workflows/nightly.yaml new file mode 100644 index 0000000..3c85929 --- /dev/null +++ b/.gitea/workflows/nightly.yaml @@ -0,0 +1,97 @@ +name: Nightly Build & Publish + +on: + push: + branches: + - nightly + +jobs: + detect-changes: + name: Erkenne relevante Code-Änderungen + runs-on: ubuntu-latest + outputs: + code_changed: ${{ steps.filter.outputs.code }} + steps: + - name: Checkout Repository + uses: actions/checkout@v7 + + - name: Prüfe auf Änderungen am Programmcode + uses: dorny/paths-filter@v4 + id: filter + with: + filters: | + code: + - 'src/**' + - 'Cargo.toml' + - 'Cargo.lock' + - 'scripts/**' + - '.cargo/**' + - '.gitea/workflows/nightly.yaml' + + build-and-publish: + name: Build & Publish Nightly-Crate zur Gitea Registry + needs: detect-changes + if: needs.detect-changes.outputs.code_changed == 'true' + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v7 + + - name: Install Rust Toolchain + uses: actions-rust-lang/setup-rust-toolchain@v2 + with: + toolchain: stable + cache: false + + - name: Cache Cargo-Abhängigkeiten & Build-Artefakte + uses: Swatinem/rust-cache@v2 + + - name: Run Tests + run: | + cargo test + + - name: Compiler Check + run: | + cargo check --all-targets + + # Nightly-Builds duerfen nie als regulaeres Update erscheinen: Ein SemVer-Pre-Release- + # Suffix (-nightly.) sorgt dafuer, dass Renovates Standardverhalten + # (ignoreUnstable: true) diese Version automatisch ignoriert, solange die Basis-Version + # in Cargo.toml selbst kein Pre-Release ist. Die Aenderung ist rein fuer den Build- + # Workspace bestimmt und wird nie zurueck in den Branch committet. + - name: Ermittle & setze Nightly-Version (temporär, wird nicht committet) + id: nightly_version + run: | + BASE_VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)" + TIMESTAMP="$(date -u +%Y%m%d%H%M)" + NIGHTLY_VERSION="${BASE_VERSION}-nightly.${TIMESTAMP}" + echo "Basis-Version: ${BASE_VERSION} -> Nightly-Version: ${NIGHTLY_VERSION}" + sed -i "0,/^version = \"${BASE_VERSION}\"/s//version = \"${NIGHTLY_VERSION}\"/" Cargo.toml + echo "version=${NIGHTLY_VERSION}" >> "$GITHUB_OUTPUT" + + - name: Package Crate + run: | + cargo package --allow-dirty + + - name: Publish Nightly-Crate zur Gitea Package Registry + env: + GITEA_URL: ${{ gitea.server_url || github.server_url }} + REPO_OWNER: ${{ gitea.repository_owner || github.repository_owner }} + TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }} + run: | + mkdir -p ~/.cargo + cat < ~/.cargo/config.toml + [registries.gitea] + index = "sparse+${GITEA_URL}/api/packages/${REPO_OWNER}/cargo/" + EOF + + cat < ~/.cargo/credentials.toml + [registries.gitea] + token = "Bearer ${TOKEN}" + EOF + + export CARGO_REGISTRIES_GITEA_INDEX="sparse+${GITEA_URL}/api/packages/${REPO_OWNER}/cargo/" + export CARGO_REGISTRIES_GITEA_TOKEN="Bearer ${TOKEN}" + + echo "Veröffentliche Nightly-Crate ${{ steps.nightly_version.outputs.version }} in Gitea Cargo Package Registry..." + cargo publish --registry gitea --allow-dirty diff --git a/.gitea/workflows/security-scan.yaml b/.gitea/workflows/security-scan.yaml index 040bef7..54d3bea 100644 --- a/.gitea/workflows/security-scan.yaml +++ b/.gitea/workflows/security-scan.yaml @@ -8,7 +8,7 @@ on: - dev pull_request: schedule: - - cron: "0 5 * * 1" + - cron: "CRON_TZ=Europe/Berlin 0 5 * * 1" workflow_dispatch: jobs: diff --git a/.gitea/workflows/testing.yaml b/.gitea/workflows/testing.yaml index fbefcde..4c7a9dc 100644 --- a/.gitea/workflows/testing.yaml +++ b/.gitea/workflows/testing.yaml @@ -60,9 +60,54 @@ jobs: run: | cargo check --all-targets + - name: Ermittle Basis-Version (für Release-Tag) + id: base_version + run: | + BASE_VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)" + echo "version=${BASE_VERSION}" >> "$GITHUB_OUTPUT" + + # Testing-Builds duerfen nie als regulaeres Update erscheinen: Ein SemVer-Pre-Release- + # Suffix (-testing.) sorgt dafuer, dass Renovates Standardverhalten + # (ignoreUnstable: true) diese Version automatisch ignoriert, solange die Basis-Version + # in Cargo.toml selbst kein Pre-Release ist. Die Aenderung ist rein fuer den Build- + # Workspace bestimmt und wird nie zurueck in den Branch committet; der Release-Tag + # weiter unten nutzt bewusst die zuvor ermittelte Basis-Version, damit er stabil bleibt. + - name: Ermittle & setze Testing-Version (temporär, wird nicht committet) + id: testing_version + run: | + BASE_VERSION="${{ steps.base_version.outputs.version }}" + TIMESTAMP="$(date -u +%Y%m%d%H%M)" + TESTING_VERSION="${BASE_VERSION}-testing.${TIMESTAMP}" + echo "Basis-Version: ${BASE_VERSION} -> Testing-Version: ${TESTING_VERSION}" + sed -i "0,/^version = \"${BASE_VERSION}\"/s//version = \"${TESTING_VERSION}\"/" Cargo.toml + echo "version=${TESTING_VERSION}" >> "$GITHUB_OUTPUT" + - name: Package Crate run: | - cargo package + cargo package --allow-dirty + + - name: Publish Testing-Crate zur Gitea Package Registry + env: + GITEA_URL: ${{ gitea.server_url || github.server_url }} + REPO_OWNER: ${{ gitea.repository_owner || github.repository_owner }} + TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }} + run: | + mkdir -p ~/.cargo + cat < ~/.cargo/config.toml + [registries.gitea] + index = "sparse+${GITEA_URL}/api/packages/${REPO_OWNER}/cargo/" + EOF + + cat < ~/.cargo/credentials.toml + [registries.gitea] + token = "Bearer ${TOKEN}" + EOF + + export CARGO_REGISTRIES_GITEA_INDEX="sparse+${GITEA_URL}/api/packages/${REPO_OWNER}/cargo/" + export CARGO_REGISTRIES_GITEA_TOKEN="Bearer ${TOKEN}" + + echo "Veröffentliche Testing-Crate ${{ steps.testing_version.outputs.version }} in Gitea Cargo Package Registry..." + cargo publish --registry gitea --allow-dirty - name: Create Gitea Pre-Release and Upload Assets env: @@ -71,7 +116,7 @@ jobs: REPO_NAME: ${{ gitea.repository_name || github.event.repository.name }} TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }} run: | - VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)" + VERSION="${{ steps.base_version.outputs.version }}" TAG_NAME="v${VERSION}-preview" RELEASE_TITLE="Preview Release ${TAG_NAME}" RELEASE_NOTES="Automatisches Preview-Release für ${REPO_NAME} Crate ${VERSION} (Branch: Testing)." diff --git a/.gitea/workflows/trufflehog-scan.yaml b/.gitea/workflows/trufflehog-scan.yaml index c6457cd..b059507 100644 --- a/.gitea/workflows/trufflehog-scan.yaml +++ b/.gitea/workflows/trufflehog-scan.yaml @@ -4,7 +4,7 @@ on: push: pull_request: schedule: - - cron: "0 6 * * 1" + - cron: "CRON_TZ=Europe/Berlin 0 6 * * 1" workflow_dispatch: jobs: