Create the browser immediately after Initialize() instead of via OnCo… #67
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: CI macOS ARM | |
| on: | |
| push: | |
| branches: ["master", "cefpython147"] | |
| pull_request: | |
| branches: ["master"] | |
| workflow_dispatch: | |
| inputs: | |
| bypass_cache: | |
| description: "Bypass all caches for a clean run" | |
| type: boolean | |
| default: false | |
| jobs: | |
| download-cef: | |
| runs-on: macos-14 | |
| timeout-minutes: 15 | |
| outputs: | |
| cef_version: ${{ steps.cef-version.outputs.value }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.10" | |
| - name: Read CEF version | |
| id: cef-version | |
| run: | | |
| ver=$(sed -n 's/.*#define CEF_VERSION "\([^"]*\)".*/\1/p' \ | |
| src/version/cef_version_macarm64.h) | |
| echo "value=$ver" >> $GITHUB_OUTPUT | |
| - name: Cache CEF binaries | |
| uses: actions/cache@v4 | |
| if: ${{ inputs.bypass_cache != true }} | |
| with: | |
| path: | | |
| build/cef_binary_* | |
| build/cef*_macarm64 | |
| # Keyed on the CEF version (each version gets its own cache) and on the | |
| # download/prepare scripts (invalidate when they change). | |
| key: cef-macosarm64-${{ hashFiles('tools/download_cef.py', 'tools/automate.py') }}-${{ steps.cef-version.outputs.value }} | |
| - name: Install build tools | |
| run: python tools/requirements.py | |
| - name: Download CEF binaries | |
| run: python tools/download_cef.py | |
| build: | |
| needs: download-cef | |
| runs-on: macos-14 | |
| timeout-minutes: 90 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 # full history for the --dev wheel version (git commit count) | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Restore CEF cache | |
| uses: actions/cache/restore@v4 | |
| if: ${{ inputs.bypass_cache != true }} | |
| with: | |
| path: | | |
| build/cef_binary_* | |
| build/cef*_macarm64 | |
| key: cef-macosarm64-${{ hashFiles('tools/download_cef.py', 'tools/automate.py') }}-${{ needs.download-cef.outputs.cef_version }} | |
| - name: Install build tools | |
| run: python tools/requirements.py | |
| - name: Prepare prebuilt CEF | |
| run: python tools/automate.py --prebuilt-cef | |
| - name: Configure CMake | |
| run: cmake -S . -B build/_cmake_build -G Ninja -DCMAKE_BUILD_TYPE=Release | |
| - name: Build | |
| run: cmake --build build/_cmake_build --parallel | |
| - name: Stage build outputs | |
| run: | | |
| mkdir -p build/artifacts | |
| cp build/_cmake_build/cefpython_py*.so build/artifacts/ | |
| cp build/_cmake_build/subprocess_build/subprocess build/artifacts/ | |
| cef_dir=$(ls -d build/cef*_macarm64 2>/dev/null | head -1) | |
| find "$cef_dir/bin" -maxdepth 1 -mindepth 1 \ | |
| ! -name 'cefclient*' ! -name 'cefsimple*' ! -name 'ceftests*' \ | |
| -exec cp -r {} build/artifacts/ \; | |
| - name: Set up cefpython3 package | |
| run: cp -r build/artifacts/. cefpython3/ | |
| - name: Codesign binaries | |
| run: | | |
| # Ad-hoc sign our freshly built binaries so macOS 14+ Gatekeeper | |
| # allows them to run (unsigned binaries are blocked; the GPU process | |
| # reuses subprocess with --type=gpu-process and would exit 1003). | |
| codesign --force --sign - cefpython3/subprocess | |
| for f in cefpython3/cefpython_py*.so; do codesign --force --sign - "$f"; done | |
| - name: Create app bundle for tests | |
| run: | | |
| # CEF 130+ forms the MachPortRendezvousServer bootstrap name from | |
| # BaseBundleID(); without a CFBundleIdentifier it starts with "." and | |
| # bootstrap_register rejects it, crashing renderer subprocesses. | |
| # Setting CFProcessPath to a minimal app bundle gives a valid bundle | |
| # ID before CefInitialize(). Reused by both test steps below. | |
| BUNDLE_DIR="${{ github.workspace }}/CEFPython.app" | |
| mkdir -p "$BUNDLE_DIR/Contents/MacOS" | |
| ln -sf "$(which python)" "$BUNDLE_DIR/Contents/MacOS/python" | |
| cat > "$BUNDLE_DIR/Contents/Info.plist" << 'PLIST' | |
| <?xml version="1.0" encoding="UTF-8"?> | |
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |
| <plist version="1.0"> | |
| <dict> | |
| <key>CFBundleIdentifier</key> | |
| <string>org.cefpython</string> | |
| <key>CFBundleName</key> | |
| <string>CEFPython</string> | |
| <key>CFBundleExecutable</key> | |
| <string>python</string> | |
| </dict> | |
| </plist> | |
| PLIST | |
| echo "CFProcessPath=$BUNDLE_DIR/Contents/MacOS/python" >> $GITHUB_ENV | |
| - name: Build wheel | |
| run: python tools/build_distrib.py --dev | |
| - name: Test the built wheel | |
| run: | | |
| # Install the wheel and run the unit tests against the INSTALLED | |
| # package (binaries were codesigned before build_distrib). No | |
| # PYTHONPATH: _test_runner.py chdir's to unittests/, so the repo's | |
| # cefpython3/ build dir is never on sys.path and import cefpython3 | |
| # resolves to the installed wheel. CFProcessPath is inherited from | |
| # the app-bundle step. | |
| pip install build/dist/*.whl | |
| python unittests/_test_runner.py | |
| - name: Upload wheel artifact | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| path: build/dist/*.whl | |
| archive: false |