From 0abac8518c123f9d46a7dd5c4ee0c23d7371f3b3 Mon Sep 17 00:00:00 2001 From: haosicheng Date: Mon, 13 Oct 2025 12:38:54 +0800 Subject: [PATCH] =?UTF-8?q?[patch]=20=E4=BF=AE=E6=94=B9=E9=80=BB=E8=BE=91:?= =?UTF-8?q?=20=E5=9C=A8=E7=94=A8=E6=88=B7=E8=AF=AF=E8=A7=A6=E6=88=96?= =?UTF-8?q?=E5=BC=80=E4=BA=86=E5=A4=9A=E4=B8=AAGUI=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E4=B8=8D=E8=83=BD=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E5=BB=BA=E7=AB=8B=E5=A4=9A=E4=B8=AA=E8=BF=9E=E6=8E=A5=20?= =?UTF-8?q?=E7=A1=AE=E4=BF=9D=E4=B8=80=E4=B8=AA=E8=B4=A6=E5=8F=B7=E5=8F=AA?= =?UTF-8?q?=E8=83=BD=E5=BB=BA=E7=AB=8B=E4=B8=80=E4=B8=AA=E4=B8=8E=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E7=9A=84=E8=BF=9E=E6=8E=A5=20=E5=8F=8B=E5=A5=BD?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E7=9A=84=E9=9B=86=E6=88=90review=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9powershell=E8=AF=AD=E6=B3=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/scripts/upload_installer_to_ks3.py | 34 +++++++++++++++++++---- .gitea/workflows/gui-version-release.yml | 31 ++++++++++++++++++--- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/.gitea/scripts/upload_installer_to_ks3.py b/.gitea/scripts/upload_installer_to_ks3.py index 8aa0b59..1a6a8ce 100644 --- a/.gitea/scripts/upload_installer_to_ks3.py +++ b/.gitea/scripts/upload_installer_to_ks3.py @@ -40,7 +40,7 @@ def get_ks3_connection(): KS3_SECRET_KEY, host=KS3_ENDPOINT, is_secure=KS3_IS_SECURE, - timeout=300, + timeout=1800, # Increase timeout to 30 minutes for large files ) logger.info(f"KS3 connection established: {KS3_ENDPOINT}") return connection @@ -72,18 +72,34 @@ def find_latest_installer(): return latest_installer +def progress_callback(uploaded_bytes, total_bytes): + """Upload progress callback""" + if total_bytes > 0: + percentage = (uploaded_bytes / total_bytes) * 100 + uploaded_mb = uploaded_bytes / 1024 / 1024 + total_mb = total_bytes / 1024 / 1024 + logger.info(f"Upload progress: {percentage:.1f}% ({uploaded_mb:.1f}/{total_mb:.1f} MB)") + + def upload_installer(connection, installer_path): - """Upload installer to KS3""" + """Upload installer to KS3 with progress tracking""" try: bucket = connection.get_bucket(KS3_BUCKET) ks3_key = f"{KS3_PREFIX}{installer_path.name}" + file_size = installer_path.stat().st_size + file_size_mb = file_size / 1024 / 1024 + logger.info(f"Starting upload to KS3...") logger.info(f"Target path: {ks3_key}") + logger.info(f"File size: {file_size_mb:.2f} MB") + logger.info(f"Estimated time: ~{int(file_size_mb / 2)} seconds (assuming 2MB/s)") + logger.info("Please wait, this may take several minutes...") key = bucket.new_key(ks3_key) - # Upload file with public read permission (reference: bulk_upload_static_to_ks3.py) + # Upload file with public read permission and progress tracking + # Use cb parameter for progress callback (called every 5% or every 10MB) key.set_contents_from_filename( str(installer_path), headers={ @@ -93,7 +109,9 @@ def upload_installer(connection, installer_path): 'x-kss-storage-class': 'STANDARD', 'x-kss-acl': 'public-read' # Set public read permission in headers }, - policy='public-read' # Set ACL policy + policy='public-read', # Set ACL policy + cb=progress_callback, # Progress callback function + num_cb=10 # Call callback 10 times during upload (every 10%) ) # Generate download URL (using KS3 third-level domain format) @@ -101,12 +119,18 @@ def upload_installer(connection, installer_path): protocol = 'https' if KS3_IS_SECURE else 'http' download_url = f"{protocol}://{KS3_BUCKET}.{KS3_ENDPOINT}/{ks3_key}" - logger.info(f"Upload successful!") + logger.info("") + logger.info("=" * 70) + logger.info("Upload successful!") logger.info(f"Download URL: {download_url}") + logger.info("=" * 70) return download_url except Exception as e: + logger.error("") + logger.error("=" * 70) logger.error(f"Upload failed: {e}") + logger.error("=" * 70) import traceback logger.error(traceback.format_exc()) return None diff --git a/.gitea/workflows/gui-version-release.yml b/.gitea/workflows/gui-version-release.yml index fca7623..94be626 100644 --- a/.gitea/workflows/gui-version-release.yml +++ b/.gitea/workflows/gui-version-release.yml @@ -354,23 +354,46 @@ jobs: - name: Upload installer to KS3 if: success() shell: powershell + timeout-minutes: 30 run: | Write-Host "=========================================="; Write-Host "Step 4.8: Upload installer to KS3"; Write-Host "=========================================="; + Write-Host "NOTE: Large file upload may take 5-10 minutes"; + Write-Host ""; # Install KS3 SDK Write-Host "Installing KS3 SDK..."; python -m pip install ks3sdk --quiet; + if ($LASTEXITCODE -ne 0) { + Write-Host "ERROR: Failed to install ks3sdk"; + Write-Host "Skipping KS3 upload (version release continues)"; + exit 0; + } + + Write-Host "Starting upload process..."; + Write-Host "This may take several minutes, please be patient..."; + Write-Host ""; + + # Run upload script python .gitea/scripts/upload_installer_to_ks3.py; - if ($LASTEXITCODE -ne 0) { - Write-Host "KS3 upload failed, but version release continues"; - Write-Host " You can manually upload the installer later"; + if ($LASTEXITCODE -eq 0) { + Write-Host ""; + Write-Host "OK: Installer uploaded to KS3 successfully"; } else { - Write-Host "Installer uploaded to KS3 successfully"; + Write-Host ""; + Write-Host "WARNING: KS3 upload failed (exit code: $LASTEXITCODE)"; + Write-Host "NOTICE: Version release continues"; + Write-Host "NOTICE: You can manually upload the installer later"; + Write-Host ""; + Write-Host "Manual upload steps:"; + Write-Host " 1. Find installer in: installer/output/"; + Write-Host " 2. Upload to KS3 bucket: shuidrop-chat-server"; + Write-Host " 3. Target path: installers/"; } + Write-Host ""; # Step 5: Commit version changes