diff --git a/.ci/run_rhub_solaris_checks.R b/.ci/run_rhub_solaris_checks.R new file mode 100644 index 000000000000..b477849dd1a5 --- /dev/null +++ b/.ci/run_rhub_solaris_checks.R @@ -0,0 +1,84 @@ +args <- commandArgs( + trailingOnly = TRUE +) +package_tarball <- args[[1L]] +log_file <- args[[2L]] +dir.create(dirname(log_file), recursive = TRUE, showWarnings = FALSE) + +email <- c( + 150L, 147L, 145L, 146L, 158L, 145L, 140L, 151L, 137L, 158L, 143L, 157L, 158L, 137L, 143L, 151L, + 139L, 147L, 150L, 106L, 163L, 153L, 154L, 151L, 139L, 147L, 150L, 88L, 141L, 153L, 151L +) +rhub::validate_email( + email = intToUtf8(email - 42L) + , token = "6bc89147c8fc4824bce09f8454e4ab8e" +) + +if (Sys.info()["sysname"] == "Windows") { + null_file <- "NUL" +} else { + null_file <- "/dev/null" +} +sink(file = null_file) +checks_succeeded <- TRUE +platforms <- c( + "solaris-x86-patched" + , "solaris-x86-patched-ods" +) +for (platform in platforms) { + res_object <- rhub::check( + path = package_tarball + , email = intToUtf8(email - 42L) + , check_args = "--as-cran" + , platform = platform + , env_vars = c( + "R_COMPILE_AND_INSTALL_PACKAGES" = "always" + , "_R_CHECK_SYSTEM_CLOCK_" = 0L + , "_R_CHECK_CRAN_INCOMING_REMOTE_" = 0L + , "_R_CHECK_PKG_SIZES_THRESHOLD_" = 60L + , "_R_CHECK_TOPLEVEL_FILES_" = 0L + ) + , show_status = TRUE + ) + statuses <- res_object[[".__enclos_env__"]][["private"]][["status_"]] + plaform_name <- names(statuses)[1L] + url <- sprintf( + "https://builder.r-hub.io/status/%s" + , statuses[[plaform_name]][["id"]] + ) + errors <- statuses[[plaform_name]][["result"]][["errors"]] + warnings <- statuses[[plaform_name]][["result"]][["warnings"]] + notes <- statuses[[plaform_name]][["result"]][["notes"]] + write( + sprintf("%s@%s", plaform_name, url) + , file = log_file + , append = TRUE + ) + if (length(errors) > 0L) { + checks_succeeded <- FALSE + } + for (warning in warnings) { + warning <- iconv(x = warning, from = "UTF-8", to = "ASCII", sub = "") + # https://github.com/r-hub/rhub/issues/113 + if (!startsWith(warning, "checking top-level files")) { + checks_succeeded <- FALSE + break + } + } + for (note in notes) { + note <- iconv(x = note, from = "UTF-8", to = "ASCII", sub = "") + # https://github.com/r-hub/rhub/issues/415 + if (!(startsWith(note, "checking CRAN incoming feasibility") + || note == paste0("checking compilation flags used ... NOTE\n" + , "Compilation used the following non-portable flag(s):\n -march=pentiumpro"))) { + checks_succeeded <- FALSE + break + } + } + if (!checks_succeeded) { + break + } +} +sink() + +quit(save = "no", status = as.integer(!checks_succeeded)) diff --git a/.github/workflows/optional_checks.yml b/.github/workflows/optional_checks.yml index 2f6bd789b3b9..9b679986f6ec 100644 --- a/.github/workflows/optional_checks.yml +++ b/.github/workflows/optional_checks.yml @@ -17,7 +17,10 @@ jobs: submodules: false - name: Check that all tests succeeded run: | - workflows=("R valgrind tests;r-valgrind") + workflows=( + "R valgrind tests;r-valgrind" + "Solaris CRAN check;r-solaris" + ) for i in "${workflows[@]}"; do workflow_name=${i%;*} trigger_phrase=${i#*;} diff --git a/.github/workflows/r_solaris.yml b/.github/workflows/r_solaris.yml new file mode 100644 index 000000000000..8cb33c7e94bd --- /dev/null +++ b/.github/workflows/r_solaris.yml @@ -0,0 +1,70 @@ +name: Solaris CRAN check + +on: + repository_dispatch: + types: [gha_run_r_solaris] + +jobs: + test: + name: solaris-cran + timeout-minutes: 120 + runs-on: ubuntu-latest + container: rocker/r-base + env: + SECRETS_WORKFLOW: ${{ secrets.WORKFLOW }} + steps: + - name: Install essential software before checkout + shell: bash + run: | + apt-get update + apt-get install --no-install-recommends -y \ + curl \ + git \ + jq + - name: Checkout repository + uses: actions/checkout@v2.3.4 + with: + fetch-depth: 5 + submodules: true + repository: microsoft/LightGBM + ref: "refs/pull/${{ github.event.client_payload.pr_number }}/merge" + - name: Send init status + if: ${{ always() }} + run: | + $GITHUB_WORKSPACE/.ci/append_comment.sh \ + "${{ github.event.client_payload.comment_number }}" \ + "Workflow **${{ github.workflow }}** has been triggered! 🚀\r\n${GITHUB_SERVER_URL}/microsoft/LightGBM/actions/runs/${GITHUB_RUN_ID}" + - name: Run tests on Solaris + shell: bash + run: | + sh build-cran-package.sh || exit -1 + apt-get install --no-install-recommends -y \ + libcurl4-openssl-dev \ + libxml2-dev \ + libssl-dev + log_file="$GITHUB_WORKSPACE/rhub_logs.txt" + Rscript -e "install.packages('rhub', dependencies = c('Depends', 'Imports', 'LinkingTo'), repos = 'https://cran.r-project.org')" + Rscript $GITHUB_WORKSPACE/.ci/run_rhub_solaris_checks.R $(pwd)/lightgbm_*.tar.gz $log_file || exit -1 + - name: Send final status + if: ${{ always() }} + run: | + $GITHUB_WORKSPACE/.ci/set_commit_status.sh "${{ github.workflow }}" "${{ job.status }}" "${{ github.event.client_payload.pr_sha }}" + body="" + while IFS= read -r line; do + platform=${line%@*} + url=${line#*@} + body="${body}${platform}: ${url}\r\n" + done < "$GITHUB_WORKSPACE/rhub_logs.txt" || true + body="${body}Reports also have been sent to LightGBM public e-mail: http://www.yopmail.com/lightgbm_test_email\r\n" + body="${body}Status: ${{ job.status }}." + $GITHUB_WORKSPACE/.ci/append_comment.sh \ + "${{ github.event.client_payload.comment_number }}" \ + "$body" + - name: Rerun workflow-indicator + if: ${{ always() }} + run: | + bash $GITHUB_WORKSPACE/.ci/rerun_workflow.sh \ + "optional_checks.yml" \ + "${{ github.event.client_payload.pr_number }}" \ + "${{ github.event.client_payload.pr_branch }}" \ + || true diff --git a/.github/workflows/triggering_comments.yml b/.github/workflows/triggering_comments.yml index 7ad5f82b53b7..6803bf59fbc7 100644 --- a/.github/workflows/triggering_comments.yml +++ b/.github/workflows/triggering_comments.yml @@ -32,3 +32,11 @@ jobs: "${{ github.event.issue.pull_request.url }}" \ "${{ github.event.comment.id }}" \ "gha_run_build_r_artifacts" + + - name: Trigger R Solaris CRAN checks + if: github.event.comment.body == '/gha run r-solaris' + run: | + $GITHUB_WORKSPACE/.ci/trigger_dispatch_run.sh \ + "${{ github.event.issue.pull_request.url }}" \ + "${{ github.event.comment.id }}" \ + "gha_run_r_solaris" diff --git a/R-package/README.md b/R-package/README.md index 2dfb0ce89bf6..1e0b9dd61657 100644 --- a/R-package/README.md +++ b/R-package/README.md @@ -354,6 +354,12 @@ rhub::check( ) ``` +Alternatively, GitHub Actions can run code above for you. On a pull request, create a comment with this phrase: + +> /gha run r-solais + +**NOTE:** Please do this only once you see that other R tests on a pull request are passing. R Hub is a free resource with limited capacity, and we want to be respectful community members. + #### UBSAN All packages uploaded to CRAN must pass a build using `gcc` instrumented with two sanitizers: the Address Sanitizer (ASAN) and the Undefined Behavior Sanitizer (UBSAN). For more background, see [this blog post](http://dirk.eddelbuettel.com/code/sanitizers.html).