diff --git a/.github/workflows/perlbrew.sha256 b/.github/workflows/perlbrew.sha256
new file mode 100644
index 0000000..d999291
--- /dev/null
+++ b/.github/workflows/perlbrew.sha256
@@ -0,0 +1 @@
+c3996e4fae37a0ae01839cdd73752fb7b17e81bac2a8b39712463a7d518c4945  perlbrew.sh
diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml
new file mode 100644
index 0000000..33222be
--- /dev/null
+++ b/.github/workflows/run-tests.yml
@@ -0,0 +1,94 @@
+name: "Unit tests"
+
+on: [push, pull_request]
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+
+    defaults:
+      run:
+        shell: bash -l -e -o pipefail {0}
+
+    env:
+      PERL_CACHE: ~/perl5 # Perlbrew and CPAN modules installed here, cached
+      NPG_LIB: ~/perl5npg # NPG modules installed here, not cached
+      WTSI_NPG_GITHUB_URL: https://github.com/wtsi-npg
+      WTSI_NPG_BUILD_BRANCH: ${GITHUB_HEAD_REF}
+
+    strategy:
+      matrix:
+        perl: ["5.26.3", "5.34.1"]
+
+    steps:
+      - uses: actions/checkout@v3
+
+      - name: "Cache Perl"
+        id: cache-perl
+        uses: actions/cache@v3
+        with:
+          path: ${{ env.PERL_CACHE }}
+          key: ${{ runner.os }}-${{ matrix.perl }}-perl
+
+      - name: "Install Perlbrew"
+        if: steps.cache-perl.outputs.cache-hit != 'true'
+        run: |
+          curl -sSL https://install.perlbrew.pl -o perlbrew.sh
+          sha256sum -c .github/workflows/perlbrew.sha256
+          export PERLBREW_ROOT=${{ env.PERL_CACHE }}
+          sh perlbrew.sh
+          
+          source ${{ env.PERL_CACHE }}/etc/bashrc
+          perlbrew available
+          perlbrew install --notest perl-${{ matrix.perl }}
+          perlbrew use perl-${{ matrix.perl }}
+          perlbrew install-cpanm
+
+      - name: "Initialize Perlbrew"
+        run: |
+          echo "source ${{ env.PERL_CACHE }}/etc/bashrc" >> "$HOME/.bash_profile"
+
+      - name: "Install Perl dependencies"
+        run: |
+          cpanm --local-lib=${{ env.PERL_CACHE }} local::lib
+          eval $(perl -I ${{ env.PERL_CACHE }}/lib/perl5/ -Mlocal::lib="$NPG_LIB")
+          eval $(perl -I ${{ env.PERL_CACHE }}/lib/perl5/ -Mlocal::lib)
+          
+          ./scripts/install_wsi_dependencies.sh "$NPG_LIB" perl-dnap-utilities
+          
+          cpanm --installdeps --notest .
+
+      - name: "Log install failure"
+        if: ${{ failure() }}
+        run: |
+          find ~/.cpanm/work -cmin -1 -name '*.log' -exec tail -n20  {} \;
+
+      - name: "Archive CPAN logs on failure"
+        if: ${{ failure() }}
+        uses: actions/upload-artifact@v2
+        with:
+          name: cpan_log
+          path: ~/.cpanm/work/*/build.log
+          retention-days: 5
+
+      - name: "Run tests"
+        run: |
+          eval $(perl -I ${{ env.PERL_CACHE }}/lib/perl5/ -Mlocal::lib)
+          eval $(perl -I ${{ env.PERL_CACHE }}/lib/perl5/ -Mlocal::lib="$NPG_LIB")
+          
+          export TEST_AUTHOR=1
+          perl Build.PL
+          ./Build test --verbose
+          ./Build install    
+
+      - name: "Build distribution"
+        run: |
+          eval $(perl -I ${{ env.PERL_CACHE }}/lib/perl5/ -Mlocal::lib)
+          eval $(perl -I ${{ env.PERL_CACHE }}/lib/perl5/ -Mlocal::lib="$NPG_LIB")
+
+          ./Build dist
+          export DIST_FILE=ml_warehouse-*.tar.gz
+          export MD5_FILE=$DIST_FILE.md5
+          md5sum $DIST_FILE > $MD5_FILE
+          export SHA256_FILE=$DIST_FILE.sha256
+          shasum -a 256 $DIST_FILE > $SHA256_FILE
diff --git a/.github/workflows/testing_and_building_repo.yml b/.github/workflows/testing_and_building_repo.yml
deleted file mode 100644
index 0b7745a..0000000
--- a/.github/workflows/testing_and_building_repo.yml
+++ /dev/null
@@ -1,65 +0,0 @@
-name: testing_and_building_repo
-on: [push, pull_request]
-jobs:
-  build:
-    runs-on: ubuntu-latest
-    name: Distribution Perl
-    steps:
-    - uses: actions/checkout@v3
-    
-   # Caching cpanm external modules
-    - name: Cache cpanm external modules
-      id: cpanmCache
-      uses: actions/cache@v3
-      with:
-        path: ~/perl5ext  
-        key: ${{ runner.os }}-build-cpanm-external
- 
-    - name: install cpanm 
-      run: |
-          wget -qO - https://cpanmin.us | /usr/bin/perl - --sudo App::cpanminus
-
-    # run the perl install script
-    - name: install NPG Perl dependencies, and their CPAN dependencies
-      run: |
-          cpanm --local-lib=~/perl5ext local::lib && eval $(perl -I ~/perl5ext/lib/perl5/ -Mlocal::lib)
-          ${GITHUB_WORKSPACE}/scripts/install_npg_perl_dependencies.sh $WTSI_NPG_GITHUB_URL $WTSI_NPG_BUILD_BRANCH
-      env:
-        WTSI_NPG_GITHUB_URL: https://github.com/wtsi-npg 
-        WTSI_NPG_BUILD_BRANCH: ${GITHUB_HEAD_REF}
-      
-    - name: install cpanm dependencies
-      run: |
-          eval $(perl -I ~/perl5ext/lib/perl5/ -Mlocal::lib=~/perl5npg)
-          eval $(perl -I ~/perl5ext/lib/perl5/ -Mlocal::lib=~/perl5ext)
-          cpanm --installdeps --notest .
-
-    - name: run Build.PL and ./Build
-      run: |
-          eval $(perl -I ~/perl5ext/lib/perl5/ -Mlocal::lib=~/perl5ext)
-          eval $(perl -I ~/perl5ext/lib/perl5/ -Mlocal::lib=~/perl5npg)
-          export TEST_AUTHOR=1
-          perl Build.PL
-          ./Build test --verbose
-          ./Build install
-
-    # running ./Build dist and exporting files
-    - name: run ./Build dist  
-      run: |
-          eval $(perl -I ~/perl5ext/lib/perl5/ -Mlocal::lib=~/perl5ext)
-          export TEST_AUTHOR=1
-          ./Build dist
-          export DIST_FILE=ml_warehouse-*.tar.gz
-          export MD5_FILE=$DIST_FILE.md5
-          md5sum $DIST_FILE > $MD5_FILE
-          export SHA256_FILE=$DIST_FILE.sha256
-          shasum -a 256 $DIST_FILE > $SHA256_FILE
-         
-    # Archive logs if failure
-    - name: Archive CPAN logs
-      if: ${{ failure() }}
-      uses: actions/upload-artifact@v2
-      with:
-        name: cpan_log
-        path: /home/runner/.cpanm/work/*/build.log
-        retention-days: 5
diff --git a/Changes b/Changes
index 8a332cf..99f2915 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,9 @@
 LIST OF CHANGES
 ---------------
 
+release 6.29.1
+ - Switch to Perlbrew to obtain multiple Perl versions
+
 release 6.29.0
  - Add plate_number column to the pac_bio_run_well_metrics table and bring
    DBIx classes up to date.
diff --git a/MANIFEST b/MANIFEST
index 54c2788..fed10d7 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,4 +1,3 @@
-.github/workflows/testing_and_building_repo.yml
 Build.PL
 Changes
 lib/WTSI/DNAP/Warehouse/Schema.pm
@@ -43,7 +42,6 @@ lib/WTSI/DNAP/Warehouse/Schema/Result/SamplesExtractionActivity.pm
 lib/WTSI/DNAP/Warehouse/Schema/Result/TolSampleBioproject.pm
 MANIFEST
 README
-scripts/install_npg_perl_dependencies.sh
 t/00-critic.t
 t/00-distribution.t
 t/00-pod.t
diff --git a/scripts/install_npg_perl_dependencies.sh b/scripts/install_npg_perl_dependencies.sh
deleted file mode 100755
index 617f090..0000000
--- a/scripts/install_npg_perl_dependencies.sh
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/bash
-
-set -e -x
-
-WTSI_NPG_GITHUB_URL=$1
-WTSI_NPG_BUILD_BRANCH=$2
-
-eval $(perl -I ~/perl5ext/lib/perl5/ -Mlocal::lib=~/perl5ext)
-cpanm --quiet --notest Module::Build
-
-# WTSI NPG Perl repo dependencies
-repos=""
-for repo in perl-dnap-utilities;
-do
-  cd /tmp
-  # Always clone master when using depth 1 to get current tag
-  git clone --branch master --depth 1 ${WTSI_NPG_GITHUB_URL}/${repo}.git ${repo}.git
-  cd /tmp/${repo}.git
-  # Shift off master to appropriate branch (if possible)
-  git ls-remote --heads --exit-code origin ${WTSI_NPG_BUILD_BRANCH} && git pull origin ${WTSI_NPG_BUILD_BRANCH} && echo "Switched to branch ${WTSI_NPG_BUILD_BRANCH}"
-  repos=$repos" /tmp/${repo}.git"
-done
-
-# Install CPAN dependencies. The src libs are on PERL5LIB because of
-# circular dependencies. The blibs are on PERL5LIB because the package
-# version, which cpanm requires, is inserted at build time. They must
-# be before the libs for cpanm to pick them up in preference.
-
-for repo in $repos
-do
-    export PERL5LIB=$repo/blib/lib:$PERL5LIB:$repo/lib
-done
-
-for repo in $repos
-do
-    cd $repo
-    cpanm  --quiet --notest --installdeps .
-    perl Build.PL
-    ./Build
-done
-
-# Finally, bring any common dependencies up to the latest version and
-# install
-eval $(perl -I ~/perl5ext/lib/perl5/ -Mlocal::lib=~/perl5npg)
-for repo in $repos
-do
-    cd $repo
-    cpanm  --quiet --notest --installdeps .
-    ./Build install
-done
-cd
diff --git a/scripts/install_wsi_dependencies.sh b/scripts/install_wsi_dependencies.sh
new file mode 100755
index 0000000..9d1e506
--- /dev/null
+++ b/scripts/install_wsi_dependencies.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+
+set -e -u -x
+
+WSI_NPG_GITHUB_URL=${WSI_NPG_GITHUB_URL:=https://github.com/wtsi-npg}
+WSI_NPG_BUILD_BRANCH=${WSI_NPG_BUILD_BRANCH:=devel}
+
+# The first argument is the install base for NPG modules, enabling them to be
+# installed independently of CPAN dependencies. E.g. for cases where we want
+# different caching behaviour.
+NPG_ROOT="$1"
+shift
+
+repos=""
+for repo in "$@" ; do
+    cd /tmp
+
+    # Clone deeper than depth 1 to get the tag even if something has been already
+    # committed over the tag
+    git clone --branch master --depth 3 "$WSI_NPG_GITHUB_URL/${repo}.git" "${repo}.git"
+    cd "/tmp/${repo}.git"
+
+    # Shift off master to appropriate branch (if possible)
+    git ls-remote --heads --exit-code origin "$WSI_NPG_BUILD_BRANCH" && \
+	    git pull origin "$WSI_NPG_BUILD_BRANCH" && \
+	    echo "Switched to branch $WSI_NPG_BUILD_BRANCH"
+    repos="$repos /tmp/${repo}.git"
+done
+
+# Install CPAN dependencies. The src libs are on PERL5LIB because of
+# circular dependencies. The blibs are on PERL5LIB because the package
+# version, which cpanm requires, is inserted at build time. They must
+# be before the libs for cpanm to pick them up in preference.
+for repo in $repos
+do
+    export PERL5LIB="$PERL5LIB:$repo/blib/lib:$repo/lib"
+done
+
+for repo in $repos
+do
+    cd "$repo"
+    cpanm --quiet --notest --installdeps .
+    perl Build.PL
+    ./Build
+done
+
+# Finally, bring any common dependencies up to the latest version and
+# install
+for repo in $repos
+do
+    cd "$repo"
+    cpanm --quiet --notest --installdeps .
+    ./Build install --install-base "$NPG_ROOT"
+done