Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .Rbuildignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,3 +25,4 @@
^\.github$
^REFACTOR_GUIDE\.md$
^man-roxygen$
^codecov\.yml$
140 changes: 140 additions & 0 deletions .github/actions/setup-armadillo-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
name: Setup Armadillo with dsBase
description: >
Starts a fresh Armadillo instance via docker-compose, with the "default"
Rock profile as a static sibling container. Installs R and system
dependencies, waits for readiness, uploads test datasets, and installs
dsBase. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Armadillo dsbase shard workflow and the
Armadillo dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-tarball:
description: dsBase tarball filename to install
required: false
default: dsBase_7.0.0-permissive.tar.gz

runs:
using: composite
steps:
- name: Write Armadillo config
shell: bash
run: |
mkdir -p armadillo_home/config

cat > armadillo_home/config/application.yml <<EOF
armadillo:
docker-management-enabled: false
docker-run-in-container: true
profiles:
- name: default
image: datashield/rock_citest-permissive:latest
host: default
port: 8085
package-whitelist:
- dsBase
- dsTidyverse
- resourcer
function-blacklist: [ ]
options:
datashield:
seed: 342325352
spring:
security:
user:
name: admin
password: admin
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
storage:
root-dir: /data
audit.log.path: '/logs/audit.log'
stdout.log.path: '/logs/armadillo.log'
logging:
level:
root: "warn"
org.molgenis: "warn"
EOF
working-directory: dsBaseClient

- name: Start Armadillo docker-compose
shell: bash
run: docker compose -f docker-compose_armadillo.yml up -d
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps
with:
additional-packages: cran::covr

- name: Wait for Armadillo to be ready
shell: bash
run: |
for i in $(seq 1 60); do
if curl -fsS http://localhost:8080/actuator/health 2>/dev/null | grep -q '"status":"UP"'; then
echo "Armadillo is ready"
exit 0
fi
sleep 5
done
echo "Armadillo did not become ready in time"
docker compose -f docker-compose_armadillo.yml logs armadillo || true
exit 1
working-directory: dsBaseClient

- name: Install test datasets to Armadillo
shell: bash
run: R -q -f "molgenis_armadillo-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Armadillo
shell: bash
run: |
installed=false
for i in $(seq 1 30); do
if Rscript -e "
library(MolgenisArmadillo)
armadillo.login_basic('http://localhost:8080', 'admin', 'admin')
armadillo.install_packages('${{ inputs.dsbase-tarball }}', profile = 'default')
"; then
installed=true
break
fi
sleep 10
done
if [ "$installed" != "true" ]; then
echo "dsBase install via armadillo.install_packages() failed (default profile may not have started in time)"
exit 1
fi

expected_version=$(tar -xOzf ${{ inputs.dsbase-tarball }} dsBase/DESCRIPTION | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from ${{ inputs.dsbase-tarball }}"
exit 1
fi
echo "Expected dsBase version: $expected_version"

actual_version=""
for i in $(seq 1 30); do
packages_json=$(curl -sf -u admin:admin -X GET http://localhost:8080/packages || true)
actual_version=$(echo "$packages_json" | jq -r '.[] | select(.name == "dsBase") | .version' 2>/dev/null || true)
if [ "$actual_version" == "$expected_version" ]; then
break
fi
sleep 10
done
echo "Installed dsBase version: $actual_version"
if [ "$actual_version" != "$expected_version" ]; then
echo "dsBase version mismatch: expected $expected_version, found '$actual_version'"
exit 1
fi
echo "$actual_version" > dsbase_version.txt

curl -u admin:admin -X POST http://localhost:8080/whitelist/dsBase
working-directory: dsBaseClient

- name: Dump Armadillo server log
if: failure()
shell: bash
run: docker compose -f docker-compose_armadillo.yml logs armadillo | grep "Caused by:" | sort -u || true
working-directory: dsBaseClient
75 changes: 75 additions & 0 deletions .github/actions/setup-opal-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
name: Setup Opal with dsBase
description: >
Starts a fresh Opal instance via docker-compose, installs R and system
dependencies, uploads test datasets, and installs dsBase with disclosure
test options. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Opal dsbase shard workflow and the Opal
dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-ref:
description: dsBase GitHub ref to install
required: false
default: v7.0-dev

runs:
using: composite
steps:
- name: Start Opal docker-compose
shell: bash
run: docker compose -f docker-compose_opal.yml up -d --build
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps

- name: Install test datasets to Opal
shell: bash
run: |
for i in $(seq 1 18); do
if curl -sf -o /dev/null http://localhost:8080/; then
echo "Opal is responding"
break
fi
sleep 5
done
R -q -f "obiba_opal-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Opal, set disclosure test options
shell: bash
run: |
R -q -e "library(opalr); opal <- opal.login(username = 'administrator', password = 'datashield_test&', url = 'http://localhost:8080/'); opal.put(opal, 'system', 'conf', 'general', '_rPackage'); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator','datashield_test&', url='http://localhost:8080/'); dsadmin.install_github_package(opal, 'dsBase', username = 'datashield', ref = '${{ inputs.dsbase-ref }}'); opal.logout(opal)"

expected_version=$(curl -sf "https://raw.githubusercontent.com/datashield/dsBase/${{ inputs.dsbase-ref }}/DESCRIPTION" | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from GitHub"
exit 1
fi
echo "Expected dsBase version: $expected_version"
echo "$expected_version" > dsbase_version.txt

ok=false
for i in $(seq 1 18); do
if Rscript -e "
library(opalr)
opal <- opal.login('administrator', 'datashield_test&', url = 'http://localhost:8080/')
desc <- dsadmin.package_description(opal, 'dsBase')
opal.logout(opal)
installed <- desc[['Version']]
cat('Installed dsBase version:', if (is.null(installed)) '(none yet)' else installed, '\n')
quit(status = if (!is.null(installed) && installed == '$expected_version') 0 else 1)
"; then
ok=true
break
fi
sleep 10
done
if [ "$ok" != "true" ]; then
echo "dsBase version mismatch or install not detected after polling: expected $expected_version"
exit 1
fi

R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.profile_init(opal, name = 'default', packages = c('dsBase', 'dsTidyverse', 'resourcer')); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.set_option(opal, 'default.datashield.privacyControlLevel', 'permissive'); opal.logout(opal)"
working-directory: dsBaseClient/tests/testthat/data_files
61 changes: 61 additions & 0 deletions .github/actions/setup-r-with-dsbase-deps/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
name: Setup R with dsBaseClient dependencies
description: >
Installs the system libraries, R, and R package dependencies shared by the
Opal and Armadillo setup actions. Assumes the caller has already checked
out dsBaseClient at ./dsBaseClient.

inputs:
additional-packages:
description: Extra pak package specs (one per line) to install beyond the common set
required: false
default: ''

runs:
using: composite
steps:
- name: Install system libraries
shell: bash
env:
SYSTEM_LIBRARIES: >-
libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev
libharfbuzz-dev libfribidi-dev libmagick++-dev libudunits2-dev libuv1-dev
run: |
sudo apt-get update -qq
sudo apt-get install -qq $SYSTEM_LIBRARIES -y

- uses: r-lib/actions/setup-r@v2
with:
r-version: release
http-user-agent: release
use-public-rspm: true

- uses: r-lib/actions/setup-r-dependencies@v2
env:
# RSPM doesn't always have a binary for every package/R-version combo; when it
# falls back to source, pak needs LinkingTo deps present to compile it.
PKG_INCLUDE_LINKINGTO: true
R_PACKAGES: |
cran::devtools
cran::fields
cran::meta
cran::metafor
cran::ggplot2
cran::gridExtra
cran::data.table
cran::DSI
cran::opalr
cran::DSOpal
cran::DSLite
cran::MolgenisAuth
cran::MolgenisArmadillo
cran::DSMolgenisArmadillo
cran::DescTools
cran::e1071
github::datashield/dsDangerClient
with:
working-directory: dsBaseClient
dependencies: 'c("Depends", "Imports", "LinkingTo")'
extra-packages: |
${{ env.R_PACKAGES }}
${{ inputs.additional-packages }}
needs: check
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .Rbuildignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,3 +25,4 @@
^\.github$
^REFACTOR_GUIDE\.md$
^man-roxygen$
^codecov\.yml$
140 changes: 140 additions & 0 deletions .github/actions/setup-armadillo-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
name: Setup Armadillo with dsBase
description: >
Starts a fresh Armadillo instance via docker-compose, with the "default"
Rock profile as a static sibling container. Installs R and system
dependencies, waits for readiness, uploads test datasets, and installs
dsBase. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Armadillo dsbase shard workflow and the
Armadillo dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-tarball:
description: dsBase tarball filename to install
required: false
default: dsBase_7.0.0-permissive.tar.gz

runs:
using: composite
steps:
- name: Write Armadillo config
shell: bash
run: |
mkdir -p armadillo_home/config

cat > armadillo_home/config/application.yml <<EOF
armadillo:
docker-management-enabled: false
docker-run-in-container: true
profiles:
- name: default
image: datashield/rock_citest-permissive:latest
host: default
port: 8085
package-whitelist:
- dsBase
- dsTidyverse
- resourcer
function-blacklist: [ ]
options:
datashield:
seed: 342325352
spring:
security:
user:
name: admin
password: admin
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
storage:
root-dir: /data
audit.log.path: '/logs/audit.log'
stdout.log.path: '/logs/armadillo.log'
logging:
level:
root: "warn"
org.molgenis: "warn"
EOF
working-directory: dsBaseClient

- name: Start Armadillo docker-compose
shell: bash
run: docker compose -f docker-compose_armadillo.yml up -d
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps
with:
additional-packages: cran::covr

- name: Wait for Armadillo to be ready
shell: bash
run: |
for i in $(seq 1 60); do
if curl -fsS http://localhost:8080/actuator/health 2>/dev/null | grep -q '"status":"UP"'; then
echo "Armadillo is ready"
exit 0
fi
sleep 5
done
echo "Armadillo did not become ready in time"
docker compose -f docker-compose_armadillo.yml logs armadillo || true
exit 1
working-directory: dsBaseClient

- name: Install test datasets to Armadillo
shell: bash
run: R -q -f "molgenis_armadillo-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Armadillo
shell: bash
run: |
installed=false
for i in $(seq 1 30); do
if Rscript -e "
library(MolgenisArmadillo)
armadillo.login_basic('http://localhost:8080', 'admin', 'admin')
armadillo.install_packages('${{ inputs.dsbase-tarball }}', profile = 'default')
"; then
installed=true
break
fi
sleep 10
done
if [ "$installed" != "true" ]; then
echo "dsBase install via armadillo.install_packages() failed (default profile may not have started in time)"
exit 1
fi

expected_version=$(tar -xOzf ${{ inputs.dsbase-tarball }} dsBase/DESCRIPTION | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from ${{ inputs.dsbase-tarball }}"
exit 1
fi
echo "Expected dsBase version: $expected_version"

actual_version=""
for i in $(seq 1 30); do
packages_json=$(curl -sf -u admin:admin -X GET http://localhost:8080/packages || true)
actual_version=$(echo "$packages_json" | jq -r '.[] | select(.name == "dsBase") | .version' 2>/dev/null || true)
if [ "$actual_version" == "$expected_version" ]; then
break
fi
sleep 10
done
echo "Installed dsBase version: $actual_version"
if [ "$actual_version" != "$expected_version" ]; then
echo "dsBase version mismatch: expected $expected_version, found '$actual_version'"
exit 1
fi
echo "$actual_version" > dsbase_version.txt

curl -u admin:admin -X POST http://localhost:8080/whitelist/dsBase
working-directory: dsBaseClient

- name: Dump Armadillo server log
if: failure()
shell: bash
run: docker compose -f docker-compose_armadillo.yml logs armadillo | grep "Caused by:" | sort -u || true
working-directory: dsBaseClient
75 changes: 75 additions & 0 deletions .github/actions/setup-opal-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
name: Setup Opal with dsBase
description: >
Starts a fresh Opal instance via docker-compose, installs R and system
dependencies, uploads test datasets, and installs dsBase with disclosure
test options. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Opal dsbase shard workflow and the Opal
dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-ref:
description: dsBase GitHub ref to install
required: false
default: v7.0-dev

runs:
using: composite
steps:
- name: Start Opal docker-compose
shell: bash
run: docker compose -f docker-compose_opal.yml up -d --build
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps

- name: Install test datasets to Opal
shell: bash
run: |
for i in $(seq 1 18); do
if curl -sf -o /dev/null http://localhost:8080/; then
echo "Opal is responding"
break
fi
sleep 5
done
R -q -f "obiba_opal-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Opal, set disclosure test options
shell: bash
run: |
R -q -e "library(opalr); opal <- opal.login(username = 'administrator', password = 'datashield_test&', url = 'http://localhost:8080/'); opal.put(opal, 'system', 'conf', 'general', '_rPackage'); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator','datashield_test&', url='http://localhost:8080/'); dsadmin.install_github_package(opal, 'dsBase', username = 'datashield', ref = '${{ inputs.dsbase-ref }}'); opal.logout(opal)"

expected_version=$(curl -sf "https://raw.githubusercontent.com/datashield/dsBase/${{ inputs.dsbase-ref }}/DESCRIPTION" | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from GitHub"
exit 1
fi
echo "Expected dsBase version: $expected_version"
echo "$expected_version" > dsbase_version.txt

ok=false
for i in $(seq 1 18); do
if Rscript -e "
library(opalr)
opal <- opal.login('administrator', 'datashield_test&', url = 'http://localhost:8080/')
desc <- dsadmin.package_description(opal, 'dsBase')
opal.logout(opal)
installed <- desc[['Version']]
cat('Installed dsBase version:', if (is.null(installed)) '(none yet)' else installed, '\n')
quit(status = if (!is.null(installed) && installed == '$expected_version') 0 else 1)
"; then
ok=true
break
fi
sleep 10
done
if [ "$ok" != "true" ]; then
echo "dsBase version mismatch or install not detected after polling: expected $expected_version"
exit 1
fi

R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.profile_init(opal, name = 'default', packages = c('dsBase', 'dsTidyverse', 'resourcer')); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.set_option(opal, 'default.datashield.privacyControlLevel', 'permissive'); opal.logout(opal)"
working-directory: dsBaseClient/tests/testthat/data_files
61 changes: 61 additions & 0 deletions .github/actions/setup-r-with-dsbase-deps/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
name: Setup R with dsBaseClient dependencies
description: >
Installs the system libraries, R, and R package dependencies shared by the
Opal and Armadillo setup actions. Assumes the caller has already checked
out dsBaseClient at ./dsBaseClient.

inputs:
additional-packages:
description: Extra pak package specs (one per line) to install beyond the common set
required: false
default: ''

runs:
using: composite
steps:
- name: Install system libraries
shell: bash
env:
SYSTEM_LIBRARIES: >-
libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev
libharfbuzz-dev libfribidi-dev libmagick++-dev libudunits2-dev libuv1-dev
run: |
sudo apt-get update -qq
sudo apt-get install -qq $SYSTEM_LIBRARIES -y

- uses: r-lib/actions/setup-r@v2
with:
r-version: release
http-user-agent: release
use-public-rspm: true

- uses: r-lib/actions/setup-r-dependencies@v2
env:
# RSPM doesn't always have a binary for every package/R-version combo; when it
# falls back to source, pak needs LinkingTo deps present to compile it.
PKG_INCLUDE_LINKINGTO: true
R_PACKAGES: |
cran::devtools
cran::fields
cran::meta
cran::metafor
cran::ggplot2
cran::gridExtra
cran::data.table
cran::DSI
cran::opalr
cran::DSOpal
cran::DSLite
cran::MolgenisAuth
cran::MolgenisArmadillo
cran::DSMolgenisArmadillo
cran::DescTools
cran::e1071
github::datashield/dsDangerClient
with:
working-directory: dsBaseClient
dependencies: 'c("Depends", "Imports", "LinkingTo")'
extra-packages: |
${{ env.R_PACKAGES }}
${{ inputs.additional-packages }}
needs: check
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .Rbuildignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,3 +25,4 @@
^\.github$
^REFACTOR_GUIDE\.md$
^man-roxygen$
^codecov\.yml$
140 changes: 140 additions & 0 deletions .github/actions/setup-armadillo-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
name: Setup Armadillo with dsBase
description: >
Starts a fresh Armadillo instance via docker-compose, with the "default"
Rock profile as a static sibling container. Installs R and system
dependencies, waits for readiness, uploads test datasets, and installs
dsBase. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Armadillo dsbase shard workflow and the
Armadillo dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-tarball:
description: dsBase tarball filename to install
required: false
default: dsBase_7.0.0-permissive.tar.gz

runs:
using: composite
steps:
- name: Write Armadillo config
shell: bash
run: |
mkdir -p armadillo_home/config

cat > armadillo_home/config/application.yml <<EOF
armadillo:
docker-management-enabled: false
docker-run-in-container: true
profiles:
- name: default
image: datashield/rock_citest-permissive:latest
host: default
port: 8085
package-whitelist:
- dsBase
- dsTidyverse
- resourcer
function-blacklist: [ ]
options:
datashield:
seed: 342325352
spring:
security:
user:
name: admin
password: admin
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
storage:
root-dir: /data
audit.log.path: '/logs/audit.log'
stdout.log.path: '/logs/armadillo.log'
logging:
level:
root: "warn"
org.molgenis: "warn"
EOF
working-directory: dsBaseClient

- name: Start Armadillo docker-compose
shell: bash
run: docker compose -f docker-compose_armadillo.yml up -d
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps
with:
additional-packages: cran::covr

- name: Wait for Armadillo to be ready
shell: bash
run: |
for i in $(seq 1 60); do
if curl -fsS http://localhost:8080/actuator/health 2>/dev/null | grep -q '"status":"UP"'; then
echo "Armadillo is ready"
exit 0
fi
sleep 5
done
echo "Armadillo did not become ready in time"
docker compose -f docker-compose_armadillo.yml logs armadillo || true
exit 1
working-directory: dsBaseClient

- name: Install test datasets to Armadillo
shell: bash
run: R -q -f "molgenis_armadillo-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Armadillo
shell: bash
run: |
installed=false
for i in $(seq 1 30); do
if Rscript -e "
library(MolgenisArmadillo)
armadillo.login_basic('http://localhost:8080', 'admin', 'admin')
armadillo.install_packages('${{ inputs.dsbase-tarball }}', profile = 'default')
"; then
installed=true
break
fi
sleep 10
done
if [ "$installed" != "true" ]; then
echo "dsBase install via armadillo.install_packages() failed (default profile may not have started in time)"
exit 1
fi

expected_version=$(tar -xOzf ${{ inputs.dsbase-tarball }} dsBase/DESCRIPTION | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from ${{ inputs.dsbase-tarball }}"
exit 1
fi
echo "Expected dsBase version: $expected_version"

actual_version=""
for i in $(seq 1 30); do
packages_json=$(curl -sf -u admin:admin -X GET http://localhost:8080/packages || true)
actual_version=$(echo "$packages_json" | jq -r '.[] | select(.name == "dsBase") | .version' 2>/dev/null || true)
if [ "$actual_version" == "$expected_version" ]; then
break
fi
sleep 10
done
echo "Installed dsBase version: $actual_version"
if [ "$actual_version" != "$expected_version" ]; then
echo "dsBase version mismatch: expected $expected_version, found '$actual_version'"
exit 1
fi
echo "$actual_version" > dsbase_version.txt

curl -u admin:admin -X POST http://localhost:8080/whitelist/dsBase
working-directory: dsBaseClient

- name: Dump Armadillo server log
if: failure()
shell: bash
run: docker compose -f docker-compose_armadillo.yml logs armadillo | grep "Caused by:" | sort -u || true
working-directory: dsBaseClient
75 changes: 75 additions & 0 deletions .github/actions/setup-opal-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
name: Setup Opal with dsBase
description: >
Starts a fresh Opal instance via docker-compose, installs R and system
dependencies, uploads test datasets, and installs dsBase with disclosure
test options. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Opal dsbase shard workflow and the Opal
dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-ref:
description: dsBase GitHub ref to install
required: false
default: v7.0-dev

runs:
using: composite
steps:
- name: Start Opal docker-compose
shell: bash
run: docker compose -f docker-compose_opal.yml up -d --build
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps

- name: Install test datasets to Opal
shell: bash
run: |
for i in $(seq 1 18); do
if curl -sf -o /dev/null http://localhost:8080/; then
echo "Opal is responding"
break
fi
sleep 5
done
R -q -f "obiba_opal-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Opal, set disclosure test options
shell: bash
run: |
R -q -e "library(opalr); opal <- opal.login(username = 'administrator', password = 'datashield_test&', url = 'http://localhost:8080/'); opal.put(opal, 'system', 'conf', 'general', '_rPackage'); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator','datashield_test&', url='http://localhost:8080/'); dsadmin.install_github_package(opal, 'dsBase', username = 'datashield', ref = '${{ inputs.dsbase-ref }}'); opal.logout(opal)"

expected_version=$(curl -sf "https://raw.githubusercontent.com/datashield/dsBase/${{ inputs.dsbase-ref }}/DESCRIPTION" | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from GitHub"
exit 1
fi
echo "Expected dsBase version: $expected_version"
echo "$expected_version" > dsbase_version.txt

ok=false
for i in $(seq 1 18); do
if Rscript -e "
library(opalr)
opal <- opal.login('administrator', 'datashield_test&', url = 'http://localhost:8080/')
desc <- dsadmin.package_description(opal, 'dsBase')
opal.logout(opal)
installed <- desc[['Version']]
cat('Installed dsBase version:', if (is.null(installed)) '(none yet)' else installed, '\n')
quit(status = if (!is.null(installed) && installed == '$expected_version') 0 else 1)
"; then
ok=true
break
fi
sleep 10
done
if [ "$ok" != "true" ]; then
echo "dsBase version mismatch or install not detected after polling: expected $expected_version"
exit 1
fi

R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.profile_init(opal, name = 'default', packages = c('dsBase', 'dsTidyverse', 'resourcer')); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.set_option(opal, 'default.datashield.privacyControlLevel', 'permissive'); opal.logout(opal)"
working-directory: dsBaseClient/tests/testthat/data_files
61 changes: 61 additions & 0 deletions .github/actions/setup-r-with-dsbase-deps/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
name: Setup R with dsBaseClient dependencies
description: >
Installs the system libraries, R, and R package dependencies shared by the
Opal and Armadillo setup actions. Assumes the caller has already checked
out dsBaseClient at ./dsBaseClient.

inputs:
additional-packages:
description: Extra pak package specs (one per line) to install beyond the common set
required: false
default: ''

runs:
using: composite
steps:
- name: Install system libraries
shell: bash
env:
SYSTEM_LIBRARIES: >-
libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev
libharfbuzz-dev libfribidi-dev libmagick++-dev libudunits2-dev libuv1-dev
run: |
sudo apt-get update -qq
sudo apt-get install -qq $SYSTEM_LIBRARIES -y

- uses: r-lib/actions/setup-r@v2
with:
r-version: release
http-user-agent: release
use-public-rspm: true

- uses: r-lib/actions/setup-r-dependencies@v2
env:
# RSPM doesn't always have a binary for every package/R-version combo; when it
# falls back to source, pak needs LinkingTo deps present to compile it.
PKG_INCLUDE_LINKINGTO: true
R_PACKAGES: |
cran::devtools
cran::fields
cran::meta
cran::metafor
cran::ggplot2
cran::gridExtra
cran::data.table
cran::DSI
cran::opalr
cran::DSOpal
cran::DSLite
cran::MolgenisAuth
cran::MolgenisArmadillo
cran::DSMolgenisArmadillo
cran::DescTools
cran::e1071
github::datashield/dsDangerClient
with:
working-directory: dsBaseClient
dependencies: 'c("Depends", "Imports", "LinkingTo")'
extra-packages: |
${{ env.R_PACKAGES }}
${{ inputs.additional-packages }}
needs: check
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .Rbuildignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,3 +25,4 @@
^\.github$
^REFACTOR_GUIDE\.md$
^man-roxygen$
^codecov\.yml$
140 changes: 140 additions & 0 deletions .github/actions/setup-armadillo-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
name: Setup Armadillo with dsBase
description: >
Starts a fresh Armadillo instance via docker-compose, with the "default"
Rock profile as a static sibling container. Installs R and system
dependencies, waits for readiness, uploads test datasets, and installs
dsBase. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Armadillo dsbase shard workflow and the
Armadillo dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-tarball:
description: dsBase tarball filename to install
required: false
default: dsBase_7.0.0-permissive.tar.gz

runs:
using: composite
steps:
- name: Write Armadillo config
shell: bash
run: |
mkdir -p armadillo_home/config

cat > armadillo_home/config/application.yml <<EOF
armadillo:
docker-management-enabled: false
docker-run-in-container: true
profiles:
- name: default
image: datashield/rock_citest-permissive:latest
host: default
port: 8085
package-whitelist:
- dsBase
- dsTidyverse
- resourcer
function-blacklist: [ ]
options:
datashield:
seed: 342325352
spring:
security:
user:
name: admin
password: admin
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
storage:
root-dir: /data
audit.log.path: '/logs/audit.log'
stdout.log.path: '/logs/armadillo.log'
logging:
level:
root: "warn"
org.molgenis: "warn"
EOF
working-directory: dsBaseClient

- name: Start Armadillo docker-compose
shell: bash
run: docker compose -f docker-compose_armadillo.yml up -d
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps
with:
additional-packages: cran::covr

- name: Wait for Armadillo to be ready
shell: bash
run: |
for i in $(seq 1 60); do
if curl -fsS http://localhost:8080/actuator/health 2>/dev/null | grep -q '"status":"UP"'; then
echo "Armadillo is ready"
exit 0
fi
sleep 5
done
echo "Armadillo did not become ready in time"
docker compose -f docker-compose_armadillo.yml logs armadillo || true
exit 1
working-directory: dsBaseClient

- name: Install test datasets to Armadillo
shell: bash
run: R -q -f "molgenis_armadillo-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Armadillo
shell: bash
run: |
installed=false
for i in $(seq 1 30); do
if Rscript -e "
library(MolgenisArmadillo)
armadillo.login_basic('http://localhost:8080', 'admin', 'admin')
armadillo.install_packages('${{ inputs.dsbase-tarball }}', profile = 'default')
"; then
installed=true
break
fi
sleep 10
done
if [ "$installed" != "true" ]; then
echo "dsBase install via armadillo.install_packages() failed (default profile may not have started in time)"
exit 1
fi

expected_version=$(tar -xOzf ${{ inputs.dsbase-tarball }} dsBase/DESCRIPTION | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from ${{ inputs.dsbase-tarball }}"
exit 1
fi
echo "Expected dsBase version: $expected_version"

actual_version=""
for i in $(seq 1 30); do
packages_json=$(curl -sf -u admin:admin -X GET http://localhost:8080/packages || true)
actual_version=$(echo "$packages_json" | jq -r '.[] | select(.name == "dsBase") | .version' 2>/dev/null || true)
if [ "$actual_version" == "$expected_version" ]; then
break
fi
sleep 10
done
echo "Installed dsBase version: $actual_version"
if [ "$actual_version" != "$expected_version" ]; then
echo "dsBase version mismatch: expected $expected_version, found '$actual_version'"
exit 1
fi
echo "$actual_version" > dsbase_version.txt

curl -u admin:admin -X POST http://localhost:8080/whitelist/dsBase
working-directory: dsBaseClient

- name: Dump Armadillo server log
if: failure()
shell: bash
run: docker compose -f docker-compose_armadillo.yml logs armadillo | grep "Caused by:" | sort -u || true
working-directory: dsBaseClient
75 changes: 75 additions & 0 deletions .github/actions/setup-opal-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
name: Setup Opal with dsBase
description: >
Starts a fresh Opal instance via docker-compose, installs R and system
dependencies, uploads test datasets, and installs dsBase with disclosure
test options. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Opal dsbase shard workflow and the Opal
dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-ref:
description: dsBase GitHub ref to install
required: false
default: v7.0-dev

runs:
using: composite
steps:
- name: Start Opal docker-compose
shell: bash
run: docker compose -f docker-compose_opal.yml up -d --build
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps

- name: Install test datasets to Opal
shell: bash
run: |
for i in $(seq 1 18); do
if curl -sf -o /dev/null http://localhost:8080/; then
echo "Opal is responding"
break
fi
sleep 5
done
R -q -f "obiba_opal-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Opal, set disclosure test options
shell: bash
run: |
R -q -e "library(opalr); opal <- opal.login(username = 'administrator', password = 'datashield_test&', url = 'http://localhost:8080/'); opal.put(opal, 'system', 'conf', 'general', '_rPackage'); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator','datashield_test&', url='http://localhost:8080/'); dsadmin.install_github_package(opal, 'dsBase', username = 'datashield', ref = '${{ inputs.dsbase-ref }}'); opal.logout(opal)"

expected_version=$(curl -sf "https://raw.githubusercontent.com/datashield/dsBase/${{ inputs.dsbase-ref }}/DESCRIPTION" | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from GitHub"
exit 1
fi
echo "Expected dsBase version: $expected_version"
echo "$expected_version" > dsbase_version.txt

ok=false
for i in $(seq 1 18); do
if Rscript -e "
library(opalr)
opal <- opal.login('administrator', 'datashield_test&', url = 'http://localhost:8080/')
desc <- dsadmin.package_description(opal, 'dsBase')
opal.logout(opal)
installed <- desc[['Version']]
cat('Installed dsBase version:', if (is.null(installed)) '(none yet)' else installed, '\n')
quit(status = if (!is.null(installed) && installed == '$expected_version') 0 else 1)
"; then
ok=true
break
fi
sleep 10
done
if [ "$ok" != "true" ]; then
echo "dsBase version mismatch or install not detected after polling: expected $expected_version"
exit 1
fi

R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.profile_init(opal, name = 'default', packages = c('dsBase', 'dsTidyverse', 'resourcer')); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.set_option(opal, 'default.datashield.privacyControlLevel', 'permissive'); opal.logout(opal)"
working-directory: dsBaseClient/tests/testthat/data_files
61 changes: 61 additions & 0 deletions .github/actions/setup-r-with-dsbase-deps/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
name: Setup R with dsBaseClient dependencies
description: >
Installs the system libraries, R, and R package dependencies shared by the
Opal and Armadillo setup actions. Assumes the caller has already checked
out dsBaseClient at ./dsBaseClient.

inputs:
additional-packages:
description: Extra pak package specs (one per line) to install beyond the common set
required: false
default: ''

runs:
using: composite
steps:
- name: Install system libraries
shell: bash
env:
SYSTEM_LIBRARIES: >-
libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev
libharfbuzz-dev libfribidi-dev libmagick++-dev libudunits2-dev libuv1-dev
run: |
sudo apt-get update -qq
sudo apt-get install -qq $SYSTEM_LIBRARIES -y

- uses: r-lib/actions/setup-r@v2
with:
r-version: release
http-user-agent: release
use-public-rspm: true

- uses: r-lib/actions/setup-r-dependencies@v2
env:
# RSPM doesn't always have a binary for every package/R-version combo; when it
# falls back to source, pak needs LinkingTo deps present to compile it.
PKG_INCLUDE_LINKINGTO: true
R_PACKAGES: |
cran::devtools
cran::fields
cran::meta
cran::metafor
cran::ggplot2
cran::gridExtra
cran::data.table
cran::DSI
cran::opalr
cran::DSOpal
cran::DSLite
cran::MolgenisAuth
cran::MolgenisArmadillo
cran::DSMolgenisArmadillo
cran::DescTools
cran::e1071
github::datashield/dsDangerClient
with:
working-directory: dsBaseClient
dependencies: 'c("Depends", "Imports", "LinkingTo")'
extra-packages: |
${{ env.R_PACKAGES }}
${{ inputs.additional-packages }}
needs: check
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .Rbuildignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,3 +25,4 @@
^\.github$
^REFACTOR_GUIDE\.md$
^man-roxygen$
^codecov\.yml$
140 changes: 140 additions & 0 deletions .github/actions/setup-armadillo-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
name: Setup Armadillo with dsBase
description: >
Starts a fresh Armadillo instance via docker-compose, with the "default"
Rock profile as a static sibling container. Installs R and system
dependencies, waits for readiness, uploads test datasets, and installs
dsBase. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Armadillo dsbase shard workflow and the
Armadillo dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-tarball:
description: dsBase tarball filename to install
required: false
default: dsBase_7.0.0-permissive.tar.gz

runs:
using: composite
steps:
- name: Write Armadillo config
shell: bash
run: |
mkdir -p armadillo_home/config

cat > armadillo_home/config/application.yml <<EOF
armadillo:
docker-management-enabled: false
docker-run-in-container: true
profiles:
- name: default
image: datashield/rock_citest-permissive:latest
host: default
port: 8085
package-whitelist:
- dsBase
- dsTidyverse
- resourcer
function-blacklist: [ ]
options:
datashield:
seed: 342325352
spring:
security:
user:
name: admin
password: admin
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
storage:
root-dir: /data
audit.log.path: '/logs/audit.log'
stdout.log.path: '/logs/armadillo.log'
logging:
level:
root: "warn"
org.molgenis: "warn"
EOF
working-directory: dsBaseClient

- name: Start Armadillo docker-compose
shell: bash
run: docker compose -f docker-compose_armadillo.yml up -d
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps
with:
additional-packages: cran::covr

- name: Wait for Armadillo to be ready
shell: bash
run: |
for i in $(seq 1 60); do
if curl -fsS http://localhost:8080/actuator/health 2>/dev/null | grep -q '"status":"UP"'; then
echo "Armadillo is ready"
exit 0
fi
sleep 5
done
echo "Armadillo did not become ready in time"
docker compose -f docker-compose_armadillo.yml logs armadillo || true
exit 1
working-directory: dsBaseClient

- name: Install test datasets to Armadillo
shell: bash
run: R -q -f "molgenis_armadillo-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Armadillo
shell: bash
run: |
installed=false
for i in $(seq 1 30); do
if Rscript -e "
library(MolgenisArmadillo)
armadillo.login_basic('http://localhost:8080', 'admin', 'admin')
armadillo.install_packages('${{ inputs.dsbase-tarball }}', profile = 'default')
"; then
installed=true
break
fi
sleep 10
done
if [ "$installed" != "true" ]; then
echo "dsBase install via armadillo.install_packages() failed (default profile may not have started in time)"
exit 1
fi

expected_version=$(tar -xOzf ${{ inputs.dsbase-tarball }} dsBase/DESCRIPTION | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from ${{ inputs.dsbase-tarball }}"
exit 1
fi
echo "Expected dsBase version: $expected_version"

actual_version=""
for i in $(seq 1 30); do
packages_json=$(curl -sf -u admin:admin -X GET http://localhost:8080/packages || true)
actual_version=$(echo "$packages_json" | jq -r '.[] | select(.name == "dsBase") | .version' 2>/dev/null || true)
if [ "$actual_version" == "$expected_version" ]; then
break
fi
sleep 10
done
echo "Installed dsBase version: $actual_version"
if [ "$actual_version" != "$expected_version" ]; then
echo "dsBase version mismatch: expected $expected_version, found '$actual_version'"
exit 1
fi
echo "$actual_version" > dsbase_version.txt

curl -u admin:admin -X POST http://localhost:8080/whitelist/dsBase
working-directory: dsBaseClient

- name: Dump Armadillo server log
if: failure()
shell: bash
run: docker compose -f docker-compose_armadillo.yml logs armadillo | grep "Caused by:" | sort -u || true
working-directory: dsBaseClient
75 changes: 75 additions & 0 deletions .github/actions/setup-opal-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
name: Setup Opal with dsBase
description: >
Starts a fresh Opal instance via docker-compose, installs R and system
dependencies, uploads test datasets, and installs dsBase with disclosure
test options. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Opal dsbase shard workflow and the Opal
dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-ref:
description: dsBase GitHub ref to install
required: false
default: v7.0-dev

runs:
using: composite
steps:
- name: Start Opal docker-compose
shell: bash
run: docker compose -f docker-compose_opal.yml up -d --build
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps

- name: Install test datasets to Opal
shell: bash
run: |
for i in $(seq 1 18); do
if curl -sf -o /dev/null http://localhost:8080/; then
echo "Opal is responding"
break
fi
sleep 5
done
R -q -f "obiba_opal-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Opal, set disclosure test options
shell: bash
run: |
R -q -e "library(opalr); opal <- opal.login(username = 'administrator', password = 'datashield_test&', url = 'http://localhost:8080/'); opal.put(opal, 'system', 'conf', 'general', '_rPackage'); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator','datashield_test&', url='http://localhost:8080/'); dsadmin.install_github_package(opal, 'dsBase', username = 'datashield', ref = '${{ inputs.dsbase-ref }}'); opal.logout(opal)"

expected_version=$(curl -sf "https://raw.githubusercontent.com/datashield/dsBase/${{ inputs.dsbase-ref }}/DESCRIPTION" | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from GitHub"
exit 1
fi
echo "Expected dsBase version: $expected_version"
echo "$expected_version" > dsbase_version.txt

ok=false
for i in $(seq 1 18); do
if Rscript -e "
library(opalr)
opal <- opal.login('administrator', 'datashield_test&', url = 'http://localhost:8080/')
desc <- dsadmin.package_description(opal, 'dsBase')
opal.logout(opal)
installed <- desc[['Version']]
cat('Installed dsBase version:', if (is.null(installed)) '(none yet)' else installed, '\n')
quit(status = if (!is.null(installed) && installed == '$expected_version') 0 else 1)
"; then
ok=true
break
fi
sleep 10
done
if [ "$ok" != "true" ]; then
echo "dsBase version mismatch or install not detected after polling: expected $expected_version"
exit 1
fi

R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.profile_init(opal, name = 'default', packages = c('dsBase', 'dsTidyverse', 'resourcer')); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.set_option(opal, 'default.datashield.privacyControlLevel', 'permissive'); opal.logout(opal)"
working-directory: dsBaseClient/tests/testthat/data_files
61 changes: 61 additions & 0 deletions .github/actions/setup-r-with-dsbase-deps/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
name: Setup R with dsBaseClient dependencies
description: >
Installs the system libraries, R, and R package dependencies shared by the
Opal and Armadillo setup actions. Assumes the caller has already checked
out dsBaseClient at ./dsBaseClient.

inputs:
additional-packages:
description: Extra pak package specs (one per line) to install beyond the common set
required: false
default: ''

runs:
using: composite
steps:
- name: Install system libraries
shell: bash
env:
SYSTEM_LIBRARIES: >-
libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev
libharfbuzz-dev libfribidi-dev libmagick++-dev libudunits2-dev libuv1-dev
run: |
sudo apt-get update -qq
sudo apt-get install -qq $SYSTEM_LIBRARIES -y

- uses: r-lib/actions/setup-r@v2
with:
r-version: release
http-user-agent: release
use-public-rspm: true

- uses: r-lib/actions/setup-r-dependencies@v2
env:
# RSPM doesn't always have a binary for every package/R-version combo; when it
# falls back to source, pak needs LinkingTo deps present to compile it.
PKG_INCLUDE_LINKINGTO: true
R_PACKAGES: |
cran::devtools
cran::fields
cran::meta
cran::metafor
cran::ggplot2
cran::gridExtra
cran::data.table
cran::DSI
cran::opalr
cran::DSOpal
cran::DSLite
cran::MolgenisAuth
cran::MolgenisArmadillo
cran::DSMolgenisArmadillo
cran::DescTools
cran::e1071
github::datashield/dsDangerClient
with:
working-directory: dsBaseClient
dependencies: 'c("Depends", "Imports", "LinkingTo")'
extra-packages: |
${{ env.R_PACKAGES }}
${{ inputs.additional-packages }}
needs: check
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .Rbuildignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,3 +25,4 @@
^\.github$
^REFACTOR_GUIDE\.md$
^man-roxygen$
^codecov\.yml$
140 changes: 140 additions & 0 deletions .github/actions/setup-armadillo-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
name: Setup Armadillo with dsBase
description: >
Starts a fresh Armadillo instance via docker-compose, with the "default"
Rock profile as a static sibling container. Installs R and system
dependencies, waits for readiness, uploads test datasets, and installs
dsBase. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Armadillo dsbase shard workflow and the
Armadillo dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-tarball:
description: dsBase tarball filename to install
required: false
default: dsBase_7.0.0-permissive.tar.gz

runs:
using: composite
steps:
- name: Write Armadillo config
shell: bash
run: |
mkdir -p armadillo_home/config

cat > armadillo_home/config/application.yml <<EOF
armadillo:
docker-management-enabled: false
docker-run-in-container: true
profiles:
- name: default
image: datashield/rock_citest-permissive:latest
host: default
port: 8085
package-whitelist:
- dsBase
- dsTidyverse
- resourcer
function-blacklist: [ ]
options:
datashield:
seed: 342325352
spring:
security:
user:
name: admin
password: admin
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
storage:
root-dir: /data
audit.log.path: '/logs/audit.log'
stdout.log.path: '/logs/armadillo.log'
logging:
level:
root: "warn"
org.molgenis: "warn"
EOF
working-directory: dsBaseClient

- name: Start Armadillo docker-compose
shell: bash
run: docker compose -f docker-compose_armadillo.yml up -d
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps
with:
additional-packages: cran::covr

- name: Wait for Armadillo to be ready
shell: bash
run: |
for i in $(seq 1 60); do
if curl -fsS http://localhost:8080/actuator/health 2>/dev/null | grep -q '"status":"UP"'; then
echo "Armadillo is ready"
exit 0
fi
sleep 5
done
echo "Armadillo did not become ready in time"
docker compose -f docker-compose_armadillo.yml logs armadillo || true
exit 1
working-directory: dsBaseClient

- name: Install test datasets to Armadillo
shell: bash
run: R -q -f "molgenis_armadillo-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Armadillo
shell: bash
run: |
installed=false
for i in $(seq 1 30); do
if Rscript -e "
library(MolgenisArmadillo)
armadillo.login_basic('http://localhost:8080', 'admin', 'admin')
armadillo.install_packages('${{ inputs.dsbase-tarball }}', profile = 'default')
"; then
installed=true
break
fi
sleep 10
done
if [ "$installed" != "true" ]; then
echo "dsBase install via armadillo.install_packages() failed (default profile may not have started in time)"
exit 1
fi

expected_version=$(tar -xOzf ${{ inputs.dsbase-tarball }} dsBase/DESCRIPTION | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from ${{ inputs.dsbase-tarball }}"
exit 1
fi
echo "Expected dsBase version: $expected_version"

actual_version=""
for i in $(seq 1 30); do
packages_json=$(curl -sf -u admin:admin -X GET http://localhost:8080/packages || true)
actual_version=$(echo "$packages_json" | jq -r '.[] | select(.name == "dsBase") | .version' 2>/dev/null || true)
if [ "$actual_version" == "$expected_version" ]; then
break
fi
sleep 10
done
echo "Installed dsBase version: $actual_version"
if [ "$actual_version" != "$expected_version" ]; then
echo "dsBase version mismatch: expected $expected_version, found '$actual_version'"
exit 1
fi
echo "$actual_version" > dsbase_version.txt

curl -u admin:admin -X POST http://localhost:8080/whitelist/dsBase
working-directory: dsBaseClient

- name: Dump Armadillo server log
if: failure()
shell: bash
run: docker compose -f docker-compose_armadillo.yml logs armadillo | grep "Caused by:" | sort -u || true
working-directory: dsBaseClient
75 changes: 75 additions & 0 deletions .github/actions/setup-opal-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
name: Setup Opal with dsBase
description: >
Starts a fresh Opal instance via docker-compose, installs R and system
dependencies, uploads test datasets, and installs dsBase with disclosure
test options. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Opal dsbase shard workflow and the Opal
dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-ref:
description: dsBase GitHub ref to install
required: false
default: v7.0-dev

runs:
using: composite
steps:
- name: Start Opal docker-compose
shell: bash
run: docker compose -f docker-compose_opal.yml up -d --build
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps

- name: Install test datasets to Opal
shell: bash
run: |
for i in $(seq 1 18); do
if curl -sf -o /dev/null http://localhost:8080/; then
echo "Opal is responding"
break
fi
sleep 5
done
R -q -f "obiba_opal-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Opal, set disclosure test options
shell: bash
run: |
R -q -e "library(opalr); opal <- opal.login(username = 'administrator', password = 'datashield_test&', url = 'http://localhost:8080/'); opal.put(opal, 'system', 'conf', 'general', '_rPackage'); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator','datashield_test&', url='http://localhost:8080/'); dsadmin.install_github_package(opal, 'dsBase', username = 'datashield', ref = '${{ inputs.dsbase-ref }}'); opal.logout(opal)"

expected_version=$(curl -sf "https://raw.githubusercontent.com/datashield/dsBase/${{ inputs.dsbase-ref }}/DESCRIPTION" | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from GitHub"
exit 1
fi
echo "Expected dsBase version: $expected_version"
echo "$expected_version" > dsbase_version.txt

ok=false
for i in $(seq 1 18); do
if Rscript -e "
library(opalr)
opal <- opal.login('administrator', 'datashield_test&', url = 'http://localhost:8080/')
desc <- dsadmin.package_description(opal, 'dsBase')
opal.logout(opal)
installed <- desc[['Version']]
cat('Installed dsBase version:', if (is.null(installed)) '(none yet)' else installed, '\n')
quit(status = if (!is.null(installed) && installed == '$expected_version') 0 else 1)
"; then
ok=true
break
fi
sleep 10
done
if [ "$ok" != "true" ]; then
echo "dsBase version mismatch or install not detected after polling: expected $expected_version"
exit 1
fi

R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.profile_init(opal, name = 'default', packages = c('dsBase', 'dsTidyverse', 'resourcer')); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.set_option(opal, 'default.datashield.privacyControlLevel', 'permissive'); opal.logout(opal)"
working-directory: dsBaseClient/tests/testthat/data_files
61 changes: 61 additions & 0 deletions .github/actions/setup-r-with-dsbase-deps/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
name: Setup R with dsBaseClient dependencies
description: >
Installs the system libraries, R, and R package dependencies shared by the
Opal and Armadillo setup actions. Assumes the caller has already checked
out dsBaseClient at ./dsBaseClient.

inputs:
additional-packages:
description: Extra pak package specs (one per line) to install beyond the common set
required: false
default: ''

runs:
using: composite
steps:
- name: Install system libraries
shell: bash
env:
SYSTEM_LIBRARIES: >-
libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev
libharfbuzz-dev libfribidi-dev libmagick++-dev libudunits2-dev libuv1-dev
run: |
sudo apt-get update -qq
sudo apt-get install -qq $SYSTEM_LIBRARIES -y

- uses: r-lib/actions/setup-r@v2
with:
r-version: release
http-user-agent: release
use-public-rspm: true

- uses: r-lib/actions/setup-r-dependencies@v2
env:
# RSPM doesn't always have a binary for every package/R-version combo; when it
# falls back to source, pak needs LinkingTo deps present to compile it.
PKG_INCLUDE_LINKINGTO: true
R_PACKAGES: |
cran::devtools
cran::fields
cran::meta
cran::metafor
cran::ggplot2
cran::gridExtra
cran::data.table
cran::DSI
cran::opalr
cran::DSOpal
cran::DSLite
cran::MolgenisAuth
cran::MolgenisArmadillo
cran::DSMolgenisArmadillo
cran::DescTools
cran::e1071
github::datashield/dsDangerClient
with:
working-directory: dsBaseClient
dependencies: 'c("Depends", "Imports", "LinkingTo")'
extra-packages: |
${{ env.R_PACKAGES }}
${{ inputs.additional-packages }}
needs: check
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .Rbuildignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,3 +25,4 @@
^\.github$
^REFACTOR_GUIDE\.md$
^man-roxygen$
^codecov\.yml$
140 changes: 140 additions & 0 deletions .github/actions/setup-armadillo-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
name: Setup Armadillo with dsBase
description: >
Starts a fresh Armadillo instance via docker-compose, with the "default"
Rock profile as a static sibling container. Installs R and system
dependencies, waits for readiness, uploads test datasets, and installs
dsBase. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Armadillo dsbase shard workflow and the
Armadillo dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-tarball:
description: dsBase tarball filename to install
required: false
default: dsBase_7.0.0-permissive.tar.gz

runs:
using: composite
steps:
- name: Write Armadillo config
shell: bash
run: |
mkdir -p armadillo_home/config

cat > armadillo_home/config/application.yml <<EOF
armadillo:
docker-management-enabled: false
docker-run-in-container: true
profiles:
- name: default
image: datashield/rock_citest-permissive:latest
host: default
port: 8085
package-whitelist:
- dsBase
- dsTidyverse
- resourcer
function-blacklist: [ ]
options:
datashield:
seed: 342325352
spring:
security:
user:
name: admin
password: admin
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
storage:
root-dir: /data
audit.log.path: '/logs/audit.log'
stdout.log.path: '/logs/armadillo.log'
logging:
level:
root: "warn"
org.molgenis: "warn"
EOF
working-directory: dsBaseClient

- name: Start Armadillo docker-compose
shell: bash
run: docker compose -f docker-compose_armadillo.yml up -d
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps
with:
additional-packages: cran::covr

- name: Wait for Armadillo to be ready
shell: bash
run: |
for i in $(seq 1 60); do
if curl -fsS http://localhost:8080/actuator/health 2>/dev/null | grep -q '"status":"UP"'; then
echo "Armadillo is ready"
exit 0
fi
sleep 5
done
echo "Armadillo did not become ready in time"
docker compose -f docker-compose_armadillo.yml logs armadillo || true
exit 1
working-directory: dsBaseClient

- name: Install test datasets to Armadillo
shell: bash
run: R -q -f "molgenis_armadillo-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Armadillo
shell: bash
run: |
installed=false
for i in $(seq 1 30); do
if Rscript -e "
library(MolgenisArmadillo)
armadillo.login_basic('http://localhost:8080', 'admin', 'admin')
armadillo.install_packages('${{ inputs.dsbase-tarball }}', profile = 'default')
"; then
installed=true
break
fi
sleep 10
done
if [ "$installed" != "true" ]; then
echo "dsBase install via armadillo.install_packages() failed (default profile may not have started in time)"
exit 1
fi

expected_version=$(tar -xOzf ${{ inputs.dsbase-tarball }} dsBase/DESCRIPTION | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from ${{ inputs.dsbase-tarball }}"
exit 1
fi
echo "Expected dsBase version: $expected_version"

actual_version=""
for i in $(seq 1 30); do
packages_json=$(curl -sf -u admin:admin -X GET http://localhost:8080/packages || true)
actual_version=$(echo "$packages_json" | jq -r '.[] | select(.name == "dsBase") | .version' 2>/dev/null || true)
if [ "$actual_version" == "$expected_version" ]; then
break
fi
sleep 10
done
echo "Installed dsBase version: $actual_version"
if [ "$actual_version" != "$expected_version" ]; then
echo "dsBase version mismatch: expected $expected_version, found '$actual_version'"
exit 1
fi
echo "$actual_version" > dsbase_version.txt

curl -u admin:admin -X POST http://localhost:8080/whitelist/dsBase
working-directory: dsBaseClient

- name: Dump Armadillo server log
if: failure()
shell: bash
run: docker compose -f docker-compose_armadillo.yml logs armadillo | grep "Caused by:" | sort -u || true
working-directory: dsBaseClient
75 changes: 75 additions & 0 deletions .github/actions/setup-opal-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
name: Setup Opal with dsBase
description: >
Starts a fresh Opal instance via docker-compose, installs R and system
dependencies, uploads test datasets, and installs dsBase with disclosure
test options. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Opal dsbase shard workflow and the Opal
dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-ref:
description: dsBase GitHub ref to install
required: false
default: v7.0-dev

runs:
using: composite
steps:
- name: Start Opal docker-compose
shell: bash
run: docker compose -f docker-compose_opal.yml up -d --build
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps

- name: Install test datasets to Opal
shell: bash
run: |
for i in $(seq 1 18); do
if curl -sf -o /dev/null http://localhost:8080/; then
echo "Opal is responding"
break
fi
sleep 5
done
R -q -f "obiba_opal-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Opal, set disclosure test options
shell: bash
run: |
R -q -e "library(opalr); opal <- opal.login(username = 'administrator', password = 'datashield_test&', url = 'http://localhost:8080/'); opal.put(opal, 'system', 'conf', 'general', '_rPackage'); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator','datashield_test&', url='http://localhost:8080/'); dsadmin.install_github_package(opal, 'dsBase', username = 'datashield', ref = '${{ inputs.dsbase-ref }}'); opal.logout(opal)"

expected_version=$(curl -sf "https://raw.githubusercontent.com/datashield/dsBase/${{ inputs.dsbase-ref }}/DESCRIPTION" | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from GitHub"
exit 1
fi
echo "Expected dsBase version: $expected_version"
echo "$expected_version" > dsbase_version.txt

ok=false
for i in $(seq 1 18); do
if Rscript -e "
library(opalr)
opal <- opal.login('administrator', 'datashield_test&', url = 'http://localhost:8080/')
desc <- dsadmin.package_description(opal, 'dsBase')
opal.logout(opal)
installed <- desc[['Version']]
cat('Installed dsBase version:', if (is.null(installed)) '(none yet)' else installed, '\n')
quit(status = if (!is.null(installed) && installed == '$expected_version') 0 else 1)
"; then
ok=true
break
fi
sleep 10
done
if [ "$ok" != "true" ]; then
echo "dsBase version mismatch or install not detected after polling: expected $expected_version"
exit 1
fi

R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.profile_init(opal, name = 'default', packages = c('dsBase', 'dsTidyverse', 'resourcer')); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.set_option(opal, 'default.datashield.privacyControlLevel', 'permissive'); opal.logout(opal)"
working-directory: dsBaseClient/tests/testthat/data_files
61 changes: 61 additions & 0 deletions .github/actions/setup-r-with-dsbase-deps/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
name: Setup R with dsBaseClient dependencies
description: >
Installs the system libraries, R, and R package dependencies shared by the
Opal and Armadillo setup actions. Assumes the caller has already checked
out dsBaseClient at ./dsBaseClient.

inputs:
additional-packages:
description: Extra pak package specs (one per line) to install beyond the common set
required: false
default: ''

runs:
using: composite
steps:
- name: Install system libraries
shell: bash
env:
SYSTEM_LIBRARIES: >-
libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev
libharfbuzz-dev libfribidi-dev libmagick++-dev libudunits2-dev libuv1-dev
run: |
sudo apt-get update -qq
sudo apt-get install -qq $SYSTEM_LIBRARIES -y

- uses: r-lib/actions/setup-r@v2
with:
r-version: release
http-user-agent: release
use-public-rspm: true

- uses: r-lib/actions/setup-r-dependencies@v2
env:
# RSPM doesn't always have a binary for every package/R-version combo; when it
# falls back to source, pak needs LinkingTo deps present to compile it.
PKG_INCLUDE_LINKINGTO: true
R_PACKAGES: |
cran::devtools
cran::fields
cran::meta
cran::metafor
cran::ggplot2
cran::gridExtra
cran::data.table
cran::DSI
cran::opalr
cran::DSOpal
cran::DSLite
cran::MolgenisAuth
cran::MolgenisArmadillo
cran::DSMolgenisArmadillo
cran::DescTools
cran::e1071
github::datashield/dsDangerClient
with:
working-directory: dsBaseClient
dependencies: 'c("Depends", "Imports", "LinkingTo")'
extra-packages: |
${{ env.R_PACKAGES }}
${{ inputs.additional-packages }}
needs: check
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .Rbuildignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,3 +25,4 @@
^\.github$
^REFACTOR_GUIDE\.md$
^man-roxygen$
^codecov\.yml$
140 changes: 140 additions & 0 deletions .github/actions/setup-armadillo-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
name: Setup Armadillo with dsBase
description: >
Starts a fresh Armadillo instance via docker-compose, with the "default"
Rock profile as a static sibling container. Installs R and system
dependencies, waits for readiness, uploads test datasets, and installs
dsBase. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Armadillo dsbase shard workflow and the
Armadillo dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-tarball:
description: dsBase tarball filename to install
required: false
default: dsBase_7.0.0-permissive.tar.gz

runs:
using: composite
steps:
- name: Write Armadillo config
shell: bash
run: |
mkdir -p armadillo_home/config

cat > armadillo_home/config/application.yml <<EOF
armadillo:
docker-management-enabled: false
docker-run-in-container: true
profiles:
- name: default
image: datashield/rock_citest-permissive:latest
host: default
port: 8085
package-whitelist:
- dsBase
- dsTidyverse
- resourcer
function-blacklist: [ ]
options:
datashield:
seed: 342325352
spring:
security:
user:
name: admin
password: admin
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
storage:
root-dir: /data
audit.log.path: '/logs/audit.log'
stdout.log.path: '/logs/armadillo.log'
logging:
level:
root: "warn"
org.molgenis: "warn"
EOF
working-directory: dsBaseClient

- name: Start Armadillo docker-compose
shell: bash
run: docker compose -f docker-compose_armadillo.yml up -d
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps
with:
additional-packages: cran::covr

- name: Wait for Armadillo to be ready
shell: bash
run: |
for i in $(seq 1 60); do
if curl -fsS http://localhost:8080/actuator/health 2>/dev/null | grep -q '"status":"UP"'; then
echo "Armadillo is ready"
exit 0
fi
sleep 5
done
echo "Armadillo did not become ready in time"
docker compose -f docker-compose_armadillo.yml logs armadillo || true
exit 1
working-directory: dsBaseClient

- name: Install test datasets to Armadillo
shell: bash
run: R -q -f "molgenis_armadillo-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Armadillo
shell: bash
run: |
installed=false
for i in $(seq 1 30); do
if Rscript -e "
library(MolgenisArmadillo)
armadillo.login_basic('http://localhost:8080', 'admin', 'admin')
armadillo.install_packages('${{ inputs.dsbase-tarball }}', profile = 'default')
"; then
installed=true
break
fi
sleep 10
done
if [ "$installed" != "true" ]; then
echo "dsBase install via armadillo.install_packages() failed (default profile may not have started in time)"
exit 1
fi

expected_version=$(tar -xOzf ${{ inputs.dsbase-tarball }} dsBase/DESCRIPTION | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from ${{ inputs.dsbase-tarball }}"
exit 1
fi
echo "Expected dsBase version: $expected_version"

actual_version=""
for i in $(seq 1 30); do
packages_json=$(curl -sf -u admin:admin -X GET http://localhost:8080/packages || true)
actual_version=$(echo "$packages_json" | jq -r '.[] | select(.name == "dsBase") | .version' 2>/dev/null || true)
if [ "$actual_version" == "$expected_version" ]; then
break
fi
sleep 10
done
echo "Installed dsBase version: $actual_version"
if [ "$actual_version" != "$expected_version" ]; then
echo "dsBase version mismatch: expected $expected_version, found '$actual_version'"
exit 1
fi
echo "$actual_version" > dsbase_version.txt

curl -u admin:admin -X POST http://localhost:8080/whitelist/dsBase
working-directory: dsBaseClient

- name: Dump Armadillo server log
if: failure()
shell: bash
run: docker compose -f docker-compose_armadillo.yml logs armadillo | grep "Caused by:" | sort -u || true
working-directory: dsBaseClient
75 changes: 75 additions & 0 deletions .github/actions/setup-opal-with-dsbase/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
name: Setup Opal with dsBase
description: >
Starts a fresh Opal instance via docker-compose, installs R and system
dependencies, uploads test datasets, and installs dsBase with disclosure
test options. Assumes the caller has already checked out dsBaseClient at
./dsBaseClient. Shared by the Opal dsbase shard workflow and the Opal
dsdanger job, so this setup only needs fixing in one place.

inputs:
dsbase-ref:
description: dsBase GitHub ref to install
required: false
default: v7.0-dev

runs:
using: composite
steps:
- name: Start Opal docker-compose
shell: bash
run: docker compose -f docker-compose_opal.yml up -d --build
working-directory: dsBaseClient

- uses: ./dsBaseClient/.github/actions/setup-r-with-dsbase-deps

- name: Install test datasets to Opal
shell: bash
run: |
for i in $(seq 1 18); do
if curl -sf -o /dev/null http://localhost:8080/; then
echo "Opal is responding"
break
fi
sleep 5
done
R -q -f "obiba_opal-upload_testing_datasets.R"
working-directory: dsBaseClient/tests/testthat/data_files

- name: Install dsBase to Opal, set disclosure test options
shell: bash
run: |
R -q -e "library(opalr); opal <- opal.login(username = 'administrator', password = 'datashield_test&', url = 'http://localhost:8080/'); opal.put(opal, 'system', 'conf', 'general', '_rPackage'); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator','datashield_test&', url='http://localhost:8080/'); dsadmin.install_github_package(opal, 'dsBase', username = 'datashield', ref = '${{ inputs.dsbase-ref }}'); opal.logout(opal)"

expected_version=$(curl -sf "https://raw.githubusercontent.com/datashield/dsBase/${{ inputs.dsbase-ref }}/DESCRIPTION" | sed -n 's/^Version: //p' | tr -d '\r')
if [ -z "$expected_version" ]; then
echo "Could not determine expected dsBase version from GitHub"
exit 1
fi
echo "Expected dsBase version: $expected_version"
echo "$expected_version" > dsbase_version.txt

ok=false
for i in $(seq 1 18); do
if Rscript -e "
library(opalr)
opal <- opal.login('administrator', 'datashield_test&', url = 'http://localhost:8080/')
desc <- dsadmin.package_description(opal, 'dsBase')
opal.logout(opal)
installed <- desc[['Version']]
cat('Installed dsBase version:', if (is.null(installed)) '(none yet)' else installed, '\n')
quit(status = if (!is.null(installed) && installed == '$expected_version') 0 else 1)
"; then
ok=true
break
fi
sleep 10
done
if [ "$ok" != "true" ]; then
echo "dsBase version mismatch or install not detected after polling: expected $expected_version"
exit 1
fi

R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.profile_init(opal, name = 'default', packages = c('dsBase', 'dsTidyverse', 'resourcer')); opal.logout(opal)"
R -q -e "library(opalr); opal <- opal.login('administrator', 'datashield_test&', url='http://localhost:8080/'); dsadmin.set_option(opal, 'default.datashield.privacyControlLevel', 'permissive'); opal.logout(opal)"
working-directory: dsBaseClient/tests/testthat/data_files
61 changes: 61 additions & 0 deletions .github/actions/setup-r-with-dsbase-deps/action.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
name: Setup R with dsBaseClient dependencies
description: >
Installs the system libraries, R, and R package dependencies shared by the
Opal and Armadillo setup actions. Assumes the caller has already checked
out dsBaseClient at ./dsBaseClient.

inputs:
additional-packages:
description: Extra pak package specs (one per line) to install beyond the common set
required: false
default: ''

runs:
using: composite
steps:
- name: Install system libraries
shell: bash
env:
SYSTEM_LIBRARIES: >-
libxml2-dev libcurl4-openssl-dev libssl-dev libgsl-dev libgit2-dev
libharfbuzz-dev libfribidi-dev libmagick++-dev libudunits2-dev libuv1-dev
run: |
sudo apt-get update -qq
sudo apt-get install -qq $SYSTEM_LIBRARIES -y

- uses: r-lib/actions/setup-r@v2
with:
r-version: release
http-user-agent: release
use-public-rspm: true

- uses: r-lib/actions/setup-r-dependencies@v2
env:
# RSPM doesn't always have a binary for every package/R-version combo; when it
# falls back to source, pak needs LinkingTo deps present to compile it.
PKG_INCLUDE_LINKINGTO: true
R_PACKAGES: |
cran::devtools
cran::fields
cran::meta
cran::metafor
cran::ggplot2
cran::gridExtra
cran::data.table
cran::DSI
cran::opalr
cran::DSOpal
cran::DSLite
cran::MolgenisAuth
cran::MolgenisArmadillo
cran::DSMolgenisArmadillo
cran::DescTools
cran::e1071
github::datashield/dsDangerClient
with:
working-directory: dsBaseClient
dependencies: 'c("Depends", "Imports", "LinkingTo")'
extra-packages: |
${{ env.R_PACKAGES }}
${{ inputs.additional-packages }}
needs: check
Loading
Loading