Background
There was a need to regularly run npm update
to keep dependency packages up to date, but doing it manually was cumbersome, so I wanted to automate it using GitHub Actions.
Specifications
- Execute the workflow every Monday.
- Run
npm update
. - Check if
package-lock.json
has been updated. - Commit
package-lock.json
and create a Pull Request.
Implementation
1. Execute the Workflow Every Monday
on:
schedule:
- cron: '0 0 * * 1'
2. Run npm update
- name: Update packages
run: npm update
3. Check for Changes in package-lock.json
- name: Check for changes
id: git-check
run: |
git diff --exit-code || echo "changes=true" >> $GITHUB_OUTPUT
Check for differences using git diff --exit-code
. If there are changes, the exit code
becomes 1, and changes=true
is added to $GITHUB_OUTPUT
.
4. Create a Pull Request
First, execute only if there are changes using if: ${{ steps.git-check.outputs.changes == 'true' }}
.
For creating Pull Requests, use the action peter-evans/create-pull-request. This action allows batch specification of commits (add-paths
), so it handles everything from committing package-lock.json
to creating the Pull Request.
The Create Pull Request action will:
- Check for repository changes in the Actions workspace. This includes:
- untracked (new) files
- tracked (modified) files
- commits made during the workflow that have not been pushed
- Commit all changes to a new branch, or update an existing pull request branch.
- Create a pull request to merge the new branch into the base—the branch checked out in the workflow.
The definition is as follows:
- name: Create Pull Request
if: ${{ steps.git-check.outputs.changes == 'true' }}
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.BOT_TOKEN }}
base: develop
add-paths: package-lock.json
commit-message: Update npm dependencies
title: '[Automated] Update npm dependencies'
body: 'Automated changes by GitHub Actions'
branch: automated-npm-update
delete-branch: true
Specifying token
as ${{ secrets.GITHUB_TOKEN }}
is also fine, but if you want to trigger another Actions workflow, you need to prepare a different token.
Additionally, even if executed consecutively, commits will be made to the same branch, and the Pull Request will be updated (without failing to create a new Pull Request).
Final Workflow
The workflow created is broadly as follows:
name: Automated npm update
on:
schedule:
- cron: '0 0 * * 1'
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
npm-update:
env:
pr_title: '[Automated] Update NPM dependencies'
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.node-version'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Update packages
run: npm update
- name: Check for changes
id: git-check
run: |
git diff --exit-code || echo "changes=true" >> $GITHUB_OUTPUT
- name: Create Pull Request
if: ${{ steps.git-check.outputs.changes == 'true' }}
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets
.BOT_TOKEN }}
base: develop
add-paths: package-lock.json
commit-message: Update npm dependencies
title: ${{ env.pr_title }}
body: 'Automated changes by GitHub Actions'
branch: automated-npm-update
delete-branch: true
Top comments (1)
great post about npm and github actions :)