- Notifications
You must be signed in to change notification settings - Fork0
GitHub Action that saves time and money in monorepo environments
License
crossnokaye/has-changed-path
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
This action outputs whether a path or combination of paths has changed in the previous commit.
It solves a common issue among monorepo setups: conditional actions. Deploying a project that did not change in the previous commit could be a waste of time and resources.
With this action,you know if a deployment or any other job needs to run based on the changed paths of the most recent commit.
It differs fromGitHub's paths as our action is meant to be used inside your job steps, not at the root of your workflow file (seethis issue).
My recommendation is to put this action in a workflow that runs on every push tomaster
.
paths
(required): Path to detect changes. It's possible to pass one path, a combination or a wildcard. Valid options include:packages/front
,packages/front packages/shared
,packages/**/tests
. See workflow examples below for more information.
changed
: boolean indicating if the paths changed at the latest commit
Notice thatyou must configurefetch-depth
in youractions/checkout@v2
. That's because their default option now is to fetch only the latest commit instead of all history (more info)
If you want to fetch all history, passfetch-depth: 0
.
For monorepo packages, where history tends to be larger than single repos, it may take a while fetching all of it. That's why we usedfetch-depth: 100
in the examples. It will fetch the latest 100 commits.
name:Conditional Deployon:pushjobs:build:runs-on:ubuntu-lateststeps: -uses:actions/checkout@v2with:fetch-depth:100 -uses:marceloprado/has-changed-path@v2id:changed-frontwith:paths:packages/front -name:Deploy frontif:steps.changed-front.outputs.changed == 'true'run:/deploy-front.sh
Useful when you have dependencies between packages (eg./common
package used in/front
and/server
).Below, the output would be truthy for any given change insidepackages/front
orpackages/common
.
name:Conditional Deployon:pushjobs:build:runs-on:ubuntu-lateststeps: -uses:actions/checkout@v2with:fetch-depth:100 -uses:marceloprado/has-changed-path@v2id:changed-frontwith:paths:packages/front packages/common -name:Deploy frontif:steps.changed-front.outputs.changed == 'true'run:/deploy-front.sh
name:Conditional Deployon:pushjobs:build:runs-on:ubuntu-lateststeps: -uses:actions/checkout@v2with:fetch-depth:100path:main -uses:actions/checkout@v2with:fetch-depth:100repsitory:my-org/my-toolspath:my-tools -uses:marceloprado/has-changed-path@v2id:changed-mainwith:paths:packages/frontenv:SOURCE:main -uses:marceloprado/has-changed-path@v2id:changed-my-toolswith:paths:somewhere/elseenv:SOURCE:my-tools -name:Deploy mainif:steps.changed-main.outputs.changed == 'true'run:/deploy-main.sh -name:Deploy my toolsif:steps.changed-my-tools.outputs.changed == 'true'run:/deploy-my-tools.sh
The action itself is pretty simple - take a look atsrc/hasChanged.js
;) .
Basically, we compare the latest HEAD with the previous one usinggit diff
command. This allows us to effectively detect changes in most cases (squashed merges and merges with merge commit).
The algorithm works very similar withNetlify's default way for detecting changes in monorepo builds.
Have any thoughts or suggestions? Please, open an issue and I'll be happy to improve this action!
About
GitHub Action that saves time and money in monorepo environments
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Languages
- JavaScript100.0%