fix: charmap encoding (#5865)

* fix: handle charmap encoding error

* enhancement: prompt template for new user flow
This commit is contained in:
Nguyen Ngoc Minh 2025-07-22 09:33:12 -07:00 committed by GitHub
parent d347058d6b
commit 5cbd79b525
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 45 additions and 43 deletions

View File

@ -82,13 +82,13 @@ jobs:
# Find the exe file in the artifact # Find the exe file in the artifact
$exeFile = Get-ChildItem -Path "${{ runner.temp }}/windows-artifact" -Recurse -Filter "*.exe" | Select-Object -First 1 $exeFile = Get-ChildItem -Path "${{ runner.temp }}/windows-artifact" -Recurse -Filter "*.exe" | Select-Object -First 1
if ($exeFile) { if ($exeFile) {
Write-Host " Found local installer: $($exeFile.FullName)" Write-Host "[SUCCESS] Found local installer: $($exeFile.FullName)"
Copy-Item -Path $exeFile.FullName -Destination "$env:TEMP\jan-installer.exe" -Force Copy-Item -Path $exeFile.FullName -Destination "$env:TEMP\jan-installer.exe" -Force
Write-Host " Installer copied to: $env:TEMP\jan-installer.exe" Write-Host "[SUCCESS] Installer copied to: $env:TEMP\jan-installer.exe"
# Don't set JAN_APP_PATH here - let the install script set it to the correct installed app path # Don't set JAN_APP_PATH here - let the install script set it to the correct installed app path
echo "IS_NIGHTLY=${{ inputs.is_nightly }}" >> $env:GITHUB_ENV echo "IS_NIGHTLY=${{ inputs.is_nightly }}" >> $env:GITHUB_ENV
} else { } else {
Write-Error " No .exe file found in artifact" Write-Error "[FAILED] No .exe file found in artifact"
exit 1 exit 1
} }
} else { } else {
@ -196,9 +196,9 @@ jobs:
# Find the deb file in the artifact # Find the deb file in the artifact
DEB_FILE=$(find "${{ runner.temp }}/ubuntu-artifact" -name "*.deb" -type f | head -1) DEB_FILE=$(find "${{ runner.temp }}/ubuntu-artifact" -name "*.deb" -type f | head -1)
if [ -n "$DEB_FILE" ]; then if [ -n "$DEB_FILE" ]; then
echo " Found local installer: $DEB_FILE" echo "[SUCCESS] Found local installer: $DEB_FILE"
cp "$DEB_FILE" "/tmp/jan-installer.deb" cp "$DEB_FILE" "/tmp/jan-installer.deb"
echo " Installer copied to: /tmp/jan-installer.deb" echo "[SUCCESS] Installer copied to: /tmp/jan-installer.deb"
echo "JAN_APP_PATH=/tmp/jan-installer.deb" >> $GITHUB_ENV echo "JAN_APP_PATH=/tmp/jan-installer.deb" >> $GITHUB_ENV
echo "IS_NIGHTLY=${{ inputs.is_nightly }}" >> $GITHUB_ENV echo "IS_NIGHTLY=${{ inputs.is_nightly }}" >> $GITHUB_ENV
if [ "${{ inputs.is_nightly }}" = "true" ]; then if [ "${{ inputs.is_nightly }}" = "true" ]; then
@ -207,7 +207,7 @@ jobs:
echo "JAN_PROCESS_NAME=Jan" >> $GITHUB_ENV echo "JAN_PROCESS_NAME=Jan" >> $GITHUB_ENV
fi fi
else else
echo " No .deb file found in artifact" echo "[FAILED] No .deb file found in artifact"
exit 1 exit 1
fi fi
else else
@ -296,9 +296,9 @@ jobs:
# Find the dmg file in the artifact # Find the dmg file in the artifact
DMG_FILE=$(find "${{ runner.temp }}/macos-artifact" -name "*.dmg" -type f | head -1) DMG_FILE=$(find "${{ runner.temp }}/macos-artifact" -name "*.dmg" -type f | head -1)
if [ -n "$DMG_FILE" ]; then if [ -n "$DMG_FILE" ]; then
echo " Found local installer: $DMG_FILE" echo "[SUCCESS] Found local installer: $DMG_FILE"
cp "$DMG_FILE" "/tmp/jan-installer.dmg" cp "$DMG_FILE" "/tmp/jan-installer.dmg"
echo " Installer copied to: /tmp/jan-installer.dmg" echo "[SUCCESS] Installer copied to: /tmp/jan-installer.dmg"
echo "JAN_APP_PATH=/tmp/jan-installer.dmg" >> $GITHUB_ENV echo "JAN_APP_PATH=/tmp/jan-installer.dmg" >> $GITHUB_ENV
echo "IS_NIGHTLY=${{ inputs.is_nightly }}" >> $GITHUB_ENV echo "IS_NIGHTLY=${{ inputs.is_nightly }}" >> $GITHUB_ENV
if [ "${{ inputs.is_nightly }}" = "true" ]; then if [ "${{ inputs.is_nightly }}" = "true" ]; then
@ -307,7 +307,7 @@ jobs:
echo "PROCESS_NAME=Jan" >> $GITHUB_ENV echo "PROCESS_NAME=Jan" >> $GITHUB_ENV
fi fi
else else
echo " No .dmg file found in artifact" echo "[FAILED] No .dmg file found in artifact"
exit 1 exit 1
fi fi
else else
@ -349,7 +349,7 @@ jobs:
else else
echo "Homebrew not available, checking if tkinter works..." echo "Homebrew not available, checking if tkinter works..."
python3 -c "import tkinter" || { python3 -c "import tkinter" || {
echo "⚠️ tkinter not available and Homebrew not found" echo "[WARNING] tkinter not available and Homebrew not found"
echo "This may cause issues with mouse control" echo "This may cause issues with mouse control"
} }
fi fi
@ -362,7 +362,7 @@ jobs:
echo "Installing Python dependencies..." echo "Installing Python dependencies..."
pip install --upgrade pip pip install --upgrade pip
pip install -r requirements.txt pip install -r requirements.txt
echo " Python dependencies installed" echo "[SUCCESS] Python dependencies installed"
- name: Setup ReportPortal environment - name: Setup ReportPortal environment
run: | run: |

View File

@ -449,17 +449,17 @@ async def main():
# Update counters and log result # Update counters and log result
if test_passed: if test_passed:
test_results["passed"] += 1 test_results["passed"] += 1
logger.info(f" Test {i} PASSED: {test_data['path']}") logger.info(f"[SUCCESS] Test {i} PASSED: {test_data['path']}")
else: else:
test_results["failed"] += 1 test_results["failed"] += 1
logger.error(f" Test {i} FAILED: {test_data['path']}") logger.error(f"[FAILED] Test {i} FAILED: {test_data['path']}")
# Debug log for troubleshooting # Debug log for troubleshooting
logger.info(f"🔍 Debug - Test result: type={type(test_result)}, value={test_result}, success_field={test_result.get('success', 'N/A') if isinstance(test_result, dict) else 'N/A'}, final_passed={test_passed}") logger.info(f"[INFO] Debug - Test result: type={type(test_result)}, value={test_result}, success_field={test_result.get('success', 'N/A') if isinstance(test_result, dict) else 'N/A'}, final_passed={test_passed}")
except Exception as e: except Exception as e:
test_results["failed"] += 1 test_results["failed"] += 1
logger.error(f" Test {i} FAILED with exception: {test_data['path']} - {e}") logger.error(f"[FAILED] Test {i} FAILED with exception: {test_data['path']} - {e}")
# Add delay between tests # Add delay between tests
if i < len(test_files): if i < len(test_files):
@ -477,10 +477,10 @@ async def main():
logger.info("=" * 50) logger.info("=" * 50)
if test_results["failed"] > 0: if test_results["failed"] > 0:
logger.error(f" Test execution completed with {test_results['failed']} failures!") logger.error(f"[FAILED] Test execution completed with {test_results['failed']} failures!")
final_exit_code = 1 final_exit_code = 1
else: else:
logger.info(" All tests completed successfully!") logger.info("[SUCCESS] All tests completed successfully!")
final_exit_code = 0 final_exit_code = 0
except KeyboardInterrupt: except KeyboardInterrupt:

View File

@ -212,7 +212,7 @@ def upload_jan_logs(client, test_item_id, is_nightly=False, max_log_files=5):
client.log( client.log(
time=timestamp(), time=timestamp(),
level="WARNING", level="WARNING",
message=f"📝 No Jan {app_type} application logs found", message=f"[INFO] No Jan {app_type} application logs found",
item_id=test_item_id item_id=test_item_id
) )
return return
@ -236,7 +236,7 @@ def upload_jan_logs(client, test_item_id, is_nightly=False, max_log_files=5):
client.log( client.log(
time=timestamp(), time=timestamp(),
level="WARNING", level="WARNING",
message=f"📝 Log file {file_name} skipped (size: {file_size} bytes > 50MB limit)", message=f"[INFO] Log file {file_name} skipped (size: {file_size} bytes > 50MB limit)",
item_id=test_item_id item_id=test_item_id
) )
continue continue
@ -251,7 +251,7 @@ def upload_jan_logs(client, test_item_id, is_nightly=False, max_log_files=5):
client.log( client.log(
time=timestamp(), time=timestamp(),
level="INFO", level="INFO",
message=f"📝 Jan {app_type} application log: {file_name}", message=f"[INFO] Jan {app_type} application log: {file_name}",
item_id=test_item_id, item_id=test_item_id,
attachment={ attachment={
"name": f"jan_{app_type}_log_{i}_{file_name}", "name": f"jan_{app_type}_log_{i}_{file_name}",
@ -275,7 +275,7 @@ def upload_jan_logs(client, test_item_id, is_nightly=False, max_log_files=5):
client.log( client.log(
time=timestamp(), time=timestamp(),
level="INFO", level="INFO",
message=f"📝 Uploaded {len(log_files_to_upload)} Jan {app_type} log files (total available: {len(all_log_files)})", message=f"[INFO] Uploaded {len(log_files_to_upload)} Jan {app_type} log files (total available: {len(all_log_files)})",
item_id=test_item_id item_id=test_item_id
) )
@ -305,7 +305,7 @@ def upload_test_results_to_rp(client, launch_id, test_path, trajectory_dir, forc
client.log( client.log(
time=timestamp(), time=timestamp(),
level="ERROR", level="ERROR",
message="❌ TEST FAILED ❌\nNo trajectory directory found", message="[FAILED] TEST FAILED [FAILED]\nNo trajectory directory found",
item_id=test_item_id item_id=test_item_id
) )
@ -364,7 +364,7 @@ def upload_test_results_to_rp(client, launch_id, test_path, trajectory_dir, forc
if os.path.isdir(os.path.join(trajectory_dir, f)) and f.startswith("turn_")] if os.path.isdir(os.path.join(trajectory_dir, f)) and f.startswith("turn_")]
# Add clear status log # Add clear status log
status_emoji = "" if final_status == "PASSED" else "" status_emoji = "[SUCCESS]" if final_status == "PASSED" else "[FAILED]"
client.log( client.log(
time=timestamp(), time=timestamp(),
level="INFO" if final_status == "PASSED" else "ERROR", level="INFO" if final_status == "PASSED" else "ERROR",
@ -383,7 +383,7 @@ def upload_test_results_to_rp(client, launch_id, test_path, trajectory_dir, forc
client.log( client.log(
time=timestamp(), time=timestamp(),
level="INFO", level="INFO",
message="🎥 Screen recording of test execution", message="[INFO] Screen recording of test execution",
item_id=test_item_id, item_id=test_item_id,
attachment={ attachment={
"name": f"test_recording_{formatted_test_path}.mp4", "name": f"test_recording_{formatted_test_path}.mp4",

View File

@ -41,9 +41,9 @@ echo "Downloading Jan app from: $JAN_APP_URL"
curl -L -o "/tmp/jan-installer.dmg" "$JAN_APP_URL" curl -L -o "/tmp/jan-installer.dmg" "$JAN_APP_URL"
if [ ! -f "/tmp/jan-installer.dmg" ]; then if [ ! -f "/tmp/jan-installer.dmg" ]; then
echo " Failed to download Jan app" echo "[FAILED] Failed to download Jan app"
exit 1 exit 1
fi fi
echo " Successfully downloaded Jan app" echo "[SUCCESS] Successfully downloaded Jan app"
ls -la "/tmp/jan-installer.dmg" ls -la "/tmp/jan-installer.dmg"

View File

@ -10,7 +10,7 @@ hdiutil attach "/tmp/jan-installer.dmg" -mountpoint "/tmp/jan-mount"
APP_FILE=$(find "/tmp/jan-mount" -name "*.app" -type d | head -1) APP_FILE=$(find "/tmp/jan-mount" -name "*.app" -type d | head -1)
if [ -z "$APP_FILE" ]; then if [ -z "$APP_FILE" ]; then
echo " No .app file found in DMG" echo "[Failed] No .app file found in DMG"
hdiutil detach "/tmp/jan-mount" || true hdiutil detach "/tmp/jan-mount" || true
exit 1 exit 1
fi fi
@ -61,7 +61,7 @@ if [ -z "$APP_PATH" ]; then
fi fi
if [ -z "$APP_PATH" ]; then if [ -z "$APP_PATH" ]; then
echo " No executable found in MacOS folder" echo "[FAILED] No executable found in MacOS folder"
ls -la "/Applications/$APP_NAME/Contents/MacOS/" ls -la "/Applications/$APP_NAME/Contents/MacOS/"
exit 1 exit 1
fi fi
@ -76,16 +76,16 @@ echo "Process name: $PROCESS_NAME"
echo "JAN_APP_PATH=$APP_PATH" >> $GITHUB_ENV echo "JAN_APP_PATH=$APP_PATH" >> $GITHUB_ENV
echo "PROCESS_NAME=$PROCESS_NAME" >> $GITHUB_ENV echo "PROCESS_NAME=$PROCESS_NAME" >> $GITHUB_ENV
echo " Waiting for Jan app first initialization (120 seconds)..." echo "[INFO] Waiting for Jan app first initialization (120 seconds)..."
echo "This allows Jan to complete its initial setup and configuration" echo "This allows Jan to complete its initial setup and configuration"
sleep 120 sleep 120
echo " Initialization wait completed" echo "[SUCCESS] Initialization wait completed"
# Verify installation # Verify installation
if [ -f "$APP_PATH" ]; then if [ -f "$APP_PATH" ]; then
echo " Jan app installed successfully" echo "[SUCCESS] Jan app installed successfully"
ls -la "/Applications/$APP_NAME" ls -la "/Applications/$APP_NAME"
else else
echo " Jan app installation failed - executable not found" echo "[FAILED] Jan app installation failed - executable not found"
exit 1 exit 1
fi fi

View File

@ -9,7 +9,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Make all shell scripts executable # Make all shell scripts executable
chmod +x "$SCRIPT_DIR"/*.sh chmod +x "$SCRIPT_DIR"/*.sh
echo " All shell scripts are now executable:" echo "[SUCCESS] All shell scripts are now executable:"
ls -la "$SCRIPT_DIR"/*.sh ls -la "$SCRIPT_DIR"/*.sh
echo " Permission setup completed" echo "[SUCCESS] Permission setup completed"

View File

@ -15,10 +15,10 @@ sudo apt-get install -f -y
# Wait for installation to complete # Wait for installation to complete
sleep 10 sleep 10
echo " Waiting for Jan app first initialization (120 seconds)..." echo "[INFO] Waiting for Jan app first initialization (120 seconds)..."
echo "This allows Jan to complete its initial setup and configuration" echo "This allows Jan to complete its initial setup and configuration"
sleep 120 sleep 120
echo " Initialization wait completed" echo "[SUCCESS] Initialization wait completed"
# Verify installation based on nightly flag # Verify installation based on nightly flag
if [ "$IS_NIGHTLY" = "true" ]; then if [ "$IS_NIGHTLY" = "true" ]; then

View File

@ -24,10 +24,10 @@ catch {
# Wait a bit for installation to complete # Wait a bit for installation to complete
Start-Sleep -Seconds 10 Start-Sleep -Seconds 10
Write-Host " Waiting for Jan app first initialization (120 seconds)..." Write-Host "[INFO] Waiting for Jan app first initialization (120 seconds)..."
Write-Host "This allows Jan to complete its initial setup and configuration" Write-Host "This allows Jan to complete its initial setup and configuration"
Start-Sleep -Seconds 120 Start-Sleep -Seconds 120
Write-Host " Initialization wait completed" Write-Host "[SUCCESS] Initialization wait completed"
# Verify installation based on nightly flag # Verify installation based on nightly flag
if ($isNightly) { if ($isNightly) {

View File

@ -238,7 +238,7 @@ async def run_single_test_with_timeout(computer, test_data, rp_client, launch_id
rp_client.log( rp_client.log(
time=timestamp(), time=timestamp(),
level="INFO", level="INFO",
message="🎥 Screen recording of failed test", message="[INFO] Screen recording of failed test",
item_id=test_item_id, item_id=test_item_id,
attachment={ attachment={
"name": f"failed_test_recording_{formatted_test_path}.mp4", "name": f"failed_test_recording_{formatted_test_path}.mp4",
@ -298,9 +298,9 @@ async def run_single_test_with_timeout(computer, test_data, rp_client, launch_id
if not enable_reportportal: if not enable_reportportal:
# Local development mode - log results # Local development mode - log results
logger.info(f"🏠 LOCAL RESULT: {path} - {final_status} ({status_message})") logger.info(f"[INFO] LOCAL RESULT: {path} - {final_status} ({status_message})")
logger.info(f"📹 Video saved: {video_path}") logger.info(f"[INFO] Video saved: {video_path}")
logger.info(f"📁 Trajectory: {trajectory_dir}") logger.info(f"[INFO] Trajectory: {trajectory_dir}")
else: else:
final_status = "FAILED" final_status = "FAILED"
status_message = "no trajectory found" status_message = "no trajectory found"
@ -312,7 +312,7 @@ async def run_single_test_with_timeout(computer, test_data, rp_client, launch_id
}) })
if not enable_reportportal: if not enable_reportportal:
logger.warning(f"🏠 LOCAL RESULT: {path} - {final_status} ({status_message})") logger.warning(f"[INFO] LOCAL RESULT: {path} - {final_status} ({status_message})")
# Step 9: Always force close Jan app after test completion # Step 9: Always force close Jan app after test completion
logger.info(f"Cleaning up after test: {path}") logger.info(f"Cleaning up after test: {path}")

View File

@ -12,4 +12,6 @@ Step-by-step instructions:
8. Wait for the models response. 8. Wait for the models response.
If the model responds correctly, return: {"result": True}, otherwise return: {"result": False}. If the model responds correctly, return: {"result": True}, otherwise return: {"result": False}.
In all your responses, use only plain ASCII characters. Do NOT use Unicode symbols
""" """