From 3cbbe53f2f8750b4f2962d947974ca7d98c98e15 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 9 Mar 2026 13:34:49 +0000 Subject: [PATCH 1/7] Initial plan From 68167c02e515bfc2b04b80ec458b043a72afb60e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 9 Mar 2026 13:39:55 +0000 Subject: [PATCH 2/7] ci: add copilot setup workflow and componentize install steps - Add .github/workflows/install/action.yml composite action for shared R/pandoc/dependency setup - Add .github/workflows/copilot-setup-steps.yml for GitHub Copilot agent - Update R-CMD-check, pkgdown, test-coverage, pr-commands to use install action - Switch /style pr-command from styler to air format - Closes #15 Co-authored-by: jonthegeek <33983824+jonthegeek@users.noreply.github.com> --- .github/workflows/R-CMD-check.yaml | 16 ++------ .github/workflows/copilot-setup-steps.yml | 34 +++++++++++++++++ .github/workflows/install/action.yml | 45 +++++++++++++++++++++++ .github/workflows/pkgdown.yaml | 14 ++----- .github/workflows/pr-commands.yaml | 23 ++++-------- .github/workflows/test-coverage.yaml | 13 ++----- 6 files changed, 99 insertions(+), 46 deletions(-) create mode 100644 .github/workflows/copilot-setup-steps.yml create mode 100644 .github/workflows/install/action.yml diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 68651f0..3f1cc98 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -24,25 +24,17 @@ jobs: - {os: ubuntu-latest, r: 'release'} - {os: ubuntu-latest, r: 'oldrel-1'} - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - R_KEEP_PKG_SOURCE: yes - steps: - uses: actions/checkout@v6 - - uses: r-lib/actions/setup-pandoc@v2 - - - uses: r-lib/actions/setup-r@v2 + - uses: ./.github/workflows/install with: + token: ${{ secrets.GITHUB_TOKEN }} r-version: ${{ matrix.config.r }} http-user-agent: ${{ matrix.config.http-user-agent }} - use-public-rspm: true - - - uses: r-lib/actions/setup-r-dependencies@v2 - with: - extra-packages: any::rcmdcheck needs: check + extra-packages: any::rcmdcheck + cache-version: "1" - uses: r-lib/actions/check-r-package@v2 with: diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml new file mode 100644 index 0000000..c4f9294 --- /dev/null +++ b/.github/workflows/copilot-setup-steps.yml @@ -0,0 +1,34 @@ +name: "Copilot Setup Steps" + +# Automatically run when the file changes to allow for easy validation, +# and allow manual testing through the repository's "Actions" tab. +on: + workflow_dispatch: + push: + paths: + - .github/workflows/copilot-setup-steps.yml + pull_request: + paths: + - .github/workflows/copilot-setup-steps.yml + +jobs: + # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot. + copilot-setup-steps: + runs-on: ubuntu-latest + + # Lowest permissions needed; Copilot gets its own token for its operations. + permissions: + contents: read + + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/workflows/install + with: + token: ${{ secrets.GITHUB_TOKEN }} + cache-version: copilot + needs: build, check, website + extra-packages: any::rcmdcheck any::roxygen2 any::pkgdown local::. + + - name: Install air + uses: posit-dev/setup-air@v1 diff --git a/.github/workflows/install/action.yml b/.github/workflows/install/action.yml new file mode 100644 index 0000000..95c460b --- /dev/null +++ b/.github/workflows/install/action.yml @@ -0,0 +1,45 @@ +name: "Install R and dependencies" +description: "Set up pandoc, R, and package dependencies" +inputs: + token: + description: "GitHub token, set to secrets.GITHUB_TOKEN" + required: true + r-version: + description: "R version, passed to r-lib/actions/setup-r@v2" + required: false + default: release + http-user-agent: + description: "HTTP user agent, passed to r-lib/actions/setup-r@v2" + required: false + default: "" + needs: + description: "Config/Needs tag(s), passed to r-lib/actions/setup-r-dependencies@v2" + required: false + default: "" + extra-packages: + description: "Extra packages, passed to r-lib/actions/setup-r-dependencies@v2" + required: false + default: any::rcmdcheck + cache-version: + description: "Cache version for r-lib/actions/setup-r-dependencies@v2" + required: false + default: "1" + +runs: + using: "composite" + steps: + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ inputs.r-version }} + http-user-agent: ${{ inputs.http-user-agent }} + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + env: + GITHUB_PAT: ${{ inputs.token }} + with: + needs: ${{ inputs.needs }} + extra-packages: ${{ inputs.extra-packages }} + cache-version: ${{ inputs.cache-version }} diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml index 88044f4..bda4e98 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -17,23 +17,17 @@ jobs: # Only restrict concurrency for non-PR jobs concurrency: group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }} - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} permissions: contents: write steps: - uses: actions/checkout@v6 - - uses: r-lib/actions/setup-pandoc@v2 - - - uses: r-lib/actions/setup-r@v2 - with: - use-public-rspm: true - - - uses: r-lib/actions/setup-r-dependencies@v2 + - uses: ./.github/workflows/install with: - extra-packages: any::pkgdown, local::. + token: ${{ secrets.GITHUB_TOKEN }} needs: website + extra-packages: any::pkgdown local::. + cache-version: "1" - name: Build site run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) diff --git a/.github/workflows/pr-commands.yaml b/.github/workflows/pr-commands.yaml index 5edb318..e97776b 100644 --- a/.github/workflows/pr-commands.yaml +++ b/.github/workflows/pr-commands.yaml @@ -11,8 +11,6 @@ jobs: if: ${{ github.event.issue.pull_request && (github.event.comment.author_association == 'MEMBER' || github.event.comment.author_association == 'OWNER') && startsWith(github.event.comment.body, '/document') }} name: document runs-on: ubuntu-latest - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v6 @@ -20,14 +18,12 @@ jobs: with: repo-token: ${{ secrets.GITHUB_TOKEN }} - - uses: r-lib/actions/setup-r@v2 - with: - use-public-rspm: true - - - uses: r-lib/actions/setup-r-dependencies@v2 + - uses: ./.github/workflows/install with: - extra-packages: any::roxygen2 + token: ${{ secrets.GITHUB_TOKEN }} needs: pr-document + extra-packages: any::roxygen2 + cache-version: "1" - name: Document run: roxygen2::roxygenise() @@ -48,8 +44,6 @@ jobs: if: ${{ github.event.issue.pull_request && (github.event.comment.author_association == 'MEMBER' || github.event.comment.author_association == 'OWNER') && startsWith(github.event.comment.body, '/style') }} name: style runs-on: ubuntu-latest - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v6 @@ -59,13 +53,12 @@ jobs: - uses: r-lib/actions/setup-r@v2 - - name: Install dependencies - run: install.packages("styler") - shell: Rscript {0} + - name: Install air + uses: posit-dev/setup-air@v1 - name: Style - run: styler::style_pkg() - shell: Rscript {0} + run: air format . + shell: bash - name: commit run: | diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index e717d78..99bcebb 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -11,20 +11,15 @@ name: test-coverage jobs: test-coverage: runs-on: ubuntu-latest - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - steps: - uses: actions/checkout@v6 - - uses: r-lib/actions/setup-r@v2 - with: - use-public-rspm: true - - - uses: r-lib/actions/setup-r-dependencies@v2 + - uses: ./.github/workflows/install with: - extra-packages: any::covr + token: ${{ secrets.GITHUB_TOKEN }} needs: coverage + extra-packages: any::covr + cache-version: "1" - name: Test coverage run: | From 64156247bea5ca7b42d1d82984d034bef3fbf133 Mon Sep 17 00:00:00 2001 From: Jon Harmon Date: Tue, 10 Mar 2026 06:58:00 -0500 Subject: [PATCH 3/7] fix: checkout version in copilot setup workflow --- .github/workflows/copilot-setup-steps.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index c4f9294..f22d113 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -21,7 +21,7 @@ jobs: contents: read steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: ./.github/workflows/install with: From f9c7483e97040ddfff82e2976af9add9a4fc0b5a Mon Sep 17 00:00:00 2001 From: Jon Harmon Date: Tue, 10 Mar 2026 07:15:19 -0500 Subject: [PATCH 4/7] Try to provide codecov token. --- .github/workflows/test-coverage.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 99bcebb..4e67e6f 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -26,7 +26,8 @@ jobs: covr::codecov( quiet = FALSE, clean = FALSE, - install_path = file.path(Sys.getenv("RUNNER_TEMP"), "package") + install_path = file.path(Sys.getenv("RUNNER_TEMP"), "package"), + token = ${{ secrets.CODECOV_TOKEN }} ) shell: Rscript {0} From 8a8dade18e957552fbc4905f137affc943920556 Mon Sep 17 00:00:00 2001 From: Jon Harmon Date: Tue, 10 Mar 2026 07:17:57 -0500 Subject: [PATCH 5/7] Another possible way to provide the token --- .github/workflows/test-coverage.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 4e67e6f..b065663 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -22,12 +22,13 @@ jobs: cache-version: "1" - name: Test coverage + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} run: | covr::codecov( quiet = FALSE, clean = FALSE, - install_path = file.path(Sys.getenv("RUNNER_TEMP"), "package"), - token = ${{ secrets.CODECOV_TOKEN }} + install_path = file.path(Sys.getenv("RUNNER_TEMP"), "package") ) shell: Rscript {0} From ecf993a94e496d8994fbe9704084327b58322fc3 Mon Sep 17 00:00:00 2001 From: Jon Harmon Date: Tue, 10 Mar 2026 07:20:45 -0500 Subject: [PATCH 6/7] Try another token path. --- .github/workflows/test-coverage.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index b065663..f7d4f0e 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -23,7 +23,7 @@ jobs: - name: Test coverage env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + CODECOV_TOKEN: '${{ secrets.CODECOV_TOKEN }}' run: | covr::codecov( quiet = FALSE, From 996b1145b2fccfa236d0da449f7222915e539526 Mon Sep 17 00:00:00 2001 From: Jon Harmon Date: Tue, 10 Mar 2026 07:24:00 -0500 Subject: [PATCH 7/7] Match usethis. --- .github/workflows/test-coverage.yaml | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index f7d4f0e..2ef4dbf 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -22,21 +22,30 @@ jobs: cache-version: "1" - name: Test coverage - env: - CODECOV_TOKEN: '${{ secrets.CODECOV_TOKEN }}' run: | - covr::codecov( + cov <- covr::package_coverage( quiet = FALSE, clean = FALSE, - install_path = file.path(Sys.getenv("RUNNER_TEMP"), "package") + install_path = file.path(normalizePath(Sys.getenv("RUNNER_TEMP"), winslash = "/"), "package") ) + print(cov) + covr::to_cobertura(cov) shell: Rscript {0} + - uses: codecov/codecov-action@v5 + with: + # Fail if error if not on PR, or if on PR and token is given + fail_ci_if_error: ${{ github.event_name != 'pull_request' || secrets.CODECOV_TOKEN }} + files: ./cobertura.xml + plugins: noop + disable_search: true + token: ${{ secrets.CODECOV_TOKEN }} + - name: Show testthat output if: always() run: | ## -------------------------------------------------------------------- - find ${{ runner.temp }}/package -name 'testthat.Rout*' -exec cat '{}' \; || true + find '${{ runner.temp }}/package' -name 'testthat.Rout*' -exec cat '{}' \; || true shell: bash - name: Upload test results