From 74abd9a5958df3ebcdfbf77a4b16acc9db3e2e9a Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 18 Sep 2025 10:27:04 +0100 Subject: [PATCH 01/12] Initial version of dsBaseClient test suite workflow --- .../workflows/dsBaseClient_test_suite.yaml | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 .github/workflows/dsBaseClient_test_suite.yaml diff --git a/.github/workflows/dsBaseClient_test_suite.yaml b/.github/workflows/dsBaseClient_test_suite.yaml new file mode 100644 index 00000000..5e24b9bd --- /dev/null +++ b/.github/workflows/dsBaseClient_test_suite.yaml @@ -0,0 +1,64 @@ +################################################################################ +# DataSHIELD GHA test suite - dsBaseClient +# Adapted from `azure-pipelines.yml` by Roberto Villegas-Diaz +# +# Inside the root directory $(Pipeline.Workspace) will be a file tree like: +# /dsBaseClient <- Checked out version of datashield/dsBaseClient +# /dsBaseClient/logs <- Where results of tests and logs are collated +# /testStatus <- Checked out version of datashield/testStatus +# +# As of Jul 2025 this takes ~ 9 mins to run. +################################################################################ +name: dsBaseClient tests' suite + +on: + push: + schedule: + - cron: '0 0 * * 0' # Weekly + - cron: '0 1 * * *' # Nightly + +jobs: + dsBaseClient_test_suite: + runs-on: ubuntu-latest + timeout-minutes: 120 + permissions: + contents: write + + # These should all be constant, except TEST_FILTER. This can be used to test + # subsets of test files in the testthat directory. Options are like: + # '*' <- Run all tests. + # 'asNumericDS*' <- Run all asNumericDS tests, i.e. all the arg, etc. tests. + # '*_smk_*' <- Run all the smoke tests for all functions. + env: + TEST_FILTER: '*' + _r_check_system_clock_: 0 + WORKFLOW_ID: ${{ github.run_id }}-${{ github.run_attempt }} + PROJECT_NAME: dsBase + BRANCH_NAME: ${{ github.ref_name }} + REPO_OWNER: ${{ github.repository_owner }} + R_KEEP_PKG_SOURCE: yes + GITHUB_TOKEN: ${{ github.token || 'placeholder-token' }} + + steps: + - name: Checkout dsBaseClient + uses: actions/checkout@v4 + with: + path: dsBaseClient + + - name: Checkout testStatus + uses: actions/checkout@v4 + with: + repository: ${{ env.REPO_OWNER }}/testStatus + ref: master + path: testStatus + persist-credentials: false + token: ${{ env.GITHUB_TOKEN }} +# env: +# projectName: dsBaseClientClient +# test_filter: '*' +# _r_check_system_clock_: 0 +# +# jobs: +# build_and_run_tests: +# runs-on: ubuntu-24.04 +# timeout-minutes: 360 \ No newline at end of file From 8ec18631ef18f7a78888e10dfc65f8265e0f0062 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 18 Sep 2025 10:29:57 +0100 Subject: [PATCH 02/12] Add steps from the armadillo_azure-pipelines workflow --- .../workflows/dsBaseClient_test_suite.yaml | 53 +++++++++++++++---- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/.github/workflows/dsBaseClient_test_suite.yaml b/.github/workflows/dsBaseClient_test_suite.yaml index 5e24b9bd..d3202815 100644 --- a/.github/workflows/dsBaseClient_test_suite.yaml +++ b/.github/workflows/dsBaseClient_test_suite.yaml @@ -53,12 +53,47 @@ jobs: path: testStatus persist-credentials: false token: ${{ env.GITHUB_TOKEN }} -# env: -# projectName: dsBaseClientClient -# test_filter: '*' -# _r_check_system_clock_: 0 -# -# jobs: -# build_and_run_tests: -# runs-on: ubuntu-24.04 -# timeout-minutes: 360 \ No newline at end of file + + - name: Uninstall default MySQL + run: | + curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add - + sudo service mysql stop || true + sudo apt-get update + sudo apt-get remove --purge mysql-client mysql-server mysql-common -y + sudo apt-get autoremove -y + sudo apt-get autoclean -y + sudo rm -rf /var/lib/mysql/ + + - name: Tweak local R env using .Rprofile + run: echo "options(Ncpus=4)" >> ~/.Rprofile + + - name: Install R and dependencies + run: | + sudo apt-get install --no-install-recommends software-properties-common dirmngr -y + wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc + sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/" + sudo apt-get update -qq + sudo apt-get upgrade -y + sudo apt-get install -qq libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev r-base -y + sudo apt-get install -qq libharfbuzz-dev libfribidi-dev libmagick++-dev xml-twig-tools -y + sudo R -q -e "install.packages(c('devtools','covr','fields','meta','metafor','ggplot2','gridExtra','data.table','DSI','DSOpal','DSLite','MolgenisAuth','MolgenisArmadillo','DSMolgenisArmadillo','DescTools','e1071'), repos='https://cloud.r-project.org')" + sudo R -q -e "devtools::install_github(repo='datashield/dsDangerClient', ref='v6.3.4-dev')" + + - name: Check manual updated + run: | + orig_sum=$(find man -type f | sort -u | xargs cat | md5sum) + R -q -e "devtools::document()" + new_sum=$(find man -type f | sort -u | xargs cat | md5sum) + if [ "$orig_sum" != "$new_sum" ]; then + echo "Your committed man/*.Rd files are out of sync with the R headers." + exit 1 + fi + working-directory: dsBaseClient + continue-on-error: true + + - name: Devtools checks + run: | + R -q -e "devtools::check(args = c('--no-examples', '--no-tests'))" | tee azure-pipelines_check.Rout + grep --quiet "^0 errors" azure-pipelines_check.Rout && grep --quiet " 0 warnings" azure-pipelines_check.Rout && grep --quiet " 0 notes" azure-pipelines_check.Rout + working-directory: dsBaseClient + continue-on-error: true From ba26785e04bc28355fc5e7b3ff9ff38f9d934c9a Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 18 Sep 2025 11:12:11 +0100 Subject: [PATCH 03/12] Remove step to modify .Rprofile file, replace the installation step for R and dependencies and add new steps to deploy armadillo --- .../workflows/dsBaseClient_test_suite.yaml | 59 +++++++++++++++---- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/.github/workflows/dsBaseClient_test_suite.yaml b/.github/workflows/dsBaseClient_test_suite.yaml index d3202815..69df6d25 100644 --- a/.github/workflows/dsBaseClient_test_suite.yaml +++ b/.github/workflows/dsBaseClient_test_suite.yaml @@ -38,6 +38,7 @@ jobs: REPO_OWNER: ${{ github.repository_owner }} R_KEEP_PKG_SOURCE: yes GITHUB_TOKEN: ${{ github.token || 'placeholder-token' }} + BRANCH_NAME: ${{ github.head_ref || github.ref_name }} steps: - name: Checkout dsBaseClient @@ -46,6 +47,7 @@ jobs: path: dsBaseClient - name: Checkout testStatus + if: ${{ github.actor != 'nektos/act' }} # for local deployment only uses: actions/checkout@v4 with: repository: ${{ env.REPO_OWNER }}/testStatus @@ -63,21 +65,32 @@ jobs: sudo apt-get autoremove -y sudo apt-get autoclean -y sudo rm -rf /var/lib/mysql/ + + - uses: r-lib/actions/setup-pandoc@v2 - - name: Tweak local R env using .Rprofile - run: echo "options(Ncpus=4)" >> ~/.Rprofile - - - name: Install R and dependencies + - uses: r-lib/actions/setup-r@v2 + with: + r-version: release + http-user-agent: release + use-public-rspm: true + + - name: Install dsBaseClient dependencies run: | - sudo apt-get install --no-install-recommends software-properties-common dirmngr -y - wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc - sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/" - sudo apt-get update -qq - sudo apt-get upgrade -y - sudo apt-get install -qq libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev r-base -y - sudo apt-get install -qq libharfbuzz-dev libfribidi-dev libmagick++-dev xml-twig-tools -y - sudo R -q -e "install.packages(c('devtools','covr','fields','meta','metafor','ggplot2','gridExtra','data.table','DSI','DSOpal','DSLite','MolgenisAuth','MolgenisArmadillo','DSMolgenisArmadillo','DescTools','e1071'), repos='https://cloud.r-project.org')" - sudo R -q -e "devtools::install_github(repo='datashield/dsDangerClient', ref='v6.3.4-dev')" + sudo Rscript -e "install.packages(c('devtools','covr','fields','meta','metafor','ggplot2','gridExtra','data.table','DSI','DSOpal','DSLite','MolgenisAuth','MolgenisArmadillo','DSMolgenisArmadillo','DescTools','e1071'), repos='https://cloud.r-project.org')" + sudo Rscript -e "devtools::install_github(repo='datashield/dsDangerClient', ref=Sys.getenv('BRANCH_NAME'))" + # R CMD INSTALL ./dsBaseClient + + # - name: Install R and dependencies + # run: | + # sudo apt-get install --no-install-recommends software-properties-common dirmngr -y + # wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc + # sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/" + # sudo apt-get update -qq + # sudo apt-get upgrade -y + # sudo apt-get install -qq libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev r-base -y + # sudo apt-get install -qq libharfbuzz-dev libfribidi-dev libmagick++-dev xml-twig-tools -y + # sudo R -q -e "install.packages(c('devtools','covr','fields','meta','metafor','ggplot2','gridExtra','data.table','DSI','DSOpal','DSLite','MolgenisAuth','MolgenisArmadillo','DSMolgenisArmadillo','DescTools','e1071'), repos='https://cloud.r-project.org')" + # sudo R -q -e "devtools::install_github(repo='datashield/dsDangerClient', ref='v6.3.4-dev')" - name: Check manual updated run: | @@ -97,3 +110,23 @@ jobs: grep --quiet "^0 errors" azure-pipelines_check.Rout && grep --quiet " 0 warnings" azure-pipelines_check.Rout && grep --quiet " 0 notes" azure-pipelines_check.Rout working-directory: dsBaseClient continue-on-error: true + + - name: Start Armadillo docker-compose + run: docker compose -f docker-compose_armadillo.yml up -d --build + working-directory: dsBaseClient + + - name: Install test datasets + run: | + sleep 60 + R -q -f "molgenis_armadillo-upload_testing_datasets.R" + working-directory: dsBaseClient/tests/testthat/data_files + + - name: Install dsBase to Armadillo + run: | + curl -u admin:admin -X GET http://localhost:8080/packages + curl -u admin:admin -H 'Content-Type: multipart/form-data' -F "file=@dsBase_6.3.4-permissive.tar.gz" -X POST http://localhost:8080/install-package + sleep 60 + docker restart dsbaseclient_armadillo_1 + sleep 30 + curl -u admin:admin -X POST http://localhost:8080/whitelist/dsBase + working-directory: dsBaseClient From e3ab449caa2c08f455eaa81c7bd6bce4e3d0aaad Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 18 Sep 2025 11:13:43 +0100 Subject: [PATCH 04/12] Remove duplicated environment variable --- .github/workflows/dsBaseClient_test_suite.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/dsBaseClient_test_suite.yaml b/.github/workflows/dsBaseClient_test_suite.yaml index 69df6d25..50402a42 100644 --- a/.github/workflows/dsBaseClient_test_suite.yaml +++ b/.github/workflows/dsBaseClient_test_suite.yaml @@ -34,11 +34,10 @@ jobs: _r_check_system_clock_: 0 WORKFLOW_ID: ${{ github.run_id }}-${{ github.run_attempt }} PROJECT_NAME: dsBase - BRANCH_NAME: ${{ github.ref_name }} + BRANCH_NAME: ${{ github.head_ref || github.ref_name }} REPO_OWNER: ${{ github.repository_owner }} R_KEEP_PKG_SOURCE: yes GITHUB_TOKEN: ${{ github.token || 'placeholder-token' }} - BRANCH_NAME: ${{ github.head_ref || github.ref_name }} steps: - name: Checkout dsBaseClient From 937802e8fad0113391a2833d1211b2a62cd5b164 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 18 Sep 2025 11:54:11 +0100 Subject: [PATCH 05/12] Swap steps for installating dependencies --- .../workflows/dsBaseClient_test_suite.yaml | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/dsBaseClient_test_suite.yaml b/.github/workflows/dsBaseClient_test_suite.yaml index 50402a42..84334ff3 100644 --- a/.github/workflows/dsBaseClient_test_suite.yaml +++ b/.github/workflows/dsBaseClient_test_suite.yaml @@ -73,23 +73,23 @@ jobs: http-user-agent: release use-public-rspm: true - - name: Install dsBaseClient dependencies - run: | - sudo Rscript -e "install.packages(c('devtools','covr','fields','meta','metafor','ggplot2','gridExtra','data.table','DSI','DSOpal','DSLite','MolgenisAuth','MolgenisArmadillo','DSMolgenisArmadillo','DescTools','e1071'), repos='https://cloud.r-project.org')" - sudo Rscript -e "devtools::install_github(repo='datashield/dsDangerClient', ref=Sys.getenv('BRANCH_NAME'))" - # R CMD INSTALL ./dsBaseClient - - # - name: Install R and dependencies + # - name: Install dsBaseClient dependencies # run: | - # sudo apt-get install --no-install-recommends software-properties-common dirmngr -y - # wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc - # sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/" - # sudo apt-get update -qq - # sudo apt-get upgrade -y - # sudo apt-get install -qq libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev r-base -y - # sudo apt-get install -qq libharfbuzz-dev libfribidi-dev libmagick++-dev xml-twig-tools -y - # sudo R -q -e "install.packages(c('devtools','covr','fields','meta','metafor','ggplot2','gridExtra','data.table','DSI','DSOpal','DSLite','MolgenisAuth','MolgenisArmadillo','DSMolgenisArmadillo','DescTools','e1071'), repos='https://cloud.r-project.org')" - # sudo R -q -e "devtools::install_github(repo='datashield/dsDangerClient', ref='v6.3.4-dev')" + # sudo Rscript -e "install.packages(c('devtools','covr','fields','meta','metafor','ggplot2','gridExtra','data.table','DSI','DSOpal','DSLite','MolgenisAuth','MolgenisArmadillo','DSMolgenisArmadillo','DescTools','e1071'), repos='https://cloud.r-project.org')" + # sudo Rscript -e "devtools::install_github(repo='datashield/dsDangerClient', ref=Sys.getenv('BRANCH_NAME'))" + # # R CMD INSTALL ./dsBaseClient + + - name: Install R and dependencies + run: | + sudo apt-get install --no-install-recommends software-properties-common dirmngr -y + wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc + sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/" + sudo apt-get update -qq + sudo apt-get upgrade -y + sudo apt-get install -qq libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev r-base -y + sudo apt-get install -qq libharfbuzz-dev libfribidi-dev libmagick++-dev xml-twig-tools -y + sudo R -q -e "install.packages(c('devtools','covr','fields','meta','metafor','ggplot2','gridExtra','data.table','DSI','DSOpal','DSLite','MolgenisAuth','MolgenisArmadillo','DSMolgenisArmadillo','DescTools','e1071'), repos='https://cloud.r-project.org')" + sudo R -q -e "devtools::install_github(repo='datashield/dsDangerClient', ref=Sys.getenv('BRANCH_NAME'))" - name: Check manual updated run: | From 013e781f8f45346e9dbb01997b10f86fcf05f6cb Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 18 Sep 2025 12:38:50 +0100 Subject: [PATCH 06/12] Update container's name: dsbaseclient_armadillo_1 >>> dsbaseclient-armadillo-1 --- .github/workflows/dsBaseClient_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBaseClient_test_suite.yaml b/.github/workflows/dsBaseClient_test_suite.yaml index 84334ff3..c7d16500 100644 --- a/.github/workflows/dsBaseClient_test_suite.yaml +++ b/.github/workflows/dsBaseClient_test_suite.yaml @@ -125,7 +125,7 @@ jobs: curl -u admin:admin -X GET http://localhost:8080/packages curl -u admin:admin -H 'Content-Type: multipart/form-data' -F "file=@dsBase_6.3.4-permissive.tar.gz" -X POST http://localhost:8080/install-package sleep 60 - docker restart dsbaseclient_armadillo_1 + docker restart dsbaseclient-armadillo-1 sleep 30 curl -u admin:admin -X POST http://localhost:8080/whitelist/dsBase working-directory: dsBaseClient From d43f31f917ee0522774f4b69736d2f44c08b866f Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 18 Sep 2025 13:28:32 +0100 Subject: [PATCH 07/12] Change default value for TEST_FILTER and add steps to capture results from test suite, parse and push to the testStatus repository --- .../workflows/dsBaseClient_test_suite.yaml | 112 +++++++++++++++++- 1 file changed, 110 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dsBaseClient_test_suite.yaml b/.github/workflows/dsBaseClient_test_suite.yaml index c7d16500..e043b1d1 100644 --- a/.github/workflows/dsBaseClient_test_suite.yaml +++ b/.github/workflows/dsBaseClient_test_suite.yaml @@ -30,10 +30,10 @@ jobs: # 'asNumericDS*' <- Run all asNumericDS tests, i.e. all the arg, etc. tests. # '*_smk_*' <- Run all the smoke tests for all functions. env: - TEST_FILTER: '*' + TEST_FILTER: '_-|datachk-|smk-|arg-|disc-|perf-|smk_expt-|expt-|math-' _r_check_system_clock_: 0 WORKFLOW_ID: ${{ github.run_id }}-${{ github.run_attempt }} - PROJECT_NAME: dsBase + PROJECT_NAME: dsBaseClient BRANCH_NAME: ${{ github.head_ref || github.ref_name }} REPO_OWNER: ${{ github.repository_owner }} R_KEEP_PKG_SOURCE: yes @@ -129,3 +129,111 @@ jobs: sleep 30 curl -u admin:admin -X POST http://localhost:8080/whitelist/dsBase working-directory: dsBaseClient + + - name: Run tests with coverage & JUnit report + run: | + mkdir -p logs + R -q -e "devtools::reload();" + R -q -e ' + write.csv( + covr::coverage_to_list( + covr::package_coverage( + type = c("none"), + code = c('"'"' + output_file <- file("test_console_output.txt"); + sink(output_file); + sink(output_file, type = "message"); + junit_rep <- testthat::JunitReporter$new(file = file.path(getwd(), "test_results.xml")); + progress_rep <- testthat::ProgressReporter$new(max_failures = 999999); + multi_rep <- testthat::MultiReporter$new(reporters = list(progress_rep, junit_rep)); + options("datashield.return_errors" = FALSE, "default_driver" = "ArmadilloDriver"); + testthat::test_package("${{ env.PROJECT_NAME }}", filter = "${{ env.TEST_FILTER }}", reporter = multi_rep, stop_on_failure = FALSE)'"'"' + ) + ) + ), + "coveragelist.csv" + )' + + mv coveragelist.csv logs/ + mv test_* logs/ + working-directory: dsBaseClient + + - name: Check for JUnit errors + run: | + issue_count=$(sed 's/failures="0" errors="0"//' test_results.xml | grep -c errors= || true) + echo "Number of testsuites with issues: $issue_count" + sed 's/failures="0" errors="0"//' test_results.xml | grep errors= > issues.log || true + cat issues.log || true + exit $issue_count + working-directory: dsBaseClient/logs + + - name: Write versions to file + run: | + echo "branch:${{ env.BRANCH_NAME }}" > ${{ env.WORKFLOW_ID }}.txt + echo "os:$(lsb_release -ds)" >> ${{ env.WORKFLOW_ID }}.txt + echo "R:$(R --version | head -n1)" >> ${{ env.WORKFLOW_ID }}.txt + working-directory: dsBaseClient/logs + + - name: Parse results from testthat and covr + run: | + Rscript --verbose --vanilla ../testStatus/source/parse_test_report.R logs/ + working-directory: dsBaseClient + + - name: Commit results to testStatus + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + cd testStatus + + # Reconfigure remote to use GitHub token for authentication + git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ env.REPO_OWNER }}/testStatus.git + git checkout master + git pull origin master + + mkdir -p logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest/ + # clear the latest directory + rm -rf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest/* + + # Copy logs to new logs directory location + cp -rv ../dsBaseClient/logs/* logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + cp -rv ../dsBaseClient/logs/${{ env.WORKFLOW_ID }}.txt logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + + # Create symbolic links + ln -sf ${{ env.WORKFLOW_ID }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST + + R -e 'input_dir <- file.path("../logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"), Sys.getenv("WORKFLOW_ID")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir))' + mv source/test_report.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html + cp -r docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/* docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest + + git add . + git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.WORKFLOW_ID }}" || echo "No changes to commit" + git push origin master + + env: + PROJECT_NAME: ${{ env.PROJECT_NAME }} + BRANCH_NAME: ${{ env.BRANCH_NAME }} + WORKFLOW_ID: ${{ env.WORKFLOW_ID }} + + - name: Dump environment info + run: | + echo -e "\n#############################" + echo -e "ls /: ######################" + ls -al . + echo -e "\n#############################" + echo -e "lscpu: ######################" + lscpu + echo -e "\n#############################" + echo -e "memory: #####################" + free -m + echo -e "\n#############################" + echo -e "env: ########################" + env + echo -e "\n#############################" + echo -e "R sessionInfo(): ############" + R -e 'sessionInfo()' + sudo apt install tree -y + tree . + + \ No newline at end of file From b56370eb3d08fe86b8fa7f93cd0e7a79f0f07101 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 18 Sep 2025 13:31:40 +0100 Subject: [PATCH 08/12] Add step to install additional dependencies, mostly for the processing of test report --- .../workflows/dsBaseClient_test_suite.yaml | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dsBaseClient_test_suite.yaml b/.github/workflows/dsBaseClient_test_suite.yaml index e043b1d1..d8b84870 100644 --- a/.github/workflows/dsBaseClient_test_suite.yaml +++ b/.github/workflows/dsBaseClient_test_suite.yaml @@ -90,7 +90,29 @@ jobs: sudo apt-get install -qq libharfbuzz-dev libfribidi-dev libmagick++-dev xml-twig-tools -y sudo R -q -e "install.packages(c('devtools','covr','fields','meta','metafor','ggplot2','gridExtra','data.table','DSI','DSOpal','DSLite','MolgenisAuth','MolgenisArmadillo','DSMolgenisArmadillo','DescTools','e1071'), repos='https://cloud.r-project.org')" sudo R -q -e "devtools::install_github(repo='datashield/dsDangerClient', ref=Sys.getenv('BRANCH_NAME'))" - + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + dependencies: 'c("Imports")' + extra-packages: | + any::rcmdcheck + cran::devtools + cran::git2r + cran::RCurl + cran::readr + cran::magrittr + cran::xml2 + cran::purrr + cran::dplyr + cran::stringr + cran::tidyr + cran::quarto + cran::knitr + cran::kableExtra + cran::rmarkdown + cran::downlit + needs: check + - name: Check manual updated run: | orig_sum=$(find man -type f | sort -u | xargs cat | md5sum) From 8e6a1abd3a6860bf533063e7b0538eb3328a999a Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 18 Sep 2025 15:07:42 +0100 Subject: [PATCH 09/12] Update step to carry on even when test failures are identified --- .github/workflows/dsBaseClient_test_suite.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dsBaseClient_test_suite.yaml b/.github/workflows/dsBaseClient_test_suite.yaml index d8b84870..95ef4c22 100644 --- a/.github/workflows/dsBaseClient_test_suite.yaml +++ b/.github/workflows/dsBaseClient_test_suite.yaml @@ -186,7 +186,8 @@ jobs: echo "Number of testsuites with issues: $issue_count" sed 's/failures="0" errors="0"//' test_results.xml | grep errors= > issues.log || true cat issues.log || true - exit $issue_count + # continue with workflow even when some tests fail + exit 0 working-directory: dsBaseClient/logs - name: Write versions to file From 5747ede784ca73746ce464fad9d50e9fe01d8e27 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 18 Sep 2025 17:59:58 +0100 Subject: [PATCH 10/12] Replace committing results to testStatus and creating an intermediate artifact instead --- .../workflows/dsBaseClient_test_suite.yaml | 57 +++++++------------ 1 file changed, 20 insertions(+), 37 deletions(-) diff --git a/.github/workflows/dsBaseClient_test_suite.yaml b/.github/workflows/dsBaseClient_test_suite.yaml index 95ef4c22..8c13bc17 100644 --- a/.github/workflows/dsBaseClient_test_suite.yaml +++ b/.github/workflows/dsBaseClient_test_suite.yaml @@ -1,13 +1,13 @@ ################################################################################ # DataSHIELD GHA test suite - dsBaseClient -# Adapted from `azure-pipelines.yml` by Roberto Villegas-Diaz +# Adapted from `armadillo_azure-pipelines.yml` by Roberto Villegas-Diaz # # Inside the root directory $(Pipeline.Workspace) will be a file tree like: # /dsBaseClient <- Checked out version of datashield/dsBaseClient # /dsBaseClient/logs <- Where results of tests and logs are collated -# /testStatus <- Checked out version of datashield/testStatus +# /testStatus <- Checked out version of datashield/testStatus # -# As of Jul 2025 this takes ~ 9 mins to run. +# As of Sept. 2025 this takes ~ 95 mins to run. ################################################################################ name: dsBaseClient tests' suite @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 120 permissions: - contents: write + contents: read # These should all be constant, except TEST_FILTER. This can be used to test # subsets of test files in the testthat directory. Options are like: @@ -72,12 +72,6 @@ jobs: r-version: release http-user-agent: release use-public-rspm: true - - # - name: Install dsBaseClient dependencies - # run: | - # sudo Rscript -e "install.packages(c('devtools','covr','fields','meta','metafor','ggplot2','gridExtra','data.table','DSI','DSOpal','DSLite','MolgenisAuth','MolgenisArmadillo','DSMolgenisArmadillo','DescTools','e1071'), repos='https://cloud.r-project.org')" - # sudo Rscript -e "devtools::install_github(repo='datashield/dsDangerClient', ref=Sys.getenv('BRANCH_NAME'))" - # # R CMD INSTALL ./dsBaseClient - name: Install R and dependencies run: | @@ -201,43 +195,33 @@ jobs: run: | Rscript --verbose --vanilla ../testStatus/source/parse_test_report.R logs/ working-directory: dsBaseClient - - - name: Commit results to testStatus + + - name: Render report run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions[bot]" cd testStatus - # Reconfigure remote to use GitHub token for authentication - git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ env.REPO_OWNER }}/testStatus.git - git checkout master - git pull origin master - - mkdir -p logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ - mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ - mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest/ - # clear the latest directory - rm -rf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest/* + mkdir -p new/logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + mkdir -p new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + mkdir -p new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest/ # Copy logs to new logs directory location - cp -rv ../dsBaseClient/logs/* logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ - cp -rv ../dsBaseClient/logs/${{ env.WORKFLOW_ID }}.txt logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + cp -rv ../dsBase/logs/* new/logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + cp -rv ../dsBase/logs/${{ env.WORKFLOW_ID }}.txt new/logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ - # Create symbolic links - ln -sf ${{ env.WORKFLOW_ID }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST - - R -e 'input_dir <- file.path("../logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"), Sys.getenv("WORKFLOW_ID")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir))' - mv source/test_report.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html - cp -r docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/* docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest - - git add . - git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.WORKFLOW_ID }}" || echo "No changes to commit" - git push origin master + R -e 'input_dir <- file.path("../new/logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"), Sys.getenv("WORKFLOW_ID")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir))' + mv source/test_report.html new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html + cp -r new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/* new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest env: PROJECT_NAME: ${{ env.PROJECT_NAME }} BRANCH_NAME: ${{ env.BRANCH_NAME }} WORKFLOW_ID: ${{ env.WORKFLOW_ID }} + + - name: Upload test logs + uses: actions/upload-artifact@v4 + with: + name: dsbaseclient-logs + path: dsBaseClient/logs/new - name: Dump environment info run: | @@ -258,5 +242,4 @@ jobs: R -e 'sessionInfo()' sudo apt install tree -y tree . - \ No newline at end of file From 73091dc948465f76c3d313b4167885a5a79ebcba Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 18 Sep 2025 19:38:58 +0100 Subject: [PATCH 11/12] Update path to output logs from dsBase to dsBaseClient --- .github/workflows/dsBaseClient_test_suite.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dsBaseClient_test_suite.yaml b/.github/workflows/dsBaseClient_test_suite.yaml index 8c13bc17..ff1bf2c8 100644 --- a/.github/workflows/dsBaseClient_test_suite.yaml +++ b/.github/workflows/dsBaseClient_test_suite.yaml @@ -205,8 +205,8 @@ jobs: mkdir -p new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest/ # Copy logs to new logs directory location - cp -rv ../dsBase/logs/* new/logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ - cp -rv ../dsBase/logs/${{ env.WORKFLOW_ID }}.txt new/logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + cp -rv ../dsBaseClient/logs/* new/logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + cp -rv ../dsBaseClient/logs/${{ env.WORKFLOW_ID }}.txt new/logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ R -e 'input_dir <- file.path("../new/logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"), Sys.getenv("WORKFLOW_ID")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir))' mv source/test_report.html new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html From e1a031032864765aacdb67cbdad7c6deb3b224f0 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 18 Sep 2025 21:21:06 +0100 Subject: [PATCH 12/12] Update path to output files --- .github/workflows/dsBaseClient_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBaseClient_test_suite.yaml b/.github/workflows/dsBaseClient_test_suite.yaml index ff1bf2c8..fb4ed989 100644 --- a/.github/workflows/dsBaseClient_test_suite.yaml +++ b/.github/workflows/dsBaseClient_test_suite.yaml @@ -221,7 +221,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: dsbaseclient-logs - path: dsBaseClient/logs/new + path: testStatus/new - name: Dump environment info run: |