Skip to content

[CHECK] update actions #3

[CHECK] update actions

[CHECK] update actions #3

Workflow file for this run

name: Package Risk Assessment
on:
push:
pull_request:
workflow_dispatch:
jobs:
risk-assessment:
runs-on: ubuntu-latest
name: Risk Assessment
env:
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
R_KEEP_PKG_SOURCE: yes
CACHE_VERSION: v1
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup R
uses: r-lib/actions/setup-r@v2
with:
r-version: 'release'
use-public-rspm: true
- name: Setup Pandoc
uses: r-lib/actions/setup-pandoc@v2
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libcurl4-openssl-dev libssl-dev libxml2-dev
- name: Query dependencies
run: |
install.packages('remotes')
saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2)
writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version")
shell: Rscript {0}
- name: Cache R packages
uses: actions/cache@v3
with:
path: ${{ env.R_LIBS_USER }}
key: ${{ runner.os }}-${{ env.CACHE_VERSION }}-${{ hashFiles('.github/R-version') }}-${{ hashFiles('.github/depends.Rds') }}
restore-keys: |
${{ runner.os }}-${{ env.CACHE_VERSION }}-
- name: Install dependencies
run: |
install.packages(c("remotes", "devtools", "risk.assessr", "crayon", "knitr", "jsonlite"))
remotes::install_deps(dependencies = TRUE)
shell: Rscript {0}
- name: Build package
run: devtools::build(path = ".", vignettes = FALSE)
shell: Rscript {0}
- name: Run Risk Assessment
run: |
library(risk.assessr)
library(crayon)
library(jsonlite)
`%||%` <- function(a, b) if (!is.null(a)) a else b
log_time <- function(msg) {
cat(sprintf("[%s] %s\n", format(Sys.time(), "%Y-%m-%d %H:%M:%S UTC"), msg))
}
pretty_print_assessment <- function(assessment_results) {
if (is.null(assessment_results)) {
cat("❌ No assessment results\n")
return()
}
# PACKAGE INFO
cat("::group::📦 Package Info\n")
pkg_name <- assessment_results$package %||% assessment_results$pkg_name %||% "Unknown"
cat("Package:", pkg_name, "\n")
cat("Generated:", format(Sys.time(), "%Y-%m-%d %H:%M:%S UTC"), "\n")
cat("::endgroup::\n")
# R CMD CHECK
if ("rcmdcheck" %in% names(assessment_results)) {
cat("::group::🔍 R CMD CHECK\n")
rcmd <- assessment_results$rcmdcheck
if (length(rcmd$errors) > 0) {
cat(red$bold("❌ Errors:\n"), paste(rcmd$errors, collapse="\n"), "\n")
} else cat(green$bold("✅ No errors\n"))
if (length(rcmd$warnings) > 0) {
cat(yellow$bold("⚠️ Warnings:\n"), paste(rcmd$warnings, collapse="\n"), "\n")
} else cat(green$bold("✅ No warnings\n"))
if (length(rcmd$notes) > 0) {
cat(blue$bold("ℹ️ Notes:\n"), paste(rcmd$notes, collapse="\n"), "\n")
} else cat(green$bold("✅ No notes\n"))
cat("::endgroup::\n")
}
# COVERAGE
if ("covr" %in% names(assessment_results)) {
cat("::group::📈 Coverage\n")
covr <- assessment_results$covr
if (is.numeric(covr)) {
coverage_pct <- round(covr, 2)
cat("Coverage:", coverage_pct, "%\n")
if (coverage_pct < 60) cat("::error::Coverage < 60%\n")
else if (coverage_pct < 80) cat("::warning::Coverage < 80%\n")
} else print(covr)
cat("::endgroup::\n")
}
# DEPENDENCIES
if ("dependencies" %in% names(assessment_results)) {
cat("::group::📋 Dependencies\n")
print(assessment_results$dependencies)
cat("::endgroup::\n")
}
# METRICS
if ("metrics" %in% names(assessment_results)) {
cat("::group::📊 Metrics\n")
print(assessment_results$metrics)
cat("::endgroup::\n")
}
}
log_time("🚀 Running risk assessment with risk.assessr...")
tryCatch({
assessment <- risk_assess_pkg(".")
pretty_print_assessment(assessment)
# Save logs & structured results
saveRDS(assessment, "assessment_results.rds")
write_json(assessment, "assessment_results.json", pretty=TRUE, auto_unbox=TRUE)
# Write summary for GitHub
summary_file <- Sys.getenv("GITHUB_STEP_SUMMARY")
if (nzchar(summary_file)) {
writeLines(c(
"## 📊 Risk Assessment Summary",
paste0("- Package: ", assessment$package %||% "Unknown"),
paste0("- Errors: ", length(assessment$rcmdcheck$errors) %||% 0),
paste0("- Warnings: ", length(assessment$rcmdcheck$warnings) %||% 0),
paste0("- Notes: ", length(assessment$rcmdcheck$notes) %||% 0)
), summary_file, append = TRUE)
}
}, error=function(e) {
cat("::error:: Risk assessment failed:", e$message, "\n")
})
shell: Rscript {0}
- name: Upload assessment artifacts
uses: actions/upload-artifact@v4
if: always()
with:
name: risk-assessment-output
path: |
*.log
*.Rcheck/
assessment_results.json
assessment_results.rds
retention-days: 30