diff --git a/.Rbuildignore b/.Rbuildignore
index 7c1c5baa8f03668a04b8d352020ed07372de4599..acd9e68a9a2e50eff8ef783a77b63bab66e63424 100644
--- a/.Rbuildignore
+++ b/.Rbuildignore
@@ -8,3 +8,4 @@
 ^\.gitlab-ci\.yml$
 ^\.vscode$
 ^Rplots\.pdf$
+^ci$
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 73d31f89ad7f752944b114e78ad61f76eab5b84a..9e8853066de667befb419ffe75a842cb31e97618 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,6 +4,11 @@ stages:
   - regression
   - tests
 
+variables:
+  R_LIBS_USER: "$CI_PROJECT_DIR/ci/lib"
+  CHECK_DIR: "$CI_PROJECT_DIR/ci/logs"
+  BUILD_LOGS_DIR: "$CI_PROJECT_DIR/ci/logs/$CI_PROJECT_NAME.Rcheck"
+
 default:
   before_script:
     - echo "setwd(\"$(pwd)\")" > .Rprofile
@@ -40,17 +45,23 @@ default:
     - Rscript tests/testthat/regression_tests.R dev
     - Rscript tests/testthat/regression_tests.R compare
 
-.check_not_cran:
+.check:
   stage: tests
+  script:
+  - R -e 'devtools::check(check_dir = Sys.getenv("CHECK_DIR"), cran = !as.logical(Sys.getenv("AS_CRAN")))'
+  - R -e 'if (length(devtools::check_failures(path = Sys.getenv("BUILD_LOGS_DIR"), note = FALSE)) > 0) stop()'
+
+.check_not_cran:
   variables:
     NOT_CRAN: "true"
-  script:
-    - R CMD check airGR_*.tar.gz
+    AS_CRAN: "false"
+  extends: .check
 
 .check_as_cran:
-  stage: tests
-  script:
-    - R CMD check --as-cran airGR_*.tar.gz
+  variables:
+    NOT_CRAN: "false"
+    AS_CRAN: "true"
+  extends: .check
 
 update_packages_patched:
   variables:
@@ -156,4 +167,3 @@ check_as_cran_oldrel:
   variables:
     R_VERSION: "oldrel"
   extends: .check_as_cran
-