Feat: Überspringt Release/Publish bei bereits veröffentlichter Version
Security Scans / Trivy & OSV-Scanner (push) Successful in 52s
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Skipped
TruffleHog Secret Scan / TruffleHog (push) Successful in 26s
Code Quality (Auto-Format & Clippy-Fix) / Formatierung & Clippy automatisch beheben (push) Successful in 52s
Security Scans / Trivy & OSV-Scanner (push) Successful in 52s
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Skipped
TruffleHog Secret Scan / TruffleHog (push) Successful in 26s
Code Quality (Auto-Format & Clippy-Fix) / Formatierung & Clippy automatisch beheben (push) Successful in 52s
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
|
||||
outputs:
|
||||
code_changed: ${{ steps.filter.outputs.code }}
|
||||
version_exists: ${{ steps.check-version.outputs.exists }}
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v7
|
||||
@@ -28,10 +29,20 @@ jobs:
|
||||
- '.cargo/**'
|
||||
- '.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:
|
||||
name: Build, Publish Crate to Gitea Registry & Create Release
|
||||
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
|
||||
steps:
|
||||
- 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