The {multideploy}
package provides tools for deploying
file changes across multiple GitHub repositories. It’s designed to help
you manage standardized configurations, CI/CD workflows, and other
common files that need to be synchronized across multiple
repositories.
You can install the development version of {multideploy}
from GitHub
with:
# install.packages("remotes")
::install_github("coatless-rpkg/multideploy") remotes
{multideploy}
uses the gh
package for
GitHub API authentication and querying. Before using
{multideploy}
, make sure you have a GitHub Personal Access
Token (PAT) set up:
# Set GitHub PAT (or use .Renviron)
Sys.setenv(GITHUB_PAT = askpass::askpass("What is your GitHub Personal Access Token (PAT)?"))
For regular use, it’s recommended to add your PAT to the git
credential system through the {gitcreds}
package:
::gitcreds_set() gitcreds
Here’s an example showing how to deploy a standardized CI workflow
file to multiple repositories using {multideploy}
:
library(multideploy)
# List repositories in an organization matching a pattern
<- repos("my-organization", filter_regex = "^api-")
repos
# Deploy a CI workflow file to the selected repositories
<- file_deploy(
results source_file = "templates/check-standard.yml",
target_path = ".github/workflows/R-CMD-check.yaml",
repos = repos
)
# View results
print(results)
[!IMPORTANT]
The GitHub PAT used for authentication must have the necessary permissions to access and modify the repositories’ workflows.
If you’re looking for more detailed examples on how to use
{multideploy}
, we step through the additional features of
the package within this section.
List and filter repositories across users or organizations:
# Get all public repositories for a user
<- repos("username", type = "public")
user_repos
# Get repositories for an organization matching a pattern
<- repos("orgname", filter_regex = "^data-")
org_repos
# List organizations you have access to
<- orgs() my_orgs
Deploy individual files or sets of files to multiple repositories:
# Deploy a single file
file_deploy("local/path/file.R", "remote/path/file.R", repos)
# Create a mapping of multiple files
<- file_mapping(
mapping "local/lint.R" = ".lintr",
"local/gitignore" = ".gitignore",
dir = "templates/workflows",
pattern = "\\.ya?ml$",
target_prefix = ".github/workflows/"
)
# Create pull requests with multiple file changes
pr_create(
repos = repos,
branch_name = "feature/standardize-workflows",
title = "Standardize CI workflows",
body = "Implements organization-wide CI workflow standards",
file_mapping = mapping
)
Preview changes before making them:
# Preview changes without making them
file_deploy("local/file.R", "remote/file.R", repos, dry_run = TRUE)
# Preview PR creation
pr_create(repos, "branch-name", "PR Title", "PR Body", mapping, dry_run = TRUE)
AGPL (>= 3)