A GitHub Action to backport documentation changes between folders in Docusaurus projects. This action is specifically designed for the loft-sh/vcluster-docs repository structure.
This action automatically backports changes from main documentation folders (vcluster, platform) to versioned documentation folders when PRs are merged or labeled with version-specific labels.
Create a workflow file in your repository:
name: Backport Documentation
on:
pull_request:
types: [closed, labeled]
paths:
- 'vcluster/**'
- 'platform/**'
jobs:
backport:
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true ||
(github.event.action == 'labeled' && startsWith(github.event.label.name, 'backport-v'))
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Backport Docusaurus Changes
uses: loft-sh/docs-backport-action@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
## Inputs
- `github_token`: GitHub token to authenticate API requests (required)
## Outputs
A file whose versioned copy has diverged from what the PR changed is left unchanged and reported as a conflict. So is a file the version has no matching place for: a modified or renamed file that doesn't exist at the same path in the version, or an added file whose folder the version lacks. After a docs restructure, those pages live at different paths in older versions, and copying them by path would publish duplicate pages. Conflicts get a comment on the original PR, but the run still succeeds, so use these outputs to alert someone:
- `conflicts`: JSON array with one entry per version that has conflicts, for example `[{"folder":"vcluster","version":"0.37","files":["vcluster_versioned_docs/version-0.37.0/guide.mdx"],"comment_url":"https://github.com/..."}]`. Empty when every file applied cleanly.
- `summary`: plain-text lines naming each version that needs a person: its conflicting files and the comment URL, or why its backport failed. Empty when nothing needs attention.
Both outputs are set on failed runs too, so a notification step can report what was done before the failure:
```yaml
- name: Backport Docusaurus Changes
id: backport
uses: loft-sh/docs-backport-action@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: Notify on conflicts or failure
if: failure() || steps.backport.outputs.conflicts != ''
run: echo "$SUMMARY"
env:
SUMMARY: ${{ steps.backport.outputs.summary }}Add labels to PRs to specify which version(s) to backport to:
backport-v0.22- Backport to vcluster v0.22backport-v4.2- Backport to platform v4.2
- Node.js 20.x
- npm
# Install dependencies
npm install
# Run tests
npm test
# Build the action
npm run build# Run all tests
npm test
# Run tests in watch mode
npm run test:watch
# Run tests with coverage
npm run test:coverage- Changes pushed to the
mainbranch are automatically tested. - To create a new release, use the "Release" GitHub workflow with the desired version number.
- After a release is created, the major version tag (e.g.,
v1) is automatically updated.
If you need to manually update the v1 tag to point to the current commit:
# Update the local v1 tag to point to the current commit
git tag -f v1
# Force push the updated tag to the remote repository
# Use --no-verify if you have pre-push hooks that would block the push
git push -f origin v1 --no-verifyMIT