DEV Community

Cover image for šŸ”Ø Useful lib workflows with GitHub actions
KrisztiƔn Maurer
KrisztiƔn Maurer

Posted on

šŸ”Ø Useful lib workflows with GitHub actions

If you are a lib maintainer GitHub actions makes your life easier. In this article I will write about my current useful workflows: checks, release, publish to npm, husky commit hooks, and changelog generation.

Checks

Check every commit: run test, (you can add lint check, etc)

name: checks on: push: branches: - main jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 with: node-version: 16 - run: npm ci - run: npm run test 
Enter fullscreen mode Exit fullscreen mode

Publish workflow:

Publish the library to npmjs when the release is created or you can trigger it manually

name: Publish Package to npmjs on: release: types: [created] workflow_dispatch: jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm - uses: actions/setup-node@v3 with: node-version: '16.x' registry-url: 'https://registry.npmjs.org' - run: npm ci - run: npm run npmjs-publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 
Enter fullscreen mode Exit fullscreen mode

Requires an NPM_TOKEN.
It runs the package.json publish script: generate indexes, build the project, copy the *.json *.md files (package.json, readme, changelog...), and publish the build folder

 "npmjs-publish": "rm -rf ./build && npm run generate-index && npm run build && cp *.json ./build && cp *.md ./build && npm publish ./build", "generate-index": "cti clean ./lib && cti create ./lib" 
Enter fullscreen mode Exit fullscreen mode

For the index generation I use the "create-ts-index" npm package, it give you a nice cli "cti".

Release workflow:

Create new version (update package.json version), tag, create changelog, put the changelog to the release notes - based on conventional commits

name: Releases on: workflow_dispatch: jobs: changelog: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: conventional Changelog Action id: changelog uses: TriPSs/conventional-changelog-action@v3.7.1 with: github-token: ${{ secrets.MY_GITHUB_TOKEN }} version-file: './package.json,./package-lock.json' - name: create release uses: actions/create-release@v1 if: ${{ steps.changelog.outputs.skipped == 'false' }} env: GITHUB_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }} with: tag_name: ${{ steps.changelog.outputs.tag }} release_name: ${{ steps.changelog.outputs.tag }} body: ${{ steps.changelog.outputs.clean_changelog }} 
Enter fullscreen mode Exit fullscreen mode

The GITHUB_TOKEN is a special access token that you can use to authenticate on behalf of GitHub Actions. GitHub automatically creates a GITHUB_TOKEN secret for you to use in your workflow, and you can use it to authenticate in a workflow run.

In my case, I thought it will make sense to use it but If I use it the publish workflow will not run

"When you use the repository's GITHUB_TOKEN to perform tasks on behalf of the GitHub Actions app, events triggered by the GITHUB_TOKEN will not create a new workflow run. This prevents you from accidentally creating recursive workflow runs."

So I ended up creating a personal token MY_GITHUB_TOKEN

Enforce conventional commits:

The changelog is generated from conventional commits (Releases workflow) so useful to check the commit message before created. You can use Husky pre-commit hooks for this.

Husky setup:

npm install husky --save-dev npm set-script prepare "husky install" npm run prepare 
Enter fullscreen mode Exit fullscreen mode

Add the pre-commit commit mesage checker:

npx husky add .husky/commit-msg 'npx --no -- commitlint --edit ${1}' 
Enter fullscreen mode Exit fullscreen mode

If the commit message is not conventional it will not allow to commit it.

Maybe someone forgets to run a test before committing the changes the "check" workflow will fail but we can catch this locally when someone makes a commit:

pre-commit npm test

npx husky add .husky/pre-commit "npm test" 
Enter fullscreen mode Exit fullscreen mode

eg.
git commit -m "Keep calm and commit"
npm test will run

Currently, I using these in this repo: https://github.com/OpenZer0/type-chef-di

There are maybe better solutions because I'm not an expert, If you can improve something please leave a comment.

Thank you for reading, I hope this was helpful 😊

Top comments (0)