Fix workflow failures: ARM64 dependency corruption and Qt IFW issues #368
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build_PAT | |
| on: | |
| pull_request: | |
| branches: | |
| - '*' | |
| push: | |
| branches: | |
| - '*' | |
| tags: | |
| - '*' | |
| jobs: | |
| pat_build: | |
| name: Build ${{ matrix.name }} | |
| runs-on: ${{ matrix.os }} | |
| continue-on-error: ${{ matrix.allow_failure }} | |
| strategy: | |
| # fail-fast: Default is true, switch to false to allow one platform to fail and still run others | |
| fail-fast: false | |
| matrix: | |
| name: [Ubuntu, macOS-Intel, macOS-ARM, Windows_2022] | |
| include: | |
| - name: Ubuntu | |
| os: ubuntu-22.04 | |
| node-version: 18 | |
| allow_failure: false | |
| - name: macOS-Intel | |
| os: macos-13 | |
| node-version: 18 | |
| allow_failure: false | |
| arch: x86_64 | |
| MACOSX_DEPLOYMENT_TARGET: 10.15 | |
| - name: macOS-ARM | |
| os: macos-14 | |
| node-version: 18 | |
| allow_failure: false | |
| arch: arm64 | |
| MACOSX_DEPLOYMENT_TARGET: 12.1 | |
| - name: Windows_2022 | |
| os: windows-2022 | |
| node-version: 18 | |
| allow_failure: false | |
| steps: | |
| - uses: actions/checkout@v4 | |
| # - name: Configure AWS credentials | |
| # uses: aws-actions/configure-aws-credentials@v4 | |
| # with: | |
| # aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
| # aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
| # aws-region: us-east-1 | |
| # continue-on-error: true | |
| - name: Test dependency accessibility | |
| shell: bash | |
| run: | | |
| echo "Testing dependency download accessibility..." | |
| # Test if we can download dependencies without AWS credentials | |
| if [ "${{ runner.os }}" == "Linux" ]; then | |
| TEST_FILE="ruby-3.2.2-linux.tar.gz" | |
| elif [ "${{ runner.os }}" == "macOS" ]; then | |
| if [ "${{ matrix.arch }}" = "arm64" ]; then | |
| TEST_FILE="ruby-3.2.2-darwin-arm64.tar.gz" | |
| else | |
| TEST_FILE="ruby-3.2.2-darwin.tar.gz" | |
| fi | |
| elif [ "${{ runner.os }}" == "Windows" ]; then | |
| TEST_FILE="ruby-3.2.2-win32.tar.gz" | |
| fi | |
| echo "Testing download of: $TEST_FILE" | |
| curl -I "https://openstudio-resources.s3.amazonaws.com/pat-dependencies3/$TEST_FILE" && echo "Dependencies accessible!" || echo "Dependencies may require authentication, continuing..." | |
| - name: Set up Node ${{ matrix.node-version }} | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node-version }} | |
| - name: Install System dependencies | |
| shell: bash | |
| run: | | |
| set -x | |
| if [ "$RUNNER_OS" == "Linux" ]; then | |
| sudo apt update | |
| sudo apt install cmake | |
| elif [ "$RUNNER_OS" == "macOS" ]; then | |
| # Create and activate Python virtual environment | |
| python3 -m venv venv | |
| source venv/bin/activate | |
| # Upgrade pip and install aqtinstall | |
| pip install --upgrade pip | |
| pip install aqtinstall | |
| # Verify installation | |
| pip show aqtinstall | |
| # Install Qt Installer Framework | |
| python -m aqt install-tool -O "${{ github.workspace }}/Qt/" mac desktop tools_ifw | |
| # Find the actual installed version directory and add to PATH | |
| QT_IFW_BASE="${{ github.workspace }}/Qt/Tools/QtInstallerFramework" | |
| echo "Looking for Qt IFW in: $QT_IFW_BASE" | |
| ls -la "$QT_IFW_BASE" || echo "QtInstallerFramework directory not found" | |
| # Look for version-specific subdirectories | |
| QT_IFW_DIR="" | |
| if [ -d "$QT_IFW_BASE" ]; then | |
| for subdir in "$QT_IFW_BASE"/*; do | |
| if [ -d "$subdir" ] && [ -f "$subdir/bin/binarycreator" ]; then | |
| QT_IFW_DIR="$subdir" | |
| break | |
| fi | |
| done | |
| fi | |
| # If not found in subdirectory, check direct bin path | |
| if [ -z "$QT_IFW_DIR" ] && [ -f "$QT_IFW_BASE/bin/binarycreator" ]; then | |
| QT_IFW_DIR="$QT_IFW_BASE" | |
| fi | |
| if [ -n "$QT_IFW_DIR" ]; then | |
| echo "Qt Installer Framework found at: $QT_IFW_DIR" | |
| echo "$QT_IFW_DIR/bin" >> $GITHUB_PATH | |
| # Also set as environment variable for later verification | |
| echo "QT_IFW_BIN_PATH=$QT_IFW_DIR/bin" >> $GITHUB_ENV | |
| else | |
| echo "ERROR: Qt Installer Framework binarycreator not found" | |
| echo "Available structure in $QT_IFW_BASE:" | |
| find "$QT_IFW_BASE" -name "*binary*" -type f 2>/dev/null || echo "No binarycreator found" | |
| exit 1 | |
| fi | |
| echo MACOSX_DEPLOYMENT_TARGET=${{ matrix.MACOSX_DEPLOYMENT_TARGET }} >> $GITHUB_ENV | |
| elif [ "$RUNNER_OS" == "Windows" ]; then | |
| # Create and activate Python virtual environment | |
| python3 -m venv venv | |
| source venv/Scripts/activate | |
| # Install aqtinstall (skip pip upgrade on Windows to avoid permission issues) | |
| pip install aqtinstall | |
| # Verify installation | |
| pip show aqtinstall | |
| # Install Qt Installer Framework | |
| python -m aqt install-tool -O "${{ github.workspace }}/Qt/" windows desktop tools_ifw | |
| # Find the actual installed version directory and add to PATH | |
| QT_IFW_BASE="${{ github.workspace }}/Qt/Tools/QtInstallerFramework" | |
| # List the actual structure for debugging | |
| echo "Qt Installer Framework structure:" | |
| ls -la "$QT_IFW_BASE" || echo "QtInstallerFramework directory not found" | |
| # Look for binarycreator.exe in various possible locations | |
| BINARYCREATOR_PATH="" | |
| # Check if there's a version-specific subdirectory | |
| for subdir in "$QT_IFW_BASE"/*; do | |
| if [ -d "$subdir" ] && [ -f "$subdir/bin/binarycreator.exe" ]; then | |
| BINARYCREATOR_PATH="$subdir/bin" | |
| break | |
| fi | |
| done | |
| # If not found, check direct bin path | |
| if [ -z "$BINARYCREATOR_PATH" ] && [ -f "$QT_IFW_BASE/bin/binarycreator.exe" ]; then | |
| BINARYCREATOR_PATH="$QT_IFW_BASE/bin" | |
| fi | |
| if [ -n "$BINARYCREATOR_PATH" ]; then | |
| echo "Qt Installer Framework binarycreator found at: $BINARYCREATOR_PATH" | |
| echo "$BINARYCREATOR_PATH" >> $GITHUB_PATH | |
| # Also set as environment variable for later use | |
| echo "QT_IFW_BIN_PATH=$BINARYCREATOR_PATH" >> $GITHUB_ENV | |
| else | |
| echo "ERROR: Qt Installer Framework binarycreator.exe not found" | |
| echo "Available files in $QT_IFW_BASE:" | |
| find "$QT_IFW_BASE" -name "*.exe" -type f || echo "No .exe files found" | |
| exit 1 | |
| fi | |
| #echo "Setting CMAKE_GENERATOR options equivalent to ='-G \"Visual Studio 16 2019\" -A x64'" | |
| #echo CMAKE_GENERATOR='Visual Studio 16 2019' >> $GITHUB_ENV | |
| #echo CMAKE_GENERATOR_PLATFORM=x64 >> $GITHUB_ENV | |
| # C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise | |
| # Command below no longer working and returning the version number. | |
| # MSVC_DIR=$(cmd.exe /c "vswhere -products * -requires Microsoft.Component.MSBuild -property installationPath -latest") | |
| MSVC_DIR="C:\Program Files\Microsoft Visual Studio\2022\Enterprise" | |
| echo "Latest is: $MSVC_DIR" | |
| echo "MSVC_DIR=$MSVC_DIR" >> $GITHUB_ENV | |
| # add folder containing vcvarsall.bat | |
| echo "$MSVC_DIR\VC\Auxiliary\Build" >> $GITHUB_PATH | |
| fi; | |
| N=$(nproc 2>/dev/null || sysctl -n hw.logicalcpu) | |
| echo "There are $N threads available" | |
| echo "N=$N" >> $GITHUB_ENV | |
| - name: Create Build Directory | |
| run: cmake -E make_directory ./build/ | |
| - name: Clean up potentially corrupted dependency files | |
| shell: bash | |
| run: | | |
| # Create depend directory if it doesn't exist | |
| mkdir -p depend/ | |
| # Remove any existing OpenStudio-server files that might be corrupted | |
| echo "Cleaning up OpenStudio-server files..." | |
| find depend/ -name "OpenStudio-server-*" -type f -delete 2>/dev/null || true | |
| # Also clean up any partial downloads or temp files | |
| find depend/ -name "*.tmp" -type f -delete 2>/dev/null || true | |
| find depend/ -name "*.part" -type f -delete 2>/dev/null || true | |
| # Clean up any corrupted gzip files by testing them | |
| for file in depend/*.tar.gz; do | |
| if [ -f "$file" ]; then | |
| echo "Testing $file..." | |
| if ! gzip -t "$file" 2>/dev/null; then | |
| echo "Removing corrupted file: $file" | |
| rm -f "$file" | |
| fi | |
| fi | |
| done | |
| echo "Cleanup completed. Current depend/ contents:" | |
| ls -la depend/ || echo "depend/ directory is empty" | |
| - name: Configure CMake & build (Windows) | |
| working-directory: ./build | |
| if: runner.os == 'Windows' | |
| shell: pwsh | |
| run: | | |
| Write-Host "Using vcvarsall to initialize the development environment" | |
| cmd /c "vcvarsall.bat x64 && set" | ForEach-Object { | |
| if ($_ -match "^([^=]+)=(.*)$") { | |
| [System.Environment]::SetEnvironmentVariable($matches[1], $matches[2]) | |
| } | |
| } | |
| # Add Qt Installer Framework to PATH using the environment variable set earlier | |
| $qtIfwBin = $env:QT_IFW_BIN_PATH | |
| if ($qtIfwBin -and (Test-Path "$qtIfwBin\binarycreator.exe")) { | |
| Write-Host "Adding Qt IFW to PATH: $qtIfwBin" | |
| $env:PATH = "$qtIfwBin;$env:PATH" | |
| } else { | |
| Write-Host "Warning: Qt Installer Framework binarycreator.exe not found in expected location: $qtIfwBin" | |
| # Try to find it manually as fallback | |
| $qtIfwBase = "${{ github.workspace }}\Qt\Tools\QtInstallerFramework" | |
| if (Test-Path $qtIfwBase) { | |
| $subDirs = Get-ChildItem -Path $qtIfwBase -Directory | Where-Object { Test-Path "$($_.FullName)\bin\binarycreator.exe" } | |
| if ($subDirs) { | |
| $qtIfwBin = "$($subDirs[0].FullName)\bin" | |
| Write-Host "Found Qt IFW at: $qtIfwBin" | |
| $env:PATH = "$qtIfwBin;$env:PATH" | |
| } | |
| } | |
| } | |
| # Verify binarycreator is available | |
| try { | |
| $binaryCreatorPath = (Get-Command binarycreator -ErrorAction SilentlyContinue).Source | |
| Write-Host "binarycreator found at: $binaryCreatorPath" | |
| } catch { | |
| Write-Host "ERROR: binarycreator not found in PATH" | |
| Write-Host "Current PATH: $env:PATH" | |
| } | |
| cmake -G "Visual Studio 17 2022" -A x64 .. | |
| cmake --build . --target package -j $env:N --config Release | |
| - name: Configure CMake & build (Linux) | |
| working-directory: ./build | |
| if: runner.os == 'Linux' | |
| shell: bash | |
| run: | | |
| set -x | |
| cmake -DCMAKE_BUILD_TYPE=Release \ | |
| -DCPACK_BINARY_DEB=ON \ | |
| -DCPACK_BINARY_IFW=OFF \ | |
| -DCPACK_BINARY_TGZ=OFF \ | |
| -DCPACK_BINARY_TZ=OFF \ | |
| -DCPACK_BINARY_STGZ=OFF \ | |
| -DCPACK_BINARY_TBZ2=OFF \ | |
| ../ | |
| cmake --build . --target package -j $N | |
| - name: Configure CMake & build (macOS) | |
| working-directory: ./build | |
| if: runner.os == 'macOS' | |
| shell: bash | |
| run: | | |
| set -x | |
| # Verify binarycreator is available | |
| if ! command -v binarycreator &> /dev/null; then | |
| echo "ERROR: binarycreator not found in PATH" | |
| echo "Current PATH: $PATH" | |
| echo "QT_IFW_BIN_PATH: $QT_IFW_BIN_PATH" | |
| if [ -n "$QT_IFW_BIN_PATH" ]; then | |
| echo "Adding QT_IFW_BIN_PATH to PATH and retrying..." | |
| export PATH="$QT_IFW_BIN_PATH:$PATH" | |
| if ! command -v binarycreator &> /dev/null; then | |
| echo "ERROR: binarycreator still not found after adding QT_IFW_BIN_PATH" | |
| ls -la "$QT_IFW_BIN_PATH" || echo "QT_IFW_BIN_PATH directory does not exist" | |
| exit 1 | |
| fi | |
| else | |
| echo "ERROR: QT_IFW_BIN_PATH not set" | |
| exit 1 | |
| fi | |
| fi | |
| echo "binarycreator found at: $(which binarycreator)" | |
| if [ "${{ matrix.arch }}" = "arm64" ]; then | |
| CMAKE_OSX_ARCHITECTURES=arm64 | |
| export CMAKE_OSX_ARCHITECTURES | |
| export MATRIX_ARCH=arm64 | |
| echo "MATRIX_ARCH=arm64" >> $GITHUB_ENV | |
| cmake -DCMAKE_OSX_ARCHITECTURES="arm64" \ | |
| -DCMAKE_OSX_DEPLOYMENT_TARGET="${{ matrix.MACOSX_DEPLOYMENT_TARGET }}" \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| ../ | |
| else | |
| CMAKE_OSX_ARCHITECTURES=x86_64 | |
| export CMAKE_OSX_ARCHITECTURES | |
| export MATRIX_ARCH=x86_64 | |
| echo "MATRIX_ARCH=x86_64" >> $GITHUB_ENV | |
| cmake -DCMAKE_OSX_ARCHITECTURES="x86_64" \ | |
| -DCMAKE_OSX_DEPLOYMENT_TARGET="${{ matrix.MACOSX_DEPLOYMENT_TARGET }}" \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| ../ | |
| fi | |
| cmake --build . --target package -j $N | |
| - name: Save artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: PAT-Installer-${{ matrix.name }} | |
| path: ./build/ParametricAnalysisTool-* | |
| #name: OpenStudio-PAT-{{ matrix.name }}-${{ github.sha }} | |