diff --git a/.github/workflows/build-binary.yml b/.github/workflows/build-binary.yml deleted file mode 100644 index aede182da..000000000 --- a/.github/workflows/build-binary.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Build binaries - -on: - push: - paths: - - '**.py' - - '**.pyx' - - '**.c' - - '**.h' - - '**.yml' - - '**.toml' - - '**.cfg' - - '**.ini' - - 'requirements.d/*' - - 'scripts/**' - pull_request: - paths: - - '**.py' - - '**.pyx' - - '**.c' - - '**.h' - - '**.yml' - - '**.toml' - - '**.cfg' - - '**.ini' - - 'requirements.d/*' - - 'scripts/**' - workflow_dispatch: - -jobs: - build-binary-macos: - name: Build (macOS ${{ matrix.os }} / ${{ runner.arch }}) - strategy: - fail-fast: false - matrix: - os: [macos-12, macos-14] - runs-on: ${{ matrix.os }} - timeout-minutes: 60 - - env: - # Support both Homebrew locations (Intel and Apple Silicon) - PKG_CONFIG_PATH: "/opt/homebrew/opt/openssl@3.0/lib/pkgconfig:/usr/local/opt/openssl@3.0/lib/pkgconfig:$PKG_CONFIG_PATH" - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - # Just fetching one commit is not enough for setuptools-scm, so we fetch all - fetch-depth: 0 - - - name: Set up Python 3.11 - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Cache pip - uses: actions/cache@v4 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('requirements.d/development.txt') }} - restore-keys: | - ${{ runner.os }}-pip- - ${{ runner.os }}- - - - name: Install macOS packages via Homebrew (see Brewfile) - run: | - brew bundle install - - - name: Install Python requirements - run: | - python -m pip install --upgrade pip setuptools wheel - pip install -r requirements.d/development.txt - - - name: Build Borg to compile extensions - env: - # Set both paths again to be sure nothing overrides them - PKG_CONFIG_PATH: "/opt/homebrew/opt/openssl@3.0/lib/pkgconfig:/usr/local/opt/openssl@3.0/lib/pkgconfig:${{ env.PKG_CONFIG_PATH }}" - run: | - pip install -ve . - - - name: Build PyInstaller single-file binary - run: | - python -m pip install 'pyinstaller==6.7.0' - mkdir -p dist/binary - pyinstaller --clean --distpath=dist/binary scripts/borg.exe.spec - pushd dist/binary - tar -czvf borg.tgz borg-dir - rm -rf borg-dir - popd - - - name: Smoke-test the built binary (borg -V) - run: | - pushd dist/binary - ls -l - # test single-file binary - chmod +x borg.exe - ./borg.exe -V - # test single-dir binary - tar -xzvf borg.tgz - chmod +x borg-dir/borg.exe - ./borg-dir/borg.exe -V - popd - - - name: Prepare artifacts - run: | - mkdir -p artifacts - if [ -f dist/binary/borg.exe ]; then - cp dist/binary/borg.exe artifacts/borg-${{ matrix.os }}-${{ runner.arch }} - fi - if [ -f dist/binary/borg.tgz ]; then - cp dist/binary/borg.tgz artifacts/borg-dir-${{ matrix.os }}-${{ runner.arch }}.tgz - fi - - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: borg-macos-${{ matrix.os }}-${{ runner.arch }} - path: artifacts/* - if-no-files-found: error diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e4eed57d5..32b44fb96 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -56,6 +56,11 @@ jobs: - os: ubuntu-22.04 python-version: '3.11' toxenv: py311-fuse2 + arch: X64 + - os: ubuntu-22.04-arm + python-version: '3.11' + toxenv: py311-fuse2 + arch: ARM64 - os: ubuntu-24.04 python-version: '3.12' toxenv: py312-fuse3 @@ -65,13 +70,16 @@ jobs: - os: ubuntu-24.04 python-version: '3.14' toxenv: py314-fuse3 + - os: macos-13 + python-version: '3.11' + toxenv: py311-none # Note: no FUSE testing due to #6099; see also #6196. + arch: X64 - os: macos-14 python-version: '3.11' toxenv: py311-none # Note: no FUSE testing due to #6099; see also #6196. + arch: ARM64 env: - # Configure pkg-config to use OpenSSL from Homebrew - PKG_CONFIG_PATH: "/opt/homebrew/opt/openssl@3.0/lib/pkgconfig:$PKG_CONFIG_PATH" TOXENV: ${{ matrix.toxenv }} runs-on: ${{ matrix.os }} @@ -82,10 +90,12 @@ jobs: with: # Just fetching one commit is not enough for setuptools-scm, so we fetch all fetch-depth: 0 + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} + - name: Cache pip uses: actions/cache@v4 with: @@ -112,22 +122,17 @@ jobs: run: | python -m pip install --upgrade pip setuptools wheel pip install -r requirements.d/development.txt + - name: Install BorgBackup - env: - # We already have this in the global environment, but something overrides it. - # So set it here again. - PKG_CONFIG_PATH: "/opt/homebrew/opt/openssl@3.0/lib/pkgconfig:$PKG_CONFIG_PATH" run: | pip install -ve . + - name: Run pytest via tox - env: - # We already have this in the global environment, but something overrides it. - # So set it here again. - PKG_CONFIG_PATH: "/opt/homebrew/opt/openssl@3.0/lib/pkgconfig:$PKG_CONFIG_PATH" run: | # Do not use fakeroot; run as root. Avoids the dreaded sporadic EISDIR failures; see #2482. #sudo -E bash -c "tox -e py" tox --skip-missing-interpreters + - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 env: @@ -136,3 +141,44 @@ jobs: with: token: ${{ secrets.CODECOV_TOKEN }} env_vars: OS, python + + - name: Build Borg fat binaries (${{ matrix.os }}-${{ matrix.arch }}) + if: ${{ matrix.arch }} + run: | + pip install 'pyinstaller==6.14.2' + mkdir -p dist/binary + pyinstaller --clean --distpath=dist/binary scripts/borg.exe.spec + + - name: Smoke-test the built binary (${{ matrix.os }}-${{ matrix.arch }}) + if: ${{ matrix.arch }} + run: | + pushd dist/binary + echo "single-file binary" + chmod +x borg.exe + ./borg.exe -V + echo "single-directory binary" + chmod +x borg-dir/borg.exe + ./borg-dir/borg.exe -V + tar czf borg.tgz borg-dir + popd + + - name: Prepare artifacts (${{ matrix.os }}-${{ matrix.arch }}) + if: ${{ matrix.arch }} + run: | + mkdir -p artifacts + if [ -f dist/binary/borg.exe ]; then + cp dist/binary/borg.exe artifacts/borg-${{ matrix.os }}-${{ matrix.arch }}.exe + fi + if [ -f dist/binary/borg.tgz ]; then + cp dist/binary/borg.tgz artifacts/borg-${{ matrix.os }}-${{ matrix.arch }}.tgz + fi + echo "artifact files" + ls -l artifacts/ + + - name: Upload artifacts (${{ matrix.os }}-${{ matrix.arch }}) + if: ${{ matrix.arch }} + uses: actions/upload-artifact@v4 + with: + name: borg-${{ matrix.os }}-${{ matrix.arch }} + path: artifacts/* + if-no-files-found: error