Przeglądaj źródła

CI: FUSE related fixes/improvements (master)

fixes #9182

- install OS fuse support packages as indicated by the tox env.
  on the macOS runners, we do not have any fuse support.
  on the linux runners, we may have fuse2 or fuse3.
  on FreeBSD, we have fuse2.
- install fuse python library for binary build
- first build/upload binaries, then run tests (including binary tests).
  early uploading makes inspection of a malfunctioning binary possible.
- for now, use llfuse, as there is an issue with pyinstaller and pyfuse3.

Also:
- remove || true - this just hides errors, not what we want.
Thomas Waldmann 1 miesiąc temu
rodzic
commit
c8f5d6219d
1 zmienionych plików z 37 dodań i 22 usunięć
  1. 37 22
      .github/workflows/ci.yml

+ 37 - 22
.github/workflows/ci.yml

@@ -187,10 +187,13 @@ jobs:
         sudo apt-get update
         sudo apt-get update
         sudo apt-get install -y pkg-config build-essential
         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 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 bash zsh fish  # for shell completion tests
         sudo apt-get install -y rclone openssh-server curl
         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
     - name: Install macOS packages
       if: ${{ runner.os == 'macOS' }}
       if: ${{ runner.os == 'macOS' }}
@@ -262,28 +265,21 @@ jobs:
 
 
     - name: Install borgbackup
     - name: Install borgbackup
       run: |
       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 }})
     - name: Build Borg fat binaries (${{ matrix.binary }})
       if: ${{ matrix.binary && startsWith(github.ref, 'refs/tags/') }}
       if: ${{ matrix.binary && startsWith(github.ref, 'refs/tags/') }}
       run: |
       run: |
         pip install 'pyinstaller==6.14.2'
         pip install 'pyinstaller==6.14.2'
         mkdir -p dist/binary
         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
         pyinstaller --clean --distpath=dist/binary scripts/borg.exe.spec
 
 
     - name: Smoke-test the built binary (${{ matrix.binary }})
     - name: Smoke-test the built binary (${{ matrix.binary }})
@@ -298,6 +294,8 @@ jobs:
         ./borg-dir/borg.exe -V
         ./borg-dir/borg.exe -V
         tar czf borg.tgz borg-dir
         tar czf borg.tgz borg-dir
         popd
         popd
+        echo "borg.exe binary in PATH"
+        borg.exe -V
 
 
     - name: Prepare binaries (${{ matrix.binary }})
     - name: Prepare binaries (${{ matrix.binary }})
       if: ${{ matrix.binary && startsWith(github.ref, 'refs/tags/') }}
       if: ${{ matrix.binary && startsWith(github.ref, 'refs/tags/') }}
@@ -326,6 +324,21 @@ jobs:
         path: artifacts/*
         path: artifacts/*
         if-no-files-found: error
         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:
   vm_tests:
     permissions:
     permissions:
       contents: read
       contents: read
@@ -386,8 +399,10 @@ jobs:
                 export IGNORE_OSVERSION=yes
                 export IGNORE_OSVERSION=yes
                 sudo -E pkg update -f
                 sudo -E pkg update -f
                 sudo -E pkg install -y xxhash liblz4 zstd pkgconf
                 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 rust
                 sudo -E pkg install -y gmake
                 sudo -E pkg install -y gmake
                 sudo -E pkg install -y git
                 sudo -E pkg install -y git
@@ -407,8 +422,8 @@ jobs:
                 pip -V
                 pip -V
                 python -m pip install --upgrade pip wheel
                 python -m pip install --upgrade pip wheel
                 pip install -r requirements.d/development.txt
                 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
                 if [[ "${{ matrix.do_binaries }}" == "true" && "${{ startsWith(github.ref, 'refs/tags/') }}" == "true" ]]; then
                   python -m pip install 'pyinstaller==6.14.2'
                   python -m pip install 'pyinstaller==6.14.2'