diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index b1f2160..600f376 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -16,15 +16,17 @@ on: workflow_call: concurrency: - group: check-test-${{ github.event.pull_request.number || github.ref }} + group: check-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: - check-test: + check: name: ${{ vars.CI_IMAGE }} runs-on: ubuntu-latest container: image: ${{ vars.CI_IMAGE }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout project ⬇️ @@ -36,7 +38,7 @@ jobs: - name: Check 📦 run: | options(crayon.enabled = TRUE) - rcmdcheck::rcmdcheck(error_on = "error") + rcmdcheck::rcmdcheck(error_on = "error", args = "--no-tests") shell: Rscript {0} diff --git a/.github/workflows/lintr.yml b/.github/workflows/lintr.yml index 7fb3dec..34d6c75 100644 --- a/.github/workflows/lintr.yml +++ b/.github/workflows/lintr.yml @@ -31,6 +31,8 @@ jobs: runs-on: ubuntu-latest container: image: ${{ vars.CI_IMAGE }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout project ⬇️ @@ -41,7 +43,7 @@ jobs: - name: Import .lintr run: | - wget -O .lintr https://raw.githubusercontent.com/Boehringer-Ingelheim/dv.templates/main/.lintr + wget -O .lintr https://raw.githubusercontent.com/boehringer-ingelheim/dv.templates/main/.lintr - name: Lintr 🔍 run: lintr::lint_package() diff --git a/.github/workflows/pkgdown.yml b/.github/workflows/pkgdown.yml index 8379de9..d377b62 100644 --- a/.github/workflows/pkgdown.yml +++ b/.github/workflows/pkgdown.yml @@ -25,13 +25,21 @@ jobs: runs-on: ubuntu-latest container: image: ${{ vars.CI_IMAGE }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout project ⬇️ uses: actions/checkout@v4 - name: Install package dependencies 📄 - uses: boehringer-ingelheim/dv.templates/.github/actions/dependencies@main + uses: boehringer-ingelheim/dv.templates/.github/actions/dependencies@main + + - name: Get validation results + uses: actions/download-artifact@v4 + with: + name: val_results + path: inst/validation/results - name: Build site 🔧 run: pkgdown::build_site() diff --git a/.github/workflows/roxygen.yml b/.github/workflows/roxygen.yml index a0d0a36..14c6d3d 100644 --- a/.github/workflows/roxygen.yml +++ b/.github/workflows/roxygen.yml @@ -25,6 +25,8 @@ jobs: runs-on: ubuntu-latest container: image: ${{ vars.CI_IMAGE }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout project ⬇️ diff --git a/.github/workflows/shared_ci.yml b/.github/workflows/shared_ci.yml index da38851..56967a9 100644 --- a/.github/workflows/shared_ci.yml +++ b/.github/workflows/shared_ci.yml @@ -5,10 +5,14 @@ on: workflow_call: jobs: - check-test: + check: name: Check 📦 uses: boehringer-ingelheim/dv.templates/.github/workflows/check.yml@main + test: + name: Test 📦 + uses: boehringer-ingelheim/dv.templates/.github/workflows/test.yml@main + lintr: name: Lintr 🔍 uses: boehringer-ingelheim/dv.templates/.github/workflows/lintr.yml@main @@ -26,6 +30,7 @@ jobs: pkgdown: name: Pkgdown 📖 uses: boehringer-ingelheim/dv.templates/.github/workflows/pkgdown.yml@main + needs: test styler: name: Styler 🌐 diff --git a/.github/workflows/styler.yml b/.github/workflows/styler.yml index 9c5b1e9..b6db137 100644 --- a/.github/workflows/styler.yml +++ b/.github/workflows/styler.yml @@ -25,6 +25,8 @@ jobs: runs-on: ubuntu-latest container: image: ${{ vars.CI_IMAGE }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout project ⬇️ diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..23c0c38 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,52 @@ +--- +name: Test 📦 + +on: + pull_request: + types: + - opened + - synchronize + - reopened + - ready_for_review + branches: + - main + push: + branches: + - main + workflow_call: + +concurrency: + group: test-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + test: + name: ${{ vars.CI_IMAGE }} + runs-on: ubuntu-latest + container: + image: ${{ vars.CI_IMAGE }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + + steps: + - name: Checkout project ⬇️ + uses: actions/checkout@v4 + + - name: Checkout Repo Templates + uses: actions/checkout@v4 + with: + ref: include_qc_separate_steps + repository: boehringer-ingelheim/dv.templates + path: templates + + - name: Install package dependencies 📄 + uses: boehringer-ingelheim/dv.templates/.github/actions/dependencies@main + + - name: Test 📦 + run: Rscript templates/scripts/test.R + + - name: Archive validation results + uses: actions/upload-artifact@v4 + with: + name: val_results + path: inst/validation/results diff --git a/scripts/test.R b/scripts/test.R new file mode 100644 index 0000000..79804f9 --- /dev/null +++ b/scripts/test.R @@ -0,0 +1,126 @@ +#! /usr/local/bin/Rscript + +success <- c( + test = FALSE, + valdoc = FALSE +) + +# Getting package information ---- +pkg_name <- read.dcf("DESCRIPTION")[1, "Package"] +pkg_version <- read.dcf("DESCRIPTION")[1, "Version"] + +# Building ---- + +message("############################") +message("###### INSTALLING (S) ######") +message("############################") + +devtools::install(upgrade = FALSE, args = "--install-tests") + +message("############################") +message("###### INSTALLING (F) ######") +message("############################") + +# Testing ---- + +message("##########################") +message("###### TESTING (S) ######") +message("##########################") + +reporter <- testthat::MultiReporter$new( + list( + testthat::ProgressReporter$new(), + testthat::SummaryReporter$new(file = file.path(getwd(), "tests", "test-out.xml")) + ) +) + +test_results <- tibble::as_tibble( + withr::with_envvar( + new = list(CI = TRUE, no_proxy = "127.0.0.1", NOT_CRAN = TRUE, TESTTHAT_CPUS = 1), + code = { + testthat::test_package(pkg_name, reporter, stop_on_failure = FALSE) + } + ) +) + +success[["test"]] <- sum(test_results[["failed"]]) == 0 + +message("##########################") +message("###### TESTING (F) ######") +message("##########################") + +# Validation ---- + +message("#######################################") +message("###### RENDERING VALIDATION (S) ######") +message("#######################################") + +success[["valdoc"]] <- local({ + # This is evaluated inside a local because, otherwise, all the variables created in the chunks of the rendered + # document leak into the environment + + validation_root <- "./inst/validation" + validation_report_rmd <- file.path(validation_root, "val_report.Rmd") + validation_report_html <- "val_report.html" + validation_results <- file.path(validation_root, "results") + val_param_rds <- file.path(validation_results, "val_param.rds") + + stopifnot(dir.exists(validation_root)) + stopifnot(file.exists(validation_report_rmd)) + + stopifnot(dir.exists(validation_results)) + unlink(list.files(validation_results)) + + saveRDS( + list( + package = pkg_name, + tests = test_results, + version = pkg_version + ), + val_param_rds + ) + + rmarkdown::render( + input = validation_report_rmd, + params = list( + package = pkg_name, + tests = test_results, + version = pkg_version + ), + output_dir = validation_results, + output_file = validation_report_html + ) + + # We use one of the leaked variables, created inside the validation report to asses if the validation is succesful or not + VALIDATION_PASSED +}) + + +message("#######################################") +message("###### RENDERING VALIDATION (F) ######") +message("#######################################") + +# Exit ---- +message("##############################") +message("###### BUILD RESULT (S) ######") +message("##############################") + +message(paste("Was", names(success), "successful?\t", success, collapse = "\n")) + +# Write GITHUB ACTIONS summary +github_summary_file <- Sys.getenv("GITHUB_STEP_SUMMARY") +summary <- "# Test Summary" +summary <- c( + summary, + purrr::imap_chr(success, ~ paste(" - ", if (.x) "\U02705" else "\U274C", "\t", .y)) +) + +CON <- file(github_summary_file, "a") +on.exit(close(CON)) +writeLines(summary, CON) + +stopifnot(all(success)) + +message("##############################") +message("###### BUILD RESULT (F) ######") +message("##############################")