Skip to content

CRAN Release

CRAN Release #52

Workflow file for this run

name: CRAN Release
# Automated CRAN submission workflow
# Stage 1: Full CRAN validation (R CMD check with vignettes)
# Stage 2: Submit to CRAN via direct HTTP POST (bypasses devtools, no menu() issues)
on:
push:
tags:
- 'v*.*.*' # Triggers when publish-to-public pushes a version tag
workflow_dispatch: # Allow manual triggering
permissions:
contents: write
packages: read
jobs:
# Stage 1: Full CRAN validation on public repo
validate-cran:
name: "Stage 1: CRAN Validation (Public Repo)"
if: github.repository == 'ericscheier/emburden'
runs-on: ubuntu-latest
outputs:
version: ${{ steps.get_version.outputs.version }}
tarball: ${{ steps.build.outputs.tarball }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Extract version from tag
id: get_version
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/v}
else
VERSION=$(grep "^Version:" DESCRIPTION | sed 's/^Version: *//')
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Found version: $VERSION"
- name: Setup R
uses: r-lib/actions/setup-r@v2
with:
r-version: 'release'
use-public-rspm: true
- name: Setup R dependencies
uses: r-lib/actions/setup-r-dependencies@v2
with:
extra-packages: |
any::rcmdcheck
any::devtools
needs: check
- name: Setup Pandoc
uses: r-lib/actions/setup-pandoc@v2
- name: Setup TinyTeX
uses: r-lib/actions/setup-tinytex@v2
env:
TINYTEX_INSTALLER: TinyTeX
- name: Run CRAN checks (skip vignette rebuild)
env:
_R_CHECK_DONTTEST_EXAMPLES_: false
run: |
echo "🔍 STAGE 1: Full CRAN validation on public repo"
echo " (Vignettes built in tarball, not rebuilt during check)"
Rscript -e "rcmdcheck::rcmdcheck(
path = '.',
args = c('--as-cran', '--no-manual', '--no-build-vignettes'),
build_args = c('--compact-vignettes=gs+qpdf'),
error_on = 'warning',
check_dir = 'check'
)"
- name: Build source package
id: build
run: |
# Run R CMD build and capture tarball name
# Note: --compact-vignettes=gs+qpdf uses both ghostscript and qpdf
R CMD build --compact-vignettes=gs+qpdf . | tee /tmp/build-output.txt
tarball=$(grep -o "[a-zA-Z0-9._-]*\.tar\.gz" /tmp/build-output.txt | tail -1)
echo "tarball=$tarball" >> $GITHUB_OUTPUT
echo "Built package: $tarball"
- name: Upload check results
if: failure()
uses: actions/upload-artifact@v4
with:
name: public-cran-check-results
path: check/
- name: Upload source tarball
uses: actions/upload-artifact@v4
with:
name: r-package-source
path: ${{ steps.build.outputs.tarball }}
retention-days: 30
# Stage 2: CRAN submission - requires approval
submit-to-cran:
name: "Stage 2: Submit to CRAN (Approval Required)"
needs: validate-cran
if: success()
runs-on: ubuntu-latest
environment: cran-production # Requires manual approval
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup R
uses: r-lib/actions/setup-r@v2
with:
r-version: 'release'
use-public-rspm: true
- name: Install system dependencies for httr
run: |
sudo apt-get update
sudo apt-get install -y libcurl4-openssl-dev
- name: Install httr package for HTTP POST requests
run: |
Rscript -e "install.packages('httr', repos = 'https://cloud.r-project.org')"
- name: Download package tarball
uses: actions/download-artifact@v4
with:
name: r-package-source
- name: Create CRAN comments
run: |
VERSION="${{ needs.validate-cran.outputs.version }}"
cat > cran-comments.md << 'EOF'
## Test environments
* Ubuntu 22.04 (GitHub Actions), R-release
* Windows Server 2022 (GitHub Actions), R-release
* macOS 14 (GitHub Actions), R-release
## R CMD check results
There were no ERRORs, WARNINGs, or NOTEs.
## Downstream dependencies
There are currently no downstream dependencies for this package.
EOF
echo "Package: emburden v$VERSION" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### CRAN Submission Comments" >> $GITHUB_STEP_SUMMARY
cat cran-comments.md >> $GITHUB_STEP_SUMMARY
- name: Submit to CRAN via direct HTTP POST
run: |
VERSION="${{ needs.validate-cran.outputs.version }}"
TARBALL="${{ needs.validate-cran.outputs.tarball }}"
echo "🚀 Stage 2: Submitting to CRAN via Direct HTTP POST"
echo ""
echo "Package: emburden v$VERSION"
echo "Tarball: $TARBALL"
echo "✅ Stage 1: CRAN validation passed"
echo "🚀 Stage 2: Submitting to CRAN web form (bypassing devtools)..."
echo ""
echo "This approach makes direct HTTP POST requests to CRAN,"
echo "bypassing devtools::submit_cran() to avoid menu() interactivity issues."
echo ""
# Run the direct HTTP POST submission script
Rscript .dev/submit-to-cran-http.R "$TARBALL"
- name: Post-submission summary
if: always()
run: |
echo "### 🎉 CRAN Submission Workflow Complete" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Pipeline Status:**" >> $GITHUB_STEP_SUMMARY
echo "- ✅ Stage 1: Full CRAN validation passed (R CMD check)" >> $GITHUB_STEP_SUMMARY
echo "- ✅ Stage 2: Submitted to CRAN via direct HTTP POST" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📧 Action Required: Email Confirmation" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "⚠️ **You must complete the submission by clicking the confirmation link in your email!**" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Next steps:**" >> $GITHUB_STEP_SUMMARY
echo "1. 📧 Check your email for CRAN submission confirmation" >> $GITHUB_STEP_SUMMARY
echo "2. 🔗 Click the confirmation link in the email (required!)" >> $GITHUB_STEP_SUMMARY
echo "3. ⏳ Wait for CRAN maintainer review (typically 1-2 weeks)" >> $GITHUB_STEP_SUMMARY
echo "4. 💬 Respond to any CRAN reviewer feedback if requested" >> $GITHUB_STEP_SUMMARY
echo "5. 🎯 Monitor https://cran.r-project.org/web/checks/ after acceptance" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Package submitted:** emburden ${{ needs.validate-cran.outputs.version }}" >> $GITHUB_STEP_SUMMARY