https://github.com/danny-andrews/thresh
A CircleCI Plugin for posting bundle diffs to your GitHub PRs.
https://github.com/danny-andrews/thresh
bundle circleci diff github size
Last synced: 10 months ago
JSON representation
A CircleCI Plugin for posting bundle diffs to your GitHub PRs.
- Host: GitHub
- URL: https://github.com/danny-andrews/thresh
- Owner: danny-andrews
- Created: 2017-06-30T21:51:55.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2024-02-14T14:59:05.000Z (almost 2 years ago)
- Last Synced: 2024-10-12T09:18:52.722Z (over 1 year ago)
- Topics: bundle, circleci, diff, github, size
- Language: JavaScript
- Homepage:
- Size: 1.16 MB
- Stars: 4
- Watchers: 3
- Forks: 2
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# thresh
## Separate the wheat from the chaff in your build files!

`thresh` is a CI integration for tracking file size changes across builds. Pluggable for different CI providers. (Currently plugins only exist for CircleCI.)
## What it Does
At its core, thresh does two things:
1. Outputs file sizes of files targeted by your thresh config. (Where and how these are output depends on the `artifactStore` plugin you use.)
1. If the current bulid is associated with an existing PR, it posts a commit status. This status will be `success` if there are no target files which violate size thresholds defined in your thresh config, `failure` if there are target files which violate sizes thresholds, and `error` if any errors were encountered. The contents of this status will contain target diffs if they could be calculated.
Example target-sizes.json:
```json
[
{
"filepath": "example/dist/app1.js",
"size": 53
},
{
"filepath": "example/dist/app2.js",
"size": 95
}
]
```
Example target-diffs.json:
```json
{
"diffs": [
{
"targets": [
"example/dist/*.js"
],
"previous": 148,
"current": 148,
"difference": 0,
"percentChange": 0
}
],
"failures": []
}
```
## CLI Options
### --config-path
- Description: Filepath to your thresh conifg file.
- Type: `String`
- Default: `./.threshrc.toml`
## Setup
### Create threshrc.toml File
A threshrc config file has the following format:
```
type Config = {
thresholds :: [Threshold],
artifactStore :: String,
ciAdapter :: String
}
```
where:
- `thresholds` - A list of configuration objects used to determine the conditions under which the [GitHub status](https://developer.github.com/v3/repos/statuses/#create-a-status) will be posted as "failed."
- `artifactStore = '@danny-andrews/thresh-artifact-store-circleci'` - The module name of the artifact store plugin you want to use. (Defaults to CircleCI.)
- `ciAdapter = '@danny-andrews/thresh-ci-adapter-circleci'` - The module name of the CI adapter you want to use. (Defaults to CircleCI.)
With `Threshold` being:
```
type Threshold = {
targets: String | [String],
maxSize: Number
}
```
where:
- `targets` - The target(s) of the threshold. Each target can be either a file path or a glob.
- `maxSize` - The max size of the total of all the files selected by `targets`.
Example config file:
```toml
[[thresholds]]
targets = "dist/*.js"
maxSize = 20000
```
This example would post a failed GitHub status if the total size of all JavaScript files contained in the `dist` directory was larger than 20kB.
### Define Environment Variables
- `GITHUB_API_TOKEN`
- Must have read access to repository (`public_repo` scope for public repos, and `repo` scope for private repos)
- Must have `repo:status` scope
(Check out the README of the artifact store plugin you are using for any additional environment variable requirements.)
## Comparison with Other Offerings
| | [bundlesize](https://github.com/siddharthkp/bundlesize) | [buildsize](https://buildsize.org/) | [thresh](https://github.com/danny-andrews/thresh) |
| --- | :---: | :---: | :---: |
| Handles Fingerprinting? | Y | Y | Y |
| Posts PR Status Filesize Diffs? | Y | Y | Y |
| Relies on 3rd-party service? | Y | Y | N |
| CIs Supported | Travis CI, CircleCI, Wercker, and Drone | Circle CI | Circle CI, easy to add more |
| Configuration | Expose GitHub access token to environment | None | Expose GitHub/CircleCI access token to environment |
## Writing plugins
### `ciAdapter` Plugins
A valid thresh ci adapter is just a function which returns an object with the following type:
```
type CIAdapter = {
isRunning :: () -> Boolean
getEnvVars :: () -> EnvVars
}
type EnvVars = {
buildSha :: String,
buildUrl :: String,
artifactsDirectory :: String,
repoOwner :: String,
repoName :: String,
pullRequestId :: Maybe String
}
```
### `artifactStore` Plugins
A valid thresh artifactStore is just a function which returns an object with the following type:
```
type ArtifactStore = {
getTargetStats :: (baseBranch = String)
-> (targetStatsFilepath = String)
-> ReaderPromise TargetStat
}
type TargetStat = {
filepath :: String,
size :: Int
}
```
## Future Plans
Create more plugins for different CI environments.