Use Python release publisher to bypass Node 16 Headers reference error in runner
Release Binaries / release (push) Successful in 3m3s

This commit is contained in:
2026-09-03 22:02:08 +02:00
parent ce0a1a0b46
commit e634b060df
2 changed files with 46 additions and 15 deletions
+7 -6
View File
@@ -27,9 +27,10 @@ jobs:
python3 package_dist.py python3 package_dist.py
- name: Publish Release - name: Publish Release
uses: https://gitea.com/actions/gitea-release-action@v1 env:
with: GITEA_TOKEN: ${{ secrets.TAG_TOKEN || github.token }}
files: | GITEA_SERVER_URL: ${{ github.server_url }}
dist/* GITEA_REPOSITORY: ${{ github.repository }}
api_key: ${{ secrets.TAG_TOKEN || github.token }} GITEA_REF_NAME: ${{ github.ref_name }}
token: ${{ secrets.TAG_TOKEN || github.token }} run: |
python3 upload_release.py --skip-build
+39 -9
View File
@@ -7,13 +7,38 @@ import urllib.parse
import mimetypes import mimetypes
import package_dist import package_dist
DEFAULT_GITEA_URL = "https://gitea.eibl.tech" DEFAULT_GITEA_URL = os.environ.get("GITEA_SERVER_URL", "https://gitea.eibl.tech")
DEFAULT_REPO = "me0nline/LOGAR" DEFAULT_REPO = os.environ.get("GITEA_REPOSITORY", "me0nline/LOGAR")
def get_existing_assets(base_url, repo, release_id, token):
url = f"{base_url}/api/v1/repos/{repo}/releases/{release_id}/assets"
req = urllib.request.Request(url, headers={"Authorization": f"token {token}", "Accept": "application/json"})
try:
with urllib.request.urlopen(req) as resp:
return json.loads(resp.read().decode("utf-8"))
except Exception:
return []
def delete_asset(base_url, repo, release_id, asset_id, token):
url = f"{base_url}/api/v1/repos/{repo}/releases/{release_id}/assets/{asset_id}"
req = urllib.request.Request(url, method="DELETE", headers={"Authorization": f"token {token}"})
try:
with urllib.request.urlopen(req) as resp:
pass
except Exception:
pass
def upload_file_to_release(base_url, repo, release_id, token, file_path): def upload_file_to_release(base_url, repo, release_id, token, file_path):
filename = os.path.basename(file_path) filename = os.path.basename(file_path)
url = f"{base_url}/api/v1/repos/{repo}/releases/{release_id}/assets?name={urllib.parse.quote(filename)}"
# Clean up existing asset with same name if already present
existing_assets = get_existing_assets(base_url, repo, release_id, token)
for asset in existing_assets:
if asset.get("name") == filename:
print(f"[*] Removing existing asset '{filename}' (ID: {asset['id']})...")
delete_asset(base_url, repo, release_id, asset["id"], token)
url = f"{base_url}/api/v1/repos/{repo}/releases/{release_id}/assets?name={urllib.parse.quote(filename)}"
with open(file_path, "rb") as f: with open(file_path, "rb") as f:
file_bytes = f.read() file_bytes = f.read()
@@ -67,18 +92,23 @@ def create_or_get_release(base_url, repo, tag, token, title=None, notes=None):
def main(): def main():
parser = argparse.ArgumentParser(description="Upload LOGAR compiled binaries directly to Gitea Release") parser = argparse.ArgumentParser(description="Upload LOGAR compiled binaries directly to Gitea Release")
parser.add_argument("--tag", required=True, help="Release tag name (e.g. v1.0.0)") parser.add_argument("--tag", default=os.environ.get("GITEA_REF_NAME"), help="Release tag name (e.g. v1.0.0)")
parser.add_argument("--token", default=os.environ.get("GITEA_TOKEN"), help="Gitea Personal Access Token (or set GITEA_TOKEN env var)") parser.add_argument("--token", default=os.environ.get("GITEA_TOKEN"), help="Gitea Personal Access Token (or set GITEA_TOKEN env var)")
parser.add_argument("--url", default=DEFAULT_GITEA_URL, help="Base Gitea instance URL") parser.add_argument("--url", default=DEFAULT_GITEA_URL, help="Base Gitea instance URL")
parser.add_argument("--repo", default=DEFAULT_REPO, help="Repository owner/name") parser.add_argument("--repo", default=DEFAULT_REPO, help="Repository owner/name")
parser.add_argument("--skip-build", action="store_true", help="Skip running package_dist.py before upload") parser.add_argument("--skip-build", action="store_true", help="Skip running package_dist.py before upload")
args = parser.parse_args() args = parser.parse_args()
tag = args.tag
if not tag:
tag = input("Enter tag name (e.g. v1.0.0): ").strip()
token = args.token token = args.token
if not token: if not token:
token = input("Enter Gitea Personal Access Token: ").strip() token = input("Enter Gitea Token: ").strip()
if not token:
print("[!] Token is required.") if not tag or not token:
print("[!] Tag and Token are required.")
sys.exit(1) sys.exit(1)
if not args.skip_build: if not args.skip_build:
@@ -91,7 +121,7 @@ def main():
sys.exit(1) sys.exit(1)
print(f"[*] Connecting to Gitea: {args.url} (repo: {args.repo})...") print(f"[*] Connecting to Gitea: {args.url} (repo: {args.repo})...")
release_id = create_or_get_release(args.url, args.repo, args.tag, token) release_id = create_or_get_release(args.url, args.repo, tag, token)
print(f"[*] Uploading binary assets from '{dist_dir}'...") print(f"[*] Uploading binary assets from '{dist_dir}'...")
for f in sorted(os.listdir(dist_dir)): for f in sorted(os.listdir(dist_dir)):
@@ -99,7 +129,7 @@ def main():
if os.path.isfile(fpath): if os.path.isfile(fpath):
upload_file_to_release(args.url, args.repo, release_id, token, fpath) upload_file_to_release(args.url, args.repo, release_id, token, fpath)
print(f"\n[+] Release successfully published with binary assets: {args.url}/{args.repo}/releases/tag/{args.tag}") print(f"\n[+] Release successfully published with binary assets: {args.url}/{args.repo}/releases/tag/{tag}")
if __name__ == "__main__": if __name__ == "__main__":
main() main()