build-cran-binaries/README.md
2024-06-03 23:51:22 +02:00

73 lines
2.7 KiB
Markdown

# README
## Workflow
1. "Prepare"
1. Install R interpreter
2. Add required repos to resolve syslibs
3. Install pak
4. Install awscli for remote s3 sync
2. "Build"
1. For every package, do
1. Clone from GitHub CRAN mirror
2. Install all system dependencies via `pak::local_install_dev_deps()`
3. Checkout each available tag
<!-- 4. Build source package -->
4. Build binary package
5. Create Archive/ directory
6. Move all versions besides the most recent one to Archive/ (for source and binary)
7. Create `PACKAGES` metadata file using `cranlike` package
8. Store build metadata in sqlite DB
3. "Upload"
1. Sync all binaries and sources to S3 bucket
4. `-4-create-archive-rds.sh`
1. Create `Meta/archive.rds` file for each package so that `remotes::install_version()` can install archived versions
2. Upload `Meta/archive.rds` to S3 bucket
## Build metadata
The build metadata is stored in a sqlite database.
The following tables are used:
- `metadata` contains the build metadata for each package:
| package_name | tag | platform | error_occurred | build_timestamp |
| ------------ | --- | -------- | -------------- | --------------- |
- `metadata_summary` contains aggregated build metadata for each package and platform:
| package_name | platform | successful_builds | unsuccessful_builds | total_builds | percentage_successful_builds | average_build_time_per_tag |
| ------------ | -------- | ----------------- | ------------------- | ------------ | ---------------------------- | -------------------------- |
## Support for archived versions
### `remotes::install_version()`
`remotes::install_version()` is searching for a `Meta/archive.rds` file in the `/src/contrib` directory.
This file must be a list of dataframes containing the information about the archived versions of the package.
Example:
```r
con <- gzcon(url(sprintf("%s/src/contrib/Meta/archive.rds",
c("CRAN" = "https://cloud.r-project.org")), "rb"))
foo = readRDS(con)
foo[[1]]
```
### `pak::pak(package@version)`
`pak` searches for `Archive/<package>` and is able to install all versions existing there.
Ensure to use a clean cache if other repos have been used before, i.e. call `pak::meta_clean(force = TRUE)` if in doubt or when testing.
## Platforms
The following platforms are supported:
- RHEL9
## Lessons learned
- Newer R versions have issues compiling C code from older package Versions. Using an older R version to build the binaries is recommended.
- R 4.0.5 is used to build all binaries for R 4.x
- Binaries which cannot be built using R 4.0.5 often also require older system library or compiler versions and are out of scope for this project.