The main repository for Quetzal is GitLab. Please create issues and questions there. Github is a mirror of that repo
Quetzal is a GitLab bot written in Go. It takes inspiration from the GitLab Triage Bot.
The easiest way is using Docker.
docker run --name my-quetzal -v '/path/to/.policies.yaml:/.policies.yaml:ro' -e user="GitLab.User" -e token="your-token" -e bot="https://bot-server.com" -e host="https://custom-gitlab-instance.com" -e policies="./.policies.yaml" -d -p 7838:7838 jonny7/quetzal However, you can build the source yourself
go build -o quetzal ./cmd/quetzalReleases are available on GitLab detailing what the changes were. The containers are on dockerhub also.
You'll also see -dev tags for any containers that need patches.
-user string
the bot user (default "")
-token string
The personal access token for the bot (default "")
-bot string
The url the bot lives on eg https://your-domain.com (default "")
-webhook string
The endpoint to accept webhooks from (default "/webhook-endpoint")
-secret string
The webhook secret (default "")
-host string
The Gitlab instance (default "https://gitlab.com")
-port string
specified port (default "7838")
-dry bool
Whether to run quetzal as a dry-run that doesn't perform actions against GitLab (default false)
-policies string
The path to the policies file (default "./examples/.policies.yaml")
-version bool
Return the version of Quetzal (default false)
Quetzal uses the SemVer specification. To query the binary, use the -version flag
./quetzal -version
# Quetzal version 1.1.1At its heart, Quetzal is a yaml driven policy based bot. It needs some config parameters (listed above) and a policy file. The policy file is yaml based and has a default location provided. Please note this is relative to the Quetzal binary.
| File type | Default location |
|---|---|
| .policies.yaml | ./.policies.yaml |
You can see an example .policies.yaml in the examples directory.
Policies are what drives Quetzal. There are 5 main properties to a policy
A single Policy is declared as part of an array of the Policies property.
Is simply the name for this chosen policy
policies:
- name: Awesome Policy
#...
- name: Round robin assignee
#...The resource is the type of webhook this policy is for.
The available options are listed below and are the values of the X-Gitlab-Event header:
- Build Hook
- Deployment Hook
- Issue Hook
- Confidential Issue Hook
- Job Hook
- Merge Request Hook (In progress)
- Note Hook
- Confidential Note Hook
- Pipeline Hook
- Push Hook
- Release Hook
- System Hook
- Tag Push Hook
- Wiki Page Hook
policies:
- name: Assign MR
resource: Merge Request HookPolicy Conditions allow a user to specify a series of conditions that confirm that this webhook event be processed. All available options are type-safe and validated, once the policies file has been successfully parsed.
State must have the available options for hooks that have this property. You can apply a policy to multiple states
policies:
- name: Assign MR
resource: Merge Request Hook
conditions:
state:
- open
- updated Merge
- open
- close
- reopen
- update
- approved
- unapproved
- merge
Issue
- open
- close
- reopen
- update
Release
- create
- update
Milestone is the integer representation of the GitLab milestone
policies:
- name: Assign MR
resource: Merge Request Hook
conditions:
milestone: 5The Labels condition accepts an array of labels by name to filter webhooks on. The webhook must match all the provided labels on the policy to be valid. Additionally, labels are case-insensitive
policies:
- name: Assign MR
resource: Merge Request Hook
conditions:
labels:
- done
- pre-release The forbidden labels condition takes an array of labels by name and confirms that they are all absent from an applicable webhook.
policies:
- name: Assign MR
resource: Merge Request Hook
conditions:
forbiddenLabels:
- v1
- v2
actions:
comment: |
This MR needs to be tagged with either `v1` or `v2`The above would rule would be triggered if a merge request was missing both labels. So this is a way to identify issues or applicable types that are not labelled correctly.
Policy actions are what your bot performs when a webhook matching the policy pre-conditions is met.
The Labels action of a policy will update the issue's Labels if it has the ability to have Labels.
The RemoveLabels field will remove any labels on an issue.
...
actions:
labels:
- approved
removeLabels:
- pre-approvedThe Status field allows you to set the state of an issue, if that issue has a state.
The Mention field accepts an array of username in the format without the @ symbol. This field is often used in conjunction with Comment.
The Comment field is the text you wish to use to reply to an issue. If possible.
...
actions:
mention:
- jonny7
comment: |
Please look at this important issue.
// would leave a reply of "@jonny7 Please look at this important issue."All contributions are welcome, please open an issue/feature req at GitLab
The Quetzal icon is attributed to FreePick