Setting Up Changesets and GitHub Actions for CI/CD in a Frontend Monorepo Utility Library
This article walks through configuring @changesets in a pnpm-managed monorepo, automating versioning and changelog generation, adding GitHub Actions for CI/CD and documentation deployment, and outlines contribution guidelines for a frontend utility library, illustrating the full open‑source workflow.
The author introduces a new open‑source frontend utility library called vemjs and explains why establishing a robust contribution process is essential for collaborative development.
1. Using the changeset workflow
Install the Changesets CLI, initialise the configuration, and add the required scripts to package.json:
pnpm i @changesets/cli -Dw pnpm changeset init {
"$schema": "<https://unpkg.com/@changesets/[email protected]/schema.json>",
"changelog": "@changesets/cli/changelog",
"commit": true,
"fixed": [],
"linked": [],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": []
} "scripts": {
"change": "changeset add",
"change:version": "changeset version",
"release": "pnpm build && pnpm release:only",
"release:only": "changeset publish"
}Run pnpm change to create a markdown changeset file, answer the prompts (packages, version bump, description), then execute pnpm change:version to apply the version updates and generate a CHANGELOG.md entry.
Optionally, enhance the changelog with @changesets/changelog-github:
pnpm i @changesets/changelog-github -Dw {
...,
"changelog": ["@changesets/changelog-github", { "repo": "vmejs/vmejs" }],
...
}Set the GITHUB_TOKEN environment variable (Windows: set GITHUB_TOKEN=YourToken, macOS/Linux: export GITHUB_TOKEN=YourToken) to allow the GitHub‑based changelog generator to work.
2. CI/CD with GitHub Actions
Create .github/workflows/release.yml to publish on every push to main:
# https://docs.github.com/en/actions/using-workflows/about-workflows
name: Release
on:
push:
branches:
- main
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 16.x
- name: Setup Pnpm
uses: pnpm/action-setup@v2
with:
version: 7.x
- name: Install dependencies
run: pnpm install --no-frozen-lockfile --ignore-scripts
- name: Create Release Pull Request or Publish to npm
uses: changesets/action@v1
with:
publish: pnpm release
version: pnpm change:version
commit: 'chore: version packages'
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Another workflow .github/workflows/docs-deploy.yml builds the VitePress documentation and pushes it to the gh-pages branch:
name: docs-deploy
on:
push:
branches: [main]
jobs:
docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Install pnpm
uses: pnpm/action-setup@v2
with:
version: 7
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: '16'
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --no-frozen-lockfile --ignore-scripts
- name: Build vitepress site
run: pnpm docs:build
env:
DOC_ENV: preview
NODE_OPTIONS: --max-old-space-size=4096
- name: Deploy to GitHub Pages
uses: crazy-max/ghaction-github-pages@v2
env:
GITHUB_TOKEN: ${{ secrets.ACTION_SECRET }}
with:
target_branch: gh-pages
build_dir: packages/.vitepress/dist3. Contribution Guide
Prerequisites: Node.js ≥ 16 and PNPM v7. Clone the repository, install dependencies, and create a feature branch (e.g., feature-getDevice). Implement the function, add unit tests, write documentation, and run the standard scripts ( pnpm dev, pnpm build, pnpm test, pnpm lint, etc.).
Before pushing, generate a changeset ( pnpm change), then commit following the conventional commit format ( type(scope): subject, e.g., feat(user): add user‑center feature). Finally, open a Pull Request to main; after approval, the CI workflow will automatically publish the new version.
4. Project Structure
root
├── docs # documentation
│ ├── guide
│ └── packages/core/getDevice/index.md
├── packages
│ ├── core # utility functions (e.g., getDevice)
│ └── shared # shared helpers
└── playground # local development sandboxThe core/getDevice package contains index.ts (implementation) and index.test.ts (unit tests).
5. Why Open Source?
Open sourcing the library encourages collaboration, accelerates innovation, and spreads responsibility among contributors. A well‑maintained utility library benefits from many contributors, improves code quality, and reaches a broader audience.
Conclusion
By integrating Changesets, GitHub Actions, and clear contribution guidelines, the project achieves automated versioning, changelog generation, CI testing, and documentation deployment, providing a solid foundation for a sustainable frontend utility library.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Rare Earth Juejin Tech Community
Juejin, a tech community that helps developers grow.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
