diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 801e525b43..eaa7b7d50d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -149,8 +149,8 @@ jobs: {"os": "ubuntu-24.04", "python-version": "3.12", "toxenv": "py312-fuse3"}, {"os": "ubuntu-24.04", "python-version": "3.13", "toxenv": "py313-fuse3"}, {"os": "ubuntu-24.04", "python-version": "3.14", "toxenv": "py314-fuse3"}, - {"os": "macos-13", "python-version": "3.11", "toxenv": "py311-none", "binary": "borg-macos-13-x86_64-gh"}, - {"os": "macos-14", "python-version": "3.11", "toxenv": "py311-none", "binary": "borg-macos-14-arm64-gh"} + {"os": "macos-15", "python-version": "3.11", "toxenv": "py311-none", "binary": "borg-macos-15-x86_64-gh"}, + {"os": "macos-15", "python-version": "3.11", "toxenv": "py311-none", "binary": "borg-macos-15-arm64-gh"} ] }' ) }} @@ -158,7 +158,8 @@ jobs: TOXENV: ${{ matrix.toxenv }} runs-on: ${{ matrix.os }} - timeout-minutes: 120 + # macOS machines can be slow, if overloaded. + timeout-minutes: 360 steps: - uses: actions/checkout@v4 @@ -187,10 +188,13 @@ jobs: sudo apt-get update sudo apt-get install -y pkg-config build-essential sudo apt-get install -y libssl-dev libacl1-dev libxxhash-dev liblz4-dev libzstd-dev - sudo apt-get install -y libfuse-dev fuse || true # Required for Python llfuse module - sudo apt-get install -y libfuse3-dev fuse3 || true # Required for Python pyfuse3 module sudo apt-get install -y bash zsh fish # for shell completion tests sudo apt-get install -y rclone openssh-server curl + if [[ "$TOXENV" == *"fuse2"* ]]; then + sudo apt-get install -y libfuse-dev fuse # Required for Python llfuse module + elif [[ "$TOXENV" == *"fuse3"* ]]; then + sudo apt-get install -y libfuse3-dev fuse3 # Required for Python pyfuse3 module + fi - name: Install macOS packages if: ${{ runner.os == 'macOS' }} @@ -262,28 +266,21 @@ jobs: - name: Install borgbackup run: | - pip install -e . - - - name: run tox env - run: | - # do not use fakeroot, but run as root. avoids the dreaded EISDIR sporadic 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: - OS: ${{ runner.os }} - python: ${{ matrix.python-version }} - with: - token: ${{ secrets.CODECOV_TOKEN }} - env_vars: OS, python + if [[ "$TOXENV" == *"fuse2"* ]]; then + pip install -ve ".[llfuse]" + elif [[ "$TOXENV" == *"fuse3"* ]]; then + pip install -ve ".[pyfuse3]" + else + pip install -ve . + fi - name: Build Borg fat binaries (${{ matrix.binary }}) if: ${{ matrix.binary && startsWith(github.ref, 'refs/tags/') }} run: | pip install 'pyinstaller==6.14.2' mkdir -p dist/binary + # Ensure locally built binaries in ./dist/binary are found during tox tests + echo "$GITHUB_WORKSPACE/dist/binary" >> "$GITHUB_PATH" pyinstaller --clean --distpath=dist/binary scripts/borg.exe.spec - name: Smoke-test the built binary (${{ matrix.binary }}) @@ -298,6 +295,8 @@ jobs: ./borg-dir/borg.exe -V tar czf borg.tgz borg-dir popd + echo "borg.exe binary in PATH" + borg.exe -V - name: Prepare binaries (${{ matrix.binary }}) if: ${{ matrix.binary && startsWith(github.ref, 'refs/tags/') }} @@ -326,6 +325,21 @@ jobs: path: artifacts/* if-no-files-found: error + - name: run tox env + run: | + # do not use fakeroot, but run as root. avoids the dreaded EISDIR sporadic 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: + OS: ${{ runner.os }} + python: ${{ matrix.python-version }} + with: + token: ${{ secrets.CODECOV_TOKEN }} + env_vars: OS, python + vm_tests: permissions: contents: read @@ -386,8 +400,10 @@ jobs: export IGNORE_OSVERSION=yes sudo -E pkg update -f sudo -E pkg install -y xxhash liblz4 zstd pkgconf - # Install one of the FUSE libraries; fail if neither is available - sudo -E pkg install -y fusefs-libs || sudo -E pkg install -y fusefs-libs3 + sudo -E pkg install -y fusefs-libs + sudo -E kldload fusefs + sudo -E sysctl vfs.usermount=1 + sudo -E chmod 666 /dev/fuse sudo -E pkg install -y rust sudo -E pkg install -y gmake sudo -E pkg install -y git @@ -407,8 +423,8 @@ jobs: pip -V python -m pip install --upgrade pip wheel pip install -r requirements.d/development.txt - pip install -e . - tox -e py311-none + pip install -e ".[llfuse]" + tox -e py311-fuse2 if [[ "${{ matrix.do_binaries }}" == "true" && "${{ startsWith(github.ref, 'refs/tags/') }}" == "true" ]]; then python -m pip install 'pyinstaller==6.14.2' @@ -514,7 +530,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/') && matrix.do_binaries uses: actions/upload-artifact@v4 with: - name: ${{ matrix.os }}-${{ matrix.version }}-dist + name: ${{ matrix.artifact_prefix }} path: artifacts/* if-no-files-found: ignore diff --git a/docs/binaries/00_README.txt b/docs/binaries/00_README.txt index 7a75a3726b..73ce7acb4c 100644 --- a/docs/binaries/00_README.txt +++ b/docs/binaries/00_README.txt @@ -34,19 +34,16 @@ Binaries built on GitHub servers borg-linux-glibc235-x86_64-gh Linux AMD/Intel (built on Ubuntu 22.04 LTS with glibc 2.35) borg-linux-glibc235-arm64-gh Linux ARM (built on Ubuntu 22.04 LTS with glibc 2.35) -borg-macos-14-arm64-gh macOS Apple Silicon (built on macOS 14 w/o FUSE support) -borg-macos-13-x86_64-gh macOS Intel (built on macOS 13 w/o FUSE support) +borg-macos-15-arm64-gh macOS Apple Silicon (built on macOS 15 w/o FUSE support) +borg-macos-15-x86_64-gh macOS Intel (built on macOS 15 w/o FUSE support) +borg-freebsd-14-x86_64-gh FreeBSD AMD/Intel (built on FreeBSD 14) Binaries built locally ~~~~~~~~~~~~~~~~~~~~~~ -borg-linux-glibc241-x86_64 Linux (built on Debian 13 "Trixie" with glibc 2.41) -borg-linux-glibc236-x86_64 Linux (built on Debian 12 "Bookworm" with glibc 2.36) borg-linux-glibc231-x86_64 Linux (built on Debian 11 "Bullseye" with glibc 2.31) -borg-freebsd-14-x86_64 FreeBSD (built on FreeBSD 14) - Note: if you don't find a specific binary here, check release 1.4.1 or 1.2.9. Verifying your download