From b77c8cc8abf8bd67c2d46c69fc59cc1d70b52206 Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Fri, 6 Mar 2026 09:15:01 -0500 Subject: [PATCH] fix: resolve PowerShell ScriptBlock parsing error in Windows docker run commands Refactored Windows container build steps to pipe PowerShell scripts via stdin instead of passing them as command-line arguments to `docker run`. This prevents PowerShell from incorrectly interpreting curly braces inside the script string as a ScriptBlock argument. Applied this fix to: - Preflight toolchain (Windows) - Build format (Windows) - Compress PDF (Windows) - Compress EPUB (Windows) --- .github/workflows/book-build-container.yml | 44 +++++++++++++--------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/.github/workflows/book-build-container.yml b/.github/workflows/book-build-container.yml index b02d6a9ba..e28e6f328 100644 --- a/.github/workflows/book-build-container.yml +++ b/.github/workflows/book-build-container.yml @@ -459,7 +459,8 @@ jobs: shell: pwsh run: | Write-Host "๐Ÿงช Running Windows toolchain preflight checks..." - docker run --rm -e PYTHONPATH=C:\workspace -v "$($PWD.Path):C:\workspace" -w "C:\workspace\book\quarto" ${{ env.CONTAINER_IMAGE }} pwsh -NoLogo -Command " + $preflightScript = @" + `$ErrorActionPreference = 'Stop' `$PSNativeCommandUseErrorActionPreference = `$true @@ -528,7 +529,8 @@ jobs: if ('${{ matrix.format_name }}' -eq 'EPUB') { Invoke-Check 'Pillow import' { python -c 'import PIL; print(\"Pillow:\", PIL.__version__)' } } - " + "@ + $preflightScript | docker run --rm -e PYTHONPATH=C:\workspace -v "$($PWD.Path):C:\workspace" -w "C:\workspace\book\quarto" ${{ env.CONTAINER_IMAGE }} -i pwsh -NoLogo -Command - Write-Host "โœ… Windows toolchain preflight checks passed" - name: ๐Ÿ”จ Build ${{ matrix.format_name }} (Linux) @@ -548,11 +550,13 @@ jobs: shell: pwsh run: | Write-Host "๐Ÿ”จ Building ${{ matrix.format_name }} on Windows container..." - docker run --rm -e PYTHONPATH=C:\workspace -v "$($PWD.Path):C:\workspace" -w "C:\workspace\book\quarto" ${{ env.CONTAINER_IMAGE }} pwsh -NoLogo -Command " + $buildScript = @" + if (Test-Path '_quarto.yml') { Remove-Item '_quarto.yml' -Force } Copy-Item 'config\${{ matrix.config }}' '_quarto.yml' -Force quarto render --to ${{ matrix.render_target }} --output-dir '${{ matrix.output_dir }}' - " + "@ + $buildScript | docker run --rm -e PYTHONPATH=C:\workspace -v "$($PWD.Path):C:\workspace" -w "C:\workspace\book\quarto" ${{ env.CONTAINER_IMAGE }} -i pwsh -NoLogo -Command - Write-Host "โœ… ${{ matrix.format_name }} build completed" - name: ๐Ÿ“‰ Compress PDF (Linux) @@ -595,21 +599,22 @@ jobs: shell: pwsh run: | Write-Host "๐Ÿ”จ Compressing PDF on Windows container..." - docker run --rm -e PYTHONPATH=C:\workspace -v "$($PWD.Path):C:\workspace" -w "C:\workspace\book\quarto\${{ matrix.output_dir }}" ${{ env.CONTAINER_IMAGE }} pwsh -NoLogo -Command " + $compressPdfScript = @" + if (Test-Path 'Machine-Learning-Systems.pdf') { Write-Host '๐Ÿ“‰ Compressing PDF with professional compression tool...' Write-Host '๐Ÿ” DEBUG: Current directory:' Get-Location Write-Host '๐Ÿ” DEBUG: Windows environment info:' - Write-Host (\"OS: {0}\" -f [System.Environment]::OSVersion.VersionString) - Write-Host (\"Architecture: {0}\" -f [System.Environment]::Is64BitOperatingSystem) + Write-Host ("OS: {0}" -f [System.Environment]::OSVersion.VersionString) + Write-Host ("Architecture: {0}" -f [System.Environment]::Is64BitOperatingSystem) Write-Host '๐Ÿ” DEBUG: Verifying Python and Pillow installation:' `$py_version = (python --version 2>&1).Trim() - Write-Host \" ๐Ÿ Python Version: `$py_version\" + Write-Host " ๐Ÿ Python Version: `$py_version" `$py_path = (python -c 'import sys; print(sys.executable)').Trim() - Write-Host \" ๐Ÿ Python Path: `$py_path\" + Write-Host " ๐Ÿ Python Path: `$py_path" `$pillow_version = (python -c 'import PIL; print(PIL.__version__)').Trim() - Write-Host \" โœ… Pillow Version: `$pillow_version\" + Write-Host " โœ… Pillow Version: `$pillow_version" Write-Host '๐Ÿ” DEBUG: Checking for script at relative path:' if (Test-Path '..\\..\\publish\\compress_pdf.py') { Write-Host 'โœ… Found script at ..\\..\\publish\\compress_pdf.py' @@ -625,7 +630,8 @@ jobs: } else { Write-Warning 'โš ๏ธ Machine-Learning-Systems.pdf not found for compression.' } - " + "@ + $compressPdfScript | docker run --rm -e PYTHONPATH=C:\workspace -v "$($PWD.Path):C:\workspace" -w "C:\workspace\book\quarto\${{ matrix.output_dir }}" ${{ env.CONTAINER_IMAGE }} -i pwsh -NoLogo -Command - Write-Host "โœ… PDF compression completed." - name: ๐Ÿ“š Compress EPUB (Linux) @@ -670,21 +676,22 @@ jobs: shell: pwsh run: | Write-Host "๐Ÿ”จ Compressing EPUB on Windows container..." - docker run --rm -e PYTHONPATH=C:\workspace -v "$($PWD.Path):C:\workspace" -w "C:\workspace\book\quarto\${{ matrix.output_dir }}" ${{ env.CONTAINER_IMAGE }} pwsh -NoLogo -Command " + $compressEpubScript = @" + if (Test-Path 'Machine-Learning-Systems.epub') { Write-Host '๐Ÿ“š Compressing EPUB with optimized compression tool...' Write-Host '๐Ÿ” DEBUG: Current directory:' Get-Location Write-Host '๐Ÿ” DEBUG: Windows environment info:' - Write-Host (\"OS: {0}\" -f [System.Environment]::OSVersion.VersionString) - Write-Host (\"Architecture: {0}\" -f [System.Environment]::Is64BitOperatingSystem) + Write-Host ("OS: {0}" -f [System.Environment]::OSVersion.VersionString) + Write-Host ("Architecture: {0}" -f [System.Environment]::Is64BitOperatingSystem) Write-Host '๐Ÿ” DEBUG: Verifying Python and Pillow installation:' `$py_version = (python --version 2>&1).Trim() - Write-Host \" ๐Ÿ Python Version: `$py_version\" + Write-Host " ๐Ÿ Python Version: `$py_version" `$py_path = (python -c 'import sys; print(sys.executable)').Trim() - Write-Host \" ๐Ÿ Python Path: `$py_path\" + Write-Host " ๐Ÿ Python Path: `$py_path" `$pillow_version = (python -c 'import PIL; print(PIL.__version__)').Trim() - Write-Host \" โœ… Pillow Version: `$pillow_version\" + Write-Host " โœ… Pillow Version: `$pillow_version" Write-Host '๐Ÿ” DEBUG: Checking for script at relative path:' if (Test-Path '..\\..\\publish\\compress_epub.py') { Write-Host 'โœ… Found script at ..\\..\\publish\\compress_epub.py' @@ -700,7 +707,8 @@ jobs: } else { Write-Warning 'โš ๏ธ Machine-Learning-Systems.epub not found for compression.' } - " + "@ + $compressEpubScript | docker run --rm -e PYTHONPATH=C:\workspace -v "$($PWD.Path):C:\workspace" -w "C:\workspace\book\quarto\${{ matrix.output_dir }}" ${{ env.CONTAINER_IMAGE }} -i pwsh -NoLogo -Command - Write-Host "โœ… EPUB compression completed." - name: ๐Ÿ“ค Upload artifact