summaryrefslogtreecommitdiff
path: root/.github/workflows/qatest.yaml
diff options
context:
space:
mode:
Diffstat (limited to '.github/workflows/qatest.yaml')
-rw-r--r--.github/workflows/qatest.yaml610
1 files changed, 0 insertions, 610 deletions
diff --git a/.github/workflows/qatest.yaml b/.github/workflows/qatest.yaml
deleted file mode 100644
index b6883d88d4..0000000000
--- a/.github/workflows/qatest.yaml
+++ /dev/null
@@ -1,610 +0,0 @@
-name: Run QA Test # Runs automated tests on self-hosted QA machines
-
-permissions:
- contents: read
-
-on:
- workflow_run:
- workflows: ["Build"]
- types:
- - completed
- workflow_dispatch:
- inputs:
- build_id:
- description: 'Build workflow run ID (e.g. For github.com/secondlife/viewer/actions/runs/1234567890 the ID is 1234567890)'
- required: true
- default: '14806728332'
-
-jobs:
- debug-workflow:
- runs-on: ubuntu-latest
- steps:
- - name: Debug Workflow Variables
- run: |
- echo "Workflow Conclusion: ${{ github.event.workflow_run.conclusion }}"
- echo "Workflow Head Branch: ${{ github.event.workflow_run.head_branch }}"
- echo "Workflow Run ID: ${{ github.event.workflow_run.id }}"
- echo "Head Commit Message: ${{ github.event.workflow_run.head_commit.message }}"
- echo "GitHub Ref: ${{ github.ref }}"
- echo "GitHub Ref Name: ${{ github.ref_name }}"
- echo "GitHub Event Name: ${{ github.event_name }}"
- echo "GitHub Workflow Name: ${{ github.workflow }}"
-
- install-viewer-and-run-tests:
- concurrency:
- group: ${{ github.workflow }}-${{ matrix.runner }}
- cancel-in-progress: false # Prevents cancellation of in-progress jobs
-
- strategy:
- matrix:
- include:
- - os: windows
- runner: qa-windows-atlas
- artifact: Windows-installer
- install-path: 'C:\viewer-automation-main'
- - os: windows
- runner: qa-windows-asus-dan
- artifact: Windows-installer
- install-path: 'C:\viewer-automation-main'
- - os: windows
- runner: qa-windows-kurt
- artifact: Windows-installer
- install-path: 'C:\viewer-automation-main'
- - os: mac
- runner: qa-mac-dan
- artifact: macOS-installer
- install-path: '$HOME/Documents/viewer-automation'
- - os: mac
- runner: qa-mac-atlas
- artifact: macOS-installer
- install-path: '$HOME/Documents/viewer-automation'
- - os: mac
- runner: qa-mac-caleb
- artifact: macOS-installer
- install-path: '$HOME/Documents/viewer-automation'
- fail-fast: false
-
- runs-on: [self-hosted, "${{ matrix.runner }}"]
- # Run test only on successful builds of Second_Life_X branches or on manual dispatch
- if: >
- (github.event_name == 'workflow_run' &&
- github.event.workflow_run.conclusion == 'success' &&
- startsWith(github.event.workflow_run.head_branch, 'Second_Life')) ||
- github.event_name == 'workflow_dispatch'
-
- steps:
- # Windows-specific steps
- - name: Set Build ID
- if: matrix.os == 'windows'
- shell: pwsh
- run: |
- if ("${{ github.event_name }}" -eq "workflow_dispatch") {
- echo "BUILD_ID=${{ github.event.inputs.build_id }}" | Out-File -FilePath $env:GITHUB_ENV -Append
- echo "ARTIFACTS_URL=https://api.github.com/repos/secondlife/viewer/actions/runs/${{ github.event.inputs.build_id }}/artifacts" | Out-File -FilePath $env:GITHUB_ENV -Append
- } else {
- echo "BUILD_ID=${{ github.event.workflow_run.id }}" | Out-File -FilePath $env:GITHUB_ENV -Append
- echo "ARTIFACTS_URL=https://api.github.com/repos/secondlife/viewer/actions/runs/${{ github.event.workflow_run.id }}/artifacts" | Out-File -FilePath $env:GITHUB_ENV -Append
- }
-
- - name: Temporarily Allow PowerShell Scripts (Windows)
- if: matrix.os == 'windows'
- shell: pwsh
- run: |
- Set-ExecutionPolicy RemoteSigned -Scope Process -Force
-
- - name: Verify viewer-automation-main Exists (Windows)
- if: matrix.os == 'windows'
- shell: pwsh
- run: |
- if (-Not (Test-Path -Path '${{ matrix.install-path }}')) {
- Write-Host '❌ Error: viewer-automation folder not found on runner!'
- exit 1
- }
- Write-Host '✅ viewer-automation folder is provided.'
-
- - name: Verify viewer-automation-main is Up-To-Date (Windows)
- if: matrix.os == 'windows'
- shell: pwsh
- continue-on-error: true
- run: |
- cd ${{ matrix.install-path }}
- Write-Host "Checking for repository updates..."
-
- # Check if .git directory exists
- if (Test-Path -Path ".git") {
- try {
- # Save local changes instead of discarding them
- git stash push -m "Automated stash before update $(Get-Date)"
- Write-Host "Local changes saved (if any)"
-
- # Update the repository
- git pull
- Write-Host "✅ Repository updated successfully"
-
- # Try to restore local changes if any were stashed
- $stashList = git stash list
- if ($stashList -match "Automated stash before update") {
- try {
- git stash pop
- Write-Host "✅ Local changes restored successfully"
- } catch {
- Write-Host "⚠️ Conflict when restoring local changes"
- # Save the conflicted state in a new branch for later review
- $branchName = "conflict-recovery-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
- git checkout -b $branchName
- Write-Host "✅ Created branch '$branchName' with conflicted state"
-
- # For test execution, revert to a clean state
- git reset --hard HEAD
- Write-Host "✅ Reset to clean state for test execution"
- }
- }
- } catch {
- Write-Host "⚠️ Could not update repository: $_"
- Write-Host "Continuing with existing files..."
- }
- } else {
- Write-Host "⚠️ Not a Git repository, using existing files"
- }
-
- - name: Verify Python Installation (Windows)
- if: matrix.os == 'windows'
- shell: pwsh
- run: |
- try {
- $pythonVersion = (python --version)
- Write-Host "✅ Python found: $pythonVersion"
- } catch {
- Write-Host "❌ Error: Python not found in PATH. Please install Python on this runner."
- exit 1
- }
-
- - name: Setup Python Virtual Environment (Windows)
- if: matrix.os == 'windows'
- shell: pwsh
- run: |
- Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
- cd ${{ matrix.install-path }}
-
- if (-Not (Test-Path -Path ".venv")) {
- Write-Host "Creating virtual environment..."
- python -m venv .venv
- } else {
- Write-Host "Using existing virtual environment"
- }
-
- # Direct environment activation to avoid script execution issues
- $env:VIRTUAL_ENV = "$PWD\.venv"
- $env:PATH = "$env:VIRTUAL_ENV\Scripts;$env:PATH"
-
- # Install dependencies
- if (Test-Path -Path "requirements.txt") {
- Write-Host "Installing dependencies from requirements.txt..."
- pip install -r requirements.txt
-
- # Install Playwright browsers - add this line
- Write-Host "Installing Playwright browsers..."
- python -m playwright install
- } else {
- pip install outleap requests behave playwright
- # Install Playwright browsers - add this line
- Write-Host "Installing Playwright browsers..."
- python -m playwright install
- }
-
- - name: Fetch & Download Installer Artifact (Windows)
- if: matrix.os == 'windows'
- shell: pwsh
- run: |
- $BUILD_ID = "${{ env.BUILD_ID }}"
- $ARTIFACTS_URL = "${{ env.ARTIFACTS_URL }}"
-
- # Fetch the correct artifact URL
- $response = Invoke-RestMethod -Headers @{Authorization="token ${{ secrets.GITHUB_TOKEN }}" } -Uri $ARTIFACTS_URL
- $ARTIFACT_NAME = ($response.artifacts | Where-Object { $_.name -eq "${{ matrix.artifact }}" }).archive_download_url
-
- if (-Not $ARTIFACT_NAME) {
- Write-Host "❌ Error: ${{ matrix.artifact }} artifact not found!"
- exit 1
- }
-
- Write-Host "✅ Artifact found: $ARTIFACT_NAME"
-
- # Secure download path
- $DownloadPath = "$env:TEMP\secondlife-build-$BUILD_ID"
- New-Item -ItemType Directory -Path $DownloadPath -Force | Out-Null
- $InstallerPath = "$DownloadPath\installer.zip"
-
- # Download the ZIP
- Invoke-WebRequest -Uri $ARTIFACT_NAME -Headers @{Authorization="token ${{ secrets.GITHUB_TOKEN }}"} -OutFile $InstallerPath
-
- # Ensure download succeeded
- if (-Not (Test-Path $InstallerPath)) {
- Write-Host "❌ Error: Failed to download ${{ matrix.artifact }}.zip"
- exit 1
- }
-
- # Set the path for other steps
- echo "DOWNLOAD_PATH=$DownloadPath" | Out-File -FilePath $env:GITHUB_ENV -Append
-
- - name: Extract Installer & Locate Executable (Windows)
- if: matrix.os == 'windows'
- shell: pwsh
- run: |
- $BUILD_ID = "${{ env.BUILD_ID }}"
- $ExtractPath = "${{ env.DOWNLOAD_PATH }}"
- $InstallerZip = "$ExtractPath\installer.zip"
-
- # Print paths for debugging
- Write-Host "Extract Path: $ExtractPath"
- Write-Host "Installer ZIP Path: $InstallerZip"
-
- # Verify ZIP exists before extracting
- if (-Not (Test-Path $InstallerZip)) {
- Write-Host "❌ Error: ZIP file not found at $InstallerZip!"
- exit 1
- }
-
- Write-Host "✅ ZIP file exists and is valid. Extracting..."
-
- Expand-Archive -Path $InstallerZip -DestinationPath $ExtractPath -Force
-
- # Find installer executable
- $INSTALLER_PATH = (Get-ChildItem -Path $ExtractPath -Filter '*.exe' -Recurse | Select-Object -First 1).FullName
-
- if (-Not $INSTALLER_PATH -or $INSTALLER_PATH -eq "") {
- Write-Host "❌ Error: No installer executable found in the extracted files!"
- Write-Host "📂 Extracted Files:"
- Get-ChildItem -Path $ExtractPath -Recurse | Format-Table -AutoSize
- exit 1
- }
-
- Write-Host "✅ Installer found: $INSTALLER_PATH"
- echo "INSTALLER_PATH=$INSTALLER_PATH" | Out-File -FilePath $env:GITHUB_ENV -Append
-
- - name: Install Second Life (Windows)
- if: matrix.os == 'windows'
- shell: pwsh
- run: |
- # Windows - Use Task Scheduler to bypass UAC
- $action = New-ScheduledTaskAction -Execute "${{ env.INSTALLER_PATH }}" -Argument "/S"
- $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
- $task = New-ScheduledTask -Action $action -Principal $principal
- Register-ScheduledTask -TaskName "SilentSLInstaller" -InputObject $task -Force
- Start-ScheduledTask -TaskName "SilentSLInstaller"
-
- - name: Wait for Installation to Complete (Windows)
- if: matrix.os == 'windows'
- shell: pwsh
- run: |
- Write-Host "Waiting for the Second Life installer to finish..."
- do {
- Start-Sleep -Seconds 5
- $installerProcess = Get-Process | Where-Object { $_.Path -eq "${{ env.INSTALLER_PATH }}" }
- } while ($installerProcess)
-
- Write-Host "✅ Installation completed!"
-
- - name: Cleanup After Installation (Windows)
- if: matrix.os == 'windows'
- shell: pwsh
- run: |
- # Cleanup Task Scheduler Entry
- Unregister-ScheduledTask -TaskName "SilentSLInstaller" -Confirm:$false
- Write-Host "✅ Task Scheduler entry removed."
-
- # Delete Installer ZIP
- $DeletePath = "${{ env.DOWNLOAD_PATH }}\installer.zip"
-
- Write-Host "Checking if installer ZIP exists: $DeletePath"
-
- # Ensure the ZIP file exists before trying to delete it
- if (Test-Path $DeletePath) {
- Remove-Item -Path $DeletePath -Force
- Write-Host "✅ Successfully deleted: $DeletePath"
- } else {
- Write-Host "⚠️ Warning: ZIP file does not exist, skipping deletion."
- }
-
- - name: Run QA Test Script (Windows)
- if: matrix.os == 'windows'
- shell: pwsh
- run: |
- Write-Host "Running QA Test script on Windows runner: ${{ matrix.runner }}..."
- cd ${{ matrix.install-path }}
-
- # Activate virtual environment
- Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
- $env:VIRTUAL_ENV = "$PWD\.venv"
- $env:PATH = "$env:VIRTUAL_ENV\Scripts;$env:PATH"
-
- # Set runner name as environment variable
- $env:RUNNER_NAME = "${{ matrix.runner }}"
-
- # Run the test script
- python runTests.py
-
- # Mac-specific steps
- - name: Set Build ID (Mac)
- if: matrix.os == 'mac'
- shell: bash
- run: |
- if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
- echo "BUILD_ID=${{ github.event.inputs.build_id }}" >> $GITHUB_ENV
- echo "ARTIFACTS_URL=https://api.github.com/repos/secondlife/viewer/actions/runs/${{ github.event.inputs.build_id }}/artifacts" >> $GITHUB_ENV
- else
- echo "BUILD_ID=${{ github.event.workflow_run.id }}" >> $GITHUB_ENV
- echo "ARTIFACTS_URL=https://api.github.com/repos/secondlife/viewer/actions/runs/${{ github.event.workflow_run.id }}/artifacts" >> $GITHUB_ENV
- fi
-
- - name: Verify viewer-automation-main Exists (Mac)
- if: matrix.os == 'mac'
- shell: bash
- run: |
- if [ ! -d "${{ matrix.install-path }}" ]; then
- echo "❌ Error: viewer-automation folder not found on runner!"
- exit 1
- fi
- echo "✅ viewer-automation is provided."
-
- - name: Verify viewer-automation-main is Up-To-Date (Mac)
- if: matrix.os == 'mac'
- shell: bash
- continue-on-error: true
- run: |
- cd ${{ matrix.install-path }}
- echo "Checking for repository updates..."
-
- # Check if .git directory exists
- if [ -d ".git" ]; then
- # Save local changes instead of discarding them
- git stash push -m "Automated stash before update $(date)"
- echo "Local changes saved (if any)"
-
- # Update the repository
- git pull || echo "⚠️ Could not update repository"
- echo "✅ Repository updated (or attempted update)"
-
- # Try to restore local changes if any were stashed
- if git stash list | grep -q "Automated stash before update"; then
- # Try to pop the stash, but be prepared for conflicts
- if ! git stash pop; then
- echo "⚠️ Conflict when restoring local changes"
- # Save the conflicted state in a new branch for later review
- branch_name="conflict-recovery-$(date +%Y%m%d-%H%M%S)"
- git checkout -b "$branch_name"
- echo "✅ Created branch '$branch_name' with conflicted state"
-
- # For test execution, revert to a clean state
- git reset --hard HEAD
- echo "✅ Reset to clean state for test execution"
- else
- echo "✅ Local changes restored successfully"
- fi
- fi
- else
- echo "⚠️ Not a Git repository, using existing files"
- fi
-
- - name: Verify Python Installation (Mac)
- if: matrix.os == 'mac'
- shell: bash
- run: |
- if command -v python3 &> /dev/null; then
- PYTHON_VERSION=$(python3 --version)
- echo "✅ Python found: $PYTHON_VERSION"
- else
- echo "❌ Error: Python3 not found in PATH. Please install Python on this runner."
- exit 1
- fi
-
- - name: Setup Python Virtual Environment (Mac)
- if: matrix.os == 'mac'
- shell: bash
- run: |
- cd ${{ matrix.install-path }}
-
- # Create virtual environment if it doesn't exist
- if [ ! -d ".venv" ]; then
- echo "Creating virtual environment..."
- python3 -m venv .venv
- else
- echo "Using existing virtual environment"
- fi
-
- # Activate virtual environment
- source .venv/bin/activate
-
- # Install dependencies
- if [ -f "requirements.txt" ]; then
- pip install -r requirements.txt
- echo "✅ Installed dependencies from requirements.txt"
-
- # Install Playwright browsers - add this line
- echo "Installing Playwright browsers..."
- python -m playwright install
- else
- pip install outleap requests behave playwright
- echo "⚠️ requirements.txt not found, installed basic dependencies"
-
- # Install Playwright browsers - add this line
- echo "Installing Playwright browsers..."
- python -m playwright install
- fi
-
- - name: Fetch & Download Installer Artifact (Mac)
- if: matrix.os == 'mac'
- shell: bash
- run: |
- # Mac-specific Bash commands
- response=$(curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -s ${{ env.ARTIFACTS_URL }})
- ARTIFACT_NAME=$(echo $response | jq -r '.artifacts[] | select(.name=="${{ matrix.artifact }}") | .archive_download_url')
-
- if [ -z "$ARTIFACT_NAME" ]; then
- echo "❌ Error: ${{ matrix.artifact }} artifact not found!"
- exit 1
- fi
-
- echo "✅ Artifact found: $ARTIFACT_NAME"
-
- # Secure download path
- DOWNLOAD_PATH="/tmp/secondlife-build-${{ env.BUILD_ID }}"
- mkdir -p $DOWNLOAD_PATH
- INSTALLER_PATH="$DOWNLOAD_PATH/installer.zip"
-
- # Download the ZIP
- curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -L $ARTIFACT_NAME -o $INSTALLER_PATH
-
- # Ensure download succeeded
- if [ ! -f "$INSTALLER_PATH" ]; then
- echo "❌ Error: Failed to download ${{ matrix.artifact }}.zip"
- exit 1
- fi
-
- # Set the path for other steps
- echo "DOWNLOAD_PATH=$DOWNLOAD_PATH" >> $GITHUB_ENV
-
- - name: Extract Installer & Locate Executable (Mac)
- if: matrix.os == 'mac'
- shell: bash
- run: |
- EXTRACT_PATH="${{ env.DOWNLOAD_PATH }}"
- INSTALLER_ZIP="$EXTRACT_PATH/installer.zip"
-
- # Debug output
- echo "Extract Path: $EXTRACT_PATH"
- echo "Installer ZIP Path: $INSTALLER_ZIP"
-
- # Verify ZIP exists
- if [ ! -f "$INSTALLER_ZIP" ]; then
- echo "❌ Error: ZIP file not found at $INSTALLER_ZIP!"
- exit 1
- fi
-
- echo "✅ ZIP file exists and is valid. Extracting..."
-
- # Extract the ZIP
- unzip -o "$INSTALLER_ZIP" -d "$EXTRACT_PATH"
-
- # Find DMG file
- INSTALLER_PATH=$(find "$EXTRACT_PATH" -name "*.dmg" -type f | head -1)
-
- if [ -z "$INSTALLER_PATH" ]; then
- echo "❌ Error: No installer DMG found in the extracted files!"
- echo "📂 Extracted Files:"
- ls -la "$EXTRACT_PATH"
- exit 1
- fi
-
- echo "✅ Installer found: $INSTALLER_PATH"
- echo "INSTALLER_PATH=$INSTALLER_PATH" >> $GITHUB_ENV
-
- - name: Install Second Life (Mac)
- if: matrix.os == 'mac'
- shell: bash
- run: |
- # Mac installation
- echo "Mounting DMG installer..."
- MOUNT_POINT="/tmp/secondlife-dmg"
- mkdir -p "$MOUNT_POINT"
-
- # Mount the DMG
- hdiutil attach "$INSTALLER_PATH" -mountpoint "$MOUNT_POINT" -nobrowse
-
- echo "✅ DMG mounted at $MOUNT_POINT"
-
- echo "Installing application to default location from DMG..."
-
- # Find the .app bundle in the DMG
- APP_PATH=$(find "$MOUNT_POINT" -name "*.app" -type d | head -1)
-
- if [ -z "$APP_PATH" ]; then
- echo "❌ Error: No .app bundle found in the mounted DMG!"
- exit 1
- fi
-
- APP_NAME=$(basename "$APP_PATH")
- DEST_PATH="/Applications/$APP_NAME"
-
- # Handle existing installation
- if [ -d "$DEST_PATH" ]; then
- echo "Found existing installation at: $DEST_PATH"
- echo "Moving existing installation to trash..."
-
- # Move to trash instead of force removing
- TRASH_PATH="$HOME/.Trash/$(date +%Y%m%d_%H%M%S)_$APP_NAME"
- mv "$DEST_PATH" "$TRASH_PATH" || {
- echo "⚠️ Could not move to trash, trying direct removal..."
- rm -rf "$DEST_PATH" || {
- echo "❌ Could not remove existing installation"
- echo "Please manually remove: $DEST_PATH"
- exit 1
- }
- }
-
- echo "✅ Existing installation handled successfully"
- fi
-
- # Copy the .app to /Applications
- echo "Copying app from: $APP_PATH"
- echo "To destination: /Applications/"
- cp -R "$APP_PATH" /Applications/
-
- # Verify the app was copied successfully
- if [ ! -d "$DEST_PATH" ]; then
- echo "❌ Error: Failed to install application to /Applications!"
- exit 1
- fi
-
- echo "✅ Application installed successfully to /Applications"
-
- # Save mount point for cleanup
- echo "MOUNT_POINT=$MOUNT_POINT" >> $GITHUB_ENV
-
- - name: Wait for Installation to Complete (Mac)
- if: matrix.os == 'mac'
- shell: bash
- run: |
- echo "Waiting for installation to complete..."
- # Sleep to allow installation to finish (adjust as needed)
- sleep 30
- echo "✅ Installation completed"
-
- - name: Cleanup After Installation (Mac)
- if: matrix.os == 'mac'
- shell: bash
- run: |
- # Mac cleanup
- # Unmount the DMG
- echo "Unmounting DMG..."
- hdiutil detach "${{ env.MOUNT_POINT }}" -force
-
- # Clean up temporary files
- echo "Cleaning up temporary files..."
- rm -rf "${{ env.DOWNLOAD_PATH }}"
- rm -rf "${{ env.MOUNT_POINT }}"
-
- echo "✅ Cleanup completed"
-
- - name: Run QA Test Script (Mac)
- if: matrix.os == 'mac'
- shell: bash
- run: |
- echo "Running QA Test script on Mac runner: ${{ matrix.runner }}..."
- cd ${{ matrix.install-path }}
-
- # Activate virtual environment
- source .venv/bin/activate
-
- # Set runner name as environment variable
- export RUNNER_NAME="${{ matrix.runner }}"
-
- # Run the test script
- python runTests.py
-
- # - name: Upload Test Results
- # if: always()
- # uses: actions/upload-artifact@v4
- # with:
- # name: test-results-${{ matrix.runner }}
- # path: ${{ matrix.install-path }}/regressionTest/test_results.html