Feat: Überspringt Release/Publish bei bereits veröffentlichter Version
Security Scans / Trivy & OSV-Scanner (push) Successful in 52s
TruffleHog Secret Scan / TruffleHog (push) Successful in 28s
Code Quality (Auto-Format & Clippy-Fix) / Formatierung & Clippy automatisch beheben (push) Successful in 56s
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Skipped
Security Scans / Trivy & OSV-Scanner (push) Successful in 52s
TruffleHog Secret Scan / TruffleHog (push) Successful in 28s
Code Quality (Auto-Format & Clippy-Fix) / Formatierung & Clippy automatisch beheben (push) Successful in 56s
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Skipped
Prüft vor Build & Tests per Gitea Package-API, ob die aktuelle Crate-Version schon in der Registry existiert, und bricht den Release/Publish-Job dann gar nicht erst an, statt an einem Registry-Fehler zu scheitern. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K2DxAVavuu4vMb2MC2G15g
This commit is contained in:
@@ -11,6 +11,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
code_changed: ${{ steps.filter.outputs.code }}
|
code_changed: ${{ steps.filter.outputs.code }}
|
||||||
|
version_exists: ${{ steps.check-version.outputs.exists }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v7
|
uses: actions/checkout@v7
|
||||||
@@ -28,10 +29,20 @@ jobs:
|
|||||||
- '.cargo/**'
|
- '.cargo/**'
|
||||||
- '.gitea/workflows/main.yaml'
|
- '.gitea/workflows/main.yaml'
|
||||||
|
|
||||||
|
- name: Prüfe ob Version bereits in der Registry existiert
|
||||||
|
id: check-version
|
||||||
|
if: steps.filter.outputs.code == 'true'
|
||||||
|
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: |
|
||||||
|
python3 scripts/check-version-published.py
|
||||||
|
|
||||||
release-and-publish:
|
release-and-publish:
|
||||||
name: Build, Publish Crate to Gitea Registry & Create Release
|
name: Build, Publish Crate to Gitea Registry & Create Release
|
||||||
needs: detect-changes
|
needs: detect-changes
|
||||||
if: needs.detect-changes.outputs.code_changed == 'true'
|
if: needs.detect-changes.outputs.code_changed == 'true' && needs.detect-changes.outputs.version_exists != 'true'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Prüft, ob die aktuelle Crate-Version bereits in der Gitea Cargo-Registry existiert.
|
||||||
|
|
||||||
|
Liest Name und Version aus Cargo.toml und fragt die Gitea Package-API ab.
|
||||||
|
Das Ergebnis wird als Step-Output "exists" (true/false) in GITHUB_OUTPUT
|
||||||
|
geschrieben, damit der Release/Publish-Job komplett übersprungen werden kann,
|
||||||
|
statt erst nach Build & Tests an einem "Version existiert bereits"-Fehler der
|
||||||
|
Registry zu scheitern.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import urllib.error
|
||||||
|
import urllib.request
|
||||||
|
|
||||||
|
|
||||||
|
def read_cargo_field(field, path="Cargo.toml"):
|
||||||
|
pattern = re.compile(rf'^{field}\s*=\s*"(.*)"')
|
||||||
|
with open(path) as f:
|
||||||
|
for line in f:
|
||||||
|
match = pattern.match(line.strip())
|
||||||
|
if match:
|
||||||
|
return match.group(1)
|
||||||
|
raise SystemExit(f"Feld '{field}' nicht in {path} gefunden.")
|
||||||
|
|
||||||
|
|
||||||
|
def version_exists(gitea_url, owner, name, version, token):
|
||||||
|
url = f"{gitea_url}/api/v1/packages/{owner}/cargo/{name}/{version}"
|
||||||
|
req = urllib.request.Request(url, method="GET")
|
||||||
|
req.add_header("Authorization", f"token {token}")
|
||||||
|
try:
|
||||||
|
with urllib.request.urlopen(req, timeout=10) as resp:
|
||||||
|
return resp.status == 200
|
||||||
|
except urllib.error.HTTPError as e:
|
||||||
|
if e.code == 404:
|
||||||
|
return False
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
gitea_url = os.environ["GITEA_URL"].strip().rstrip("/")
|
||||||
|
owner = os.environ["REPO_OWNER"].strip()
|
||||||
|
token = os.environ["TOKEN"].strip()
|
||||||
|
github_output = os.environ["GITHUB_OUTPUT"]
|
||||||
|
|
||||||
|
name = read_cargo_field("name")
|
||||||
|
version = read_cargo_field("version")
|
||||||
|
|
||||||
|
print(f"Prüfe {name}@{version} in der Gitea Cargo Registry...")
|
||||||
|
exists = version_exists(gitea_url, owner, name, version, token)
|
||||||
|
|
||||||
|
if exists:
|
||||||
|
print(f"Version {version} existiert bereits in der Registry. Release/Publish wird übersprungen.")
|
||||||
|
else:
|
||||||
|
print(f"Version {version} ist neu.")
|
||||||
|
|
||||||
|
with open(github_output, "a") as f:
|
||||||
|
f.write(f"exists={'true' if exists else 'false'}\n")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user