2019-08-08 13:07:40 -04:00
# Pull Request Labeler
2019-03-29 15:21:48 -07:00
2023-01-31 08:47:18 +02:00
[](https://github.com/actions/labeler/actions/workflows/basic-validation.yml)
2021-06-03 12:43:19 -04:00
Automatically label new pull requests based on the paths of files being changed.
2019-03-29 15:21:48 -07:00
2019-09-26 16:53:38 +01:00
## Usage
2019-03-29 15:21:48 -07:00
2019-09-26 16:53:38 +01:00
### Create `.github/labeler.yml`
Create a `.github/labeler.yml` file with a list of labels and [minimatch ](https://github.com/isaacs/minimatch ) globs to match to apply the label.
2023-06-13 13:21:58 -04:00
The key is the name of the label in your repository that you want to add (e.g. `merge conflict` , `needs-updating` ) and the value is the path (glob) of the changed files (e.g. `src/**` , `tests/*.spec.js` ) or a match object.
2020-06-01 14:01:37 -07:00
#### Match Object
For more control over matching, you can provide a match object instead of a simple path glob. The match object is defined as:
``` yml
- any : [ 'list' , 'of' , 'globs' ]
all : [ 'list' , 'of' , 'globs' ]
```
One or both fields can be provided for fine-grained matching. Unlike the top-level list, the list of path globs provided to `any` and `all` must ALL match against a path for the label to be applied.
The fields are defined as follows:
* `any` : match ALL globs against ANY changed path
* `all` : match ALL globs against ALL changed paths
A simple path glob is the equivalent to `any: ['glob']` . More specifically, the following two configurations are equivalent:
``` yml
label1 :
- example1/*
```
and
``` yml
label1 :
- any : [ 'example1/*' ]
```
2021-06-03 12:39:48 -04:00
From a boolean logic perspective, top-level match objects are `OR` -ed together and individual match rules within an object are `AND` -ed. Combined with `!` negation, you can write complex matching rules.
2019-09-26 16:53:38 +01:00
2023-06-02 16:06:39 +01:00
> ⚠️ This action uses [minimatch](https://www.npmjs.com/package/minimatch) to apply glob patterns.
2022-02-04 13:54:21 +00:00
> For historical reasons, paths starting with dot (e.g. `.github`) are not matched by default.
> You need to set `dot: true` to change this behavior.
> See [Inputs](#inputs) table below for details.
2019-09-26 16:53:38 +01:00
#### Basic Examples
``` yml
# Add 'label1' to any changes within 'example' folder or any subfolders
2019-08-08 13:07:40 -04:00
label1 :
2022-10-05 14:37:24 +01:00
- example/**
2019-03-29 15:21:48 -07:00
2019-09-26 16:53:38 +01:00
# Add 'label2' to any file changes within 'example2' folder
2019-08-08 13:07:40 -04:00
label2 : example2/*
2022-12-21 15:59:36 +01:00
# Add label3 to any change to .txt files within the entire repository. Quotation marks are required for the leading asterisk
label3 :
- '**/*.txt'
2019-09-26 16:53:38 +01:00
```
2019-03-29 15:21:48 -07:00
2019-09-26 16:53:38 +01:00
#### Common Examples
``` yml
# Add 'repo' label to any root file changes
repo :
2021-06-21 23:42:43 +02:00
- '*'
2021-06-03 12:39:48 -04:00
2019-09-26 16:53:38 +01:00
# Add '@domain/core' label to any change within the 'core' package
2021-11-23 20:57:39 -05:00
'@domain/core' :
2022-10-05 14:37:24 +01:00
- package/core/**
2019-09-26 16:53:38 +01:00
# Add 'test' label to any change to *.spec.js files within the source dir
test :
2021-06-03 12:39:48 -04:00
- src/**/*.spec.js
2020-06-01 14:01:37 -07:00
# Add 'source' label to any change to src files within the source dir EXCEPT for the docs sub-folder
source :
2022-10-05 14:37:24 +01:00
- any : [ 'src/**' , '!src/docs/*' ]
2020-06-01 14:01:37 -07:00
# Add 'frontend` label to any change to *.js files as long as the `main.js` hasn't changed
frontend :
- any : [ 'src/**/*.js' ]
all : [ '!src/main.js' ]
2023-06-30 15:44:16 +02:00
# Add the 'AnyChange' label to any changes within the entire repository if the 'dot' option is set to 'false'
AnyChange :
- '**'
- '**/.*'
- '**/.*/**'
- '**/.*/**/.*'
# Add the 'AnyChange' label to any changes within the entire repository if the 'dot' option is set to 'true'
AnyChange :
- '**'
2019-08-08 13:07:40 -04:00
```
2019-09-12 10:42:28 -07:00
2019-09-26 16:53:38 +01:00
### Create Workflow
2023-06-13 13:19:04 -04:00
Create a workflow (e.g. `.github/workflows/labeler.yml` see [Creating a Workflow file ](https://help.github.com/en/articles/configuring-a-workflow#creating-a-workflow-file )) to utilize the labeler action with content:
2019-09-12 10:42:28 -07:00
2021-12-18 14:24:46 +05:30
``` yml
2019-08-08 13:07:40 -04:00
name : "Pull Request Labeler"
2019-09-12 10:42:28 -07:00
on :
2020-09-09 03:33:55 +09:00
- pull_request_target
2019-08-08 13:07:40 -04:00
jobs :
triage :
2022-02-02 15:43:53 +00:00
permissions :
contents : read
pull-requests : write
2019-08-08 13:07:40 -04:00
runs-on : ubuntu-latest
steps :
2022-03-01 12:12:44 -05:00
- uses : actions/labeler@v4
2019-03-29 15:21:48 -07:00
```
2019-09-26 16:53:38 +01:00
2020-09-08 14:49:21 -04:00
#### Inputs
Various inputs are defined in [`action.yml` ](action.yml ) to let you configure the labeler:
2023-07-07 06:44:54 -04:00
| Name | Description | Default |
|----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------|
2023-07-11 14:59:31 +02:00
| `repo-token` | Token to use to authorize label changes. Typically the GITHUB_TOKEN secret | `github.token` |
2023-07-07 06:44:54 -04:00
| `configuration-path` | The path to the label configuration file. If the file doesn't exist at the specified path on the runner, action will read from the source repository via the Github API. | `.github/labeler.yml` |
| `sync-labels` | Whether or not to remove labels when matching files are reverted or no longer changed by the PR | `false` |
| `dot` | Whether or not to auto-include paths starting with dot (e.g. `.github` ) | `false` |
| `pr-number` | The number(s) of pull request to update, rather than detecting from the workflow context | N/A |
##### Using `configuration-path` input together with the `@actions/checkout` action
You might want to use action called [@actions/checkout ](https://github.com/actions/checkout ) to upload label configuration file onto the runner from the current or any other repositories. See usage example below:
``` yml
steps :
- uses : actions/checkout@v3 # Uploads repository content to the runner
with :
repository : "owner/repositoryName" # The one of the available inputs, visit https://github.com/actions/checkout#readme to find more
- uses : actions/labeler@v4
```
##### Peculiarities of using the `dot` input
2021-06-03 12:43:19 -04:00
2023-07-06 16:10:50 +01:00
When `dot` is disabled, and you want to include _ all _ files in a folder:
2022-02-04 13:26:54 +00:00
``` yml
label1 :
- path/to/folder/**/*
- path/to/folder/**/.*
```
If `dot` is enabled:
``` yml
label1 :
2022-10-05 14:37:24 +01:00
- path/to/folder/**
2022-02-04 13:26:54 +00:00
```
2023-07-06 16:10:50 +01:00
##### Example workflow specifying Pull request numbers
``` yml
name : "Label Previous Pull Requests"
on :
schedule :
- cron : "0 1 * * 1"
jobs :
triage :
permissions :
contents : read
pull-requests : write
runs-on : ubuntu-latest
steps :
# Label PRs 1, 2, and 3
- uses : actions/labeler@v4
with :
pr-number : |
1
2
3
```
**Note: ** in normal usage the `pr-number` input is not required as the action will detect the PR number from the workflow context.
2023-06-29 03:45:24 -07:00
#### Outputs
Labeler provides the following outputs:
| Name | Description |
|--------------|-----------------------------------------------------------|
| `new-labels` | A comma-separated list of all new labels |
| `all-labels` | A comma-separated list of all labels that the PR contains |
The following example performs steps based on the output of labeler:
``` yml
name : "My workflow"
on :
- pull_request_target
jobs :
triage :
permissions :
contents : read
pull-requests : write
2023-07-31 21:40:58 +09:00
runs-on : ubuntu-latest
2023-06-29 03:45:24 -07:00
steps :
- id : label-the-PR
2023-07-05 11:21:49 +02:00
uses : actions/labeler@v4
2023-06-29 03:45:24 -07:00
- id : run-frontend-tests
2023-07-05 11:21:49 +02:00
if : contains(steps.label-the-PR.outputs.all-labels, 'frontend')
2023-06-29 03:45:24 -07:00
run : |
echo "Running frontend tests..."
# Put your commands for running frontend tests here
- id : run-backend-tests
2023-07-05 11:21:49 +02:00
if : contains(steps.label-the-PR.outputs.all-labels, 'backend')
2023-06-29 03:45:24 -07:00
run : |
echo "Running backend tests..."
# Put your commands for running backend tests here
```
2023-01-24 16:53:46 -08:00
## Permissions
In order to add labels to pull requests, the GitHub labeler action requires
write permissions on the pull-request. However, when the action runs on a pull
request from a forked repository, GitHub only grants read access tokens for
2023-06-13 13:21:58 -04:00
`pull_request` events, at most. If you encounter an `Error: HttpError: Resource
not accessible by integration` , it's likely due to these permission constraints.
2023-01-24 16:53:46 -08:00
To resolve this issue, you can modify the `on:` section of your workflow to use
2023-06-13 13:21:58 -04:00
[`pull_request_target` ](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target )
2023-01-24 16:53:46 -08:00
instead of `pull_request` (see example [above ](#create-workflow )). This change
2023-06-13 13:21:58 -04:00
allows the action to have write access, because `pull_request_target` alters the
2023-01-24 16:53:46 -08:00
[context of the
action ](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target )
and safely grants additional permissions. Refer to the [GitHub token
permissions
documentation ](https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token )
for more details about access levels and event contexts.
2022-02-04 13:26:54 +00:00
## Contributions
2021-06-03 12:43:19 -04:00
Contributions are welcome! See the [Contributor's Guide ](CONTRIBUTING.md ).