gitlab-triage 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 07c73a42510a969fbfbd9d37b8c0cf3aa5b7194f411845ffa85df71bdd17e014
4
- data.tar.gz: 92c16e24e3b60a68cbda012ca44cbef9e20e3d8143425ef6506db0817ee2e80d
3
+ metadata.gz: 0b9611f0a3f4f58779cf16cfa76d2dc93889646dc7566b8dc75116838f362940
4
+ data.tar.gz: 6d8c4675ead2c209ab18df6f8bb6068cf9c2a80f262d7d6759921f90679f1e47
5
5
  SHA512:
6
- metadata.gz: e078932be7f117f6f6c4ad1bed68b8fb217dec19ffb60d0010507f009cdaeb1c21e718d729795317eaae4c91c30ddaed6acf16c0f75c03859516e23893af7d6f
7
- data.tar.gz: c228d7ae359adcc1b4d1f8b9e058242a28f8c7c7f9500e7670c1ee9808d6098e7424c266188d3ebb0c9bd7c4bbe7354ff9dd1feac8a31167d54a28b14014106e
6
+ metadata.gz: 521a204ed0b650f6f31d8cb78583525ea58f2fb9378db976bf1a1e42af3a58b475480c8128cc59f43fdf065214e23557356502c4ee2340d444806fe56a3cfe33
7
+ data.tar.gz: a9d972bdd97dc71c4759849ec6b17a6a0f1f0bfc634c3aaf9c895b1f5e7e53a119642ebad19b39ffb156a583efaf06c0ce6a5b5cfb6f27cb384fc963252e215b
data/.gitlab-ci.yml CHANGED
@@ -54,15 +54,6 @@ specs:
54
54
  script:
55
55
  - bundle exec rake spec
56
56
 
57
- build:
58
- <<: *pull-cache
59
- stage: test
60
- script:
61
- - bundle exec rake build
62
- - bundle exec rake clobber
63
- except:
64
- - schedules
65
-
66
57
  codequality:
67
58
  <<: *pull-cache
68
59
  image: docker:latest
@@ -94,7 +85,9 @@ dry-run:bin:gitlab-org/triage:
94
85
  <<: *pull-cache
95
86
  stage: triage
96
87
  script:
97
- - bundle exec bin/gitlab-triage --dry-run --token $API_TOKEN --project-id gitlab-org/triage
88
+ - bundle exec rake install:local
89
+ - gitlab-triage --help
90
+ - gitlab-triage --dry-run --token $API_TOKEN --project-id $CI_PROJECT_PATH
98
91
  except:
99
92
  - schedules
100
93
 
@@ -102,7 +95,9 @@ dry-run:bin:gitlab-org/gitlab-ce:
102
95
  <<: *pull-cache
103
96
  stage: triage
104
97
  script:
105
- - bundle exec bin/gitlab-triage --dry-run --token $API_TOKEN --project-id gitlab-org/gitlab-ce
98
+ - bundle exec rake install:local
99
+ - gitlab-triage --help
100
+ - gitlab-triage --dry-run --token $API_TOKEN --project-id gitlab-org/gitlab-ce
106
101
  when: manual
107
102
  except:
108
103
  - schedules
@@ -113,7 +108,7 @@ dry-run:gem:gitlab-org/triage:
113
108
  script:
114
109
  - gem install gitlab-triage
115
110
  - gitlab-triage --help
116
- - gitlab-triage --dry-run --token $API_TOKEN --project-id gitlab-org/triage
111
+ - gitlab-triage --dry-run --token $API_TOKEN --project-id $CI_PROJECT_PATH
117
112
  when: manual
118
113
  except:
119
114
  - schedules
@@ -133,6 +128,6 @@ run:triage:triage:
133
128
  stage: triage
134
129
  script:
135
130
  - gem install gitlab-triage
136
- - gitlab-triage --token $API_TOKEN --project-id gitlab-org/triage
131
+ - gitlab-triage --token $API_TOKEN --project-id $CI_PROJECT_PATH
137
132
  only:
138
133
  - schedules
data/README.md CHANGED
@@ -1,13 +1,285 @@
1
1
  [![pipeline status](https://gitlab.com/gitlab-org/triage/badges/master/pipeline.svg)](https://gitlab.com/gitlab-org/triage/commits/master)
2
2
 
3
- ## GitLab Triage Project
3
+ # GitLab Triage Project
4
4
 
5
- This project contains scripts used for triaging Issues and Merge Requests in [GitLab-CE Project](https://gitlab.com/gitlab-org/gitlab-ce) projects and enforcing our Issue Triage policies as well of generating data related to triaging issues more effectively.
6
- The scripts found here may be useful for triaging issues in other projects too.
5
+ This project contains the library and pipeline definition to enable automated triaging of issues in the [GitLab-CE Project](https://gitlab.com/gitlab-org/gitlab-ce).
7
6
 
8
- - We define the policies in code in a public project where those interested can raise issues surrounding our policies.
9
- - We use scheduled pipelines to run the scripts to enforce our policies on a daily basis.
7
+ ## gitlab-triage gem
10
8
 
11
- ## Suggesting new policies or suggesting changes to policies
9
+ ### Summary
12
10
 
13
- Please feel free to [open an issue](https://gitlab.com/gitlab-org/triage/issues/new) about creating, editing or deleting a policy. Please select the policy issue template when creating an issue.
11
+ The `gitlab-triage` gem aims to enable project managers and maintainers to automatically triage Issues and Merge Requests in GitLab projects based on defined policies.
12
+
13
+ ### What is a triage policy?
14
+
15
+ Triage policies are defined on a resource level basis, resources being:
16
+ - Issues
17
+ - Merge Requests
18
+
19
+ Each policy can declare a number of conditions that must all be satisfied before a number of actions are carried out.
20
+
21
+ ### Defining a policy
22
+
23
+ Policies are defined in a policy file (by default [.triage-policies.yml](.triage-policies.yml)). The format of the file is [YAML](https://en.wikipedia.org/wiki/YAML).
24
+
25
+ > Note: You can use the [`--init`](#usage) option to add an example [`.triage-policies.yml` file](support/.triage-policies.example.yml) to your project
26
+
27
+ Select which resource to add the policy to:
28
+ - `issues`
29
+ - `merge_requests`
30
+
31
+ And create an array of `rules` to define your policies:
32
+
33
+ For example:
34
+
35
+ ```yml
36
+ resource_rules:
37
+ issues:
38
+ rules:
39
+ - name: My policy
40
+ conditions:
41
+ date:
42
+ attribute: updated_at
43
+ condition: older_than
44
+ interval_type: days
45
+ interval: 5
46
+ state: opened
47
+ label:
48
+ - No label
49
+ actions:
50
+ labels:
51
+ - needs attention
52
+ mention:
53
+ - markglenfletcher
54
+ comment: |
55
+ This issue is unlabelled after 5 days. It needs attention.
56
+ merge_requests:
57
+ rules:
58
+ []
59
+ ```
60
+
61
+ ### Fields
62
+
63
+ A policy consists of the following fields:
64
+ - [Name field](#name-field)
65
+ - [Conditions field](#conditions-field)
66
+ - [Actions field](#actions-field)
67
+
68
+ #### Name field
69
+
70
+ The name field is used to describe the purpose of the individual policy.
71
+
72
+ Example:
73
+
74
+ ```yml
75
+ name: Policy name
76
+ ```
77
+
78
+ #### Conditions field
79
+
80
+ Used to declare a condition that must be satisfied by a resource before actions will be taken.
81
+
82
+ Available condition types:
83
+ - [`date` condition](#date-condition)
84
+ - [`milestone` condition](#milestone-condition)
85
+ - [`state` condition](#state-condition)
86
+ - [`upvotes` condition](#upvotes-condition)
87
+ - [`labels` condition](#labels-condition)
88
+
89
+ ##### Date condition
90
+
91
+ Accepts a hash of fields.
92
+
93
+ | Field | Type | Values | Required |
94
+ | --------- | ---- | ---- | -------- |
95
+ | `attribute` | string | `created_at`, `updated_at` | yes |
96
+ | `condition` | string | `older_than`, `newer_than` | yes |
97
+ | `interval_type` | string | `days`, `weeks`, `months`, `years` | yes |
98
+ | `interval` | integer | integer | yes |
99
+
100
+ Example:
101
+
102
+ ```yml
103
+ conditions:
104
+ date:
105
+ attribute: updated_at
106
+ condition: older_than
107
+ interval_type: months
108
+ interval: 12
109
+ ```
110
+
111
+ ##### Milestone condition
112
+
113
+ Accepts an array of strings. Each element is the name of a milestone to filter upon.
114
+
115
+ > Note: **All** specified milestones must be present on the resource for the condition to be satisfied
116
+
117
+ Example:
118
+
119
+ ```yml
120
+ conditions:
121
+ milestone:
122
+ - v1
123
+ - v2
124
+ ```
125
+
126
+ ##### State condition
127
+
128
+ Accepts a string.
129
+
130
+ | State | Type | Value |
131
+ | --------- | ---- | ------ |
132
+ | Closed issues | string | `closed` |
133
+ | Open issues | string | `opened` |
134
+
135
+ Example:
136
+
137
+ ```yml
138
+ conditions:
139
+ state: opened
140
+ ```
141
+
142
+ ##### Upvotes condition
143
+
144
+ Accepts a hash of fields.
145
+
146
+ | Field | Type | Values | Required |
147
+ | --------- | ---- | ---- | -------- |
148
+ | `attribute` | string | `upvotes`, `downvotes` | yes |
149
+ | `condition` | string | `less_than`, `greater_than` | yes |
150
+ | `threshold` | integer | integer | yes |
151
+
152
+ Example:
153
+
154
+ ```yml
155
+ conditions:
156
+ upvotes:
157
+ attribute: upvotes
158
+ condition: less_than
159
+ threshold: 10
160
+ ```
161
+
162
+ ##### Labels condition
163
+
164
+ Accepts an array of strings. Each element in the array represents the name of a label to filter on.
165
+
166
+ > Note: **All** specified labels must be present on the resource for the condition to be satisfied
167
+
168
+ Example:
169
+
170
+ ```yml
171
+ conditions:
172
+ labels:
173
+ - feature proposal
174
+ ```
175
+
176
+ #### Actions field
177
+
178
+ Used to declare an action to be carried out on a resource if **all** conditions are satisfied.
179
+
180
+ Available action types:
181
+ - [`label` action](#label-action)
182
+ - [`status` action](#status-action)
183
+ - [`mention` action](#mention-action)
184
+ - [`comment` action](#comment-action)
185
+
186
+ ##### Label action
187
+
188
+ Adds a number of labels to the resource.
189
+
190
+ Accepts an array of strings. Each element is the name of a label to add.
191
+
192
+ Example:
193
+
194
+ ```yml
195
+ actions:
196
+ label:
197
+ - feature proposal
198
+ - awaiting feedback
199
+ ```
200
+
201
+ ##### Status action
202
+
203
+ Changes the status of the resource.
204
+
205
+ Accepts a string.
206
+
207
+ | State transition | Type | Value |
208
+ | --------- | ---- | ------ |
209
+ | Close the resource | string | `close` |
210
+ | Reopen the resource | string | `reopen` |
211
+
212
+ Example:
213
+
214
+ ```yml
215
+ actions:
216
+ status: close
217
+ ```
218
+
219
+ ##### Mention action
220
+
221
+ Mentions a number of users.
222
+
223
+ Accepts an array of strings. Each element is the username of a user to mention.
224
+
225
+ Example:
226
+
227
+ ```yml
228
+ actions:
229
+ mention:
230
+ - rymai
231
+ - markglenfletcher
232
+ ```
233
+
234
+ ##### Comment action
235
+
236
+ Adds a comment to the resource.
237
+
238
+ Accepts a string.
239
+
240
+ Example:
241
+
242
+ ```yml
243
+ actions:
244
+ comment: |
245
+ Closing this issue automatically
246
+ ```
247
+
248
+ ### Usage
249
+
250
+ ```
251
+ Usage: gitlab-triage [options]
252
+
253
+ -n, --dry-run Don't actually update anything, just print
254
+ -f, --policies-file [string] A valid policies YML file
255
+ -p, --project-id [string] A project ID or path
256
+ -t, --token [string] A valid API token
257
+ -d, --debug Print debug information
258
+ -h, --help Print help message
259
+ --init Initialize the project with a policy file
260
+ --init-ci Initialize the project with a .gitlab-ci.yml file
261
+ ```
262
+
263
+ #### Local
264
+
265
+ ```
266
+ gem install gitlab-triage
267
+ gitlab-triage --help
268
+ gitlab-triage --dry-run --token $API_TOKEN --project-id gitlab-org/triage
269
+ ```
270
+
271
+ #### GitLab CI pipeline
272
+
273
+ You can enforce policies using a scheduled pipeline:
274
+
275
+ ```yml
276
+ run:triage:triage:
277
+ stage: triage
278
+ script:
279
+ - gem install gitlab-triage
280
+ - gitlab-triage --token $API_TOKEN --project-id $CI_PROJECT_PATH
281
+ only:
282
+ - schedules
283
+ ```
284
+
285
+ > Note: You can use the [`--init-ci`](#usage) option to add an example [`.gitlab-ci.yml` file](support/.gitlab-ci.example.yml) to your project
data/bin/gitlab-triage CHANGED
@@ -44,6 +44,16 @@ class TriageOptionParser
44
44
  $stdout.puts opts
45
45
  exit
46
46
  end
47
+
48
+ opts.on('--init', 'Initialize the project with a policy file') do
49
+ FileUtils.cp('./support/.triage-policies.example.yml', './.triage-policies.yml')
50
+ exit
51
+ end
52
+
53
+ opts.on('--init-ci', 'Initialize the project with a .gitlab-ci.yml file') do
54
+ FileUtils.cp('./support/.gitlab-ci.example.yml', './.gitlab-ci.yml')
55
+ exit
56
+ end
47
57
  end
48
58
 
49
59
  parser.parse!(argv)
@@ -30,7 +30,12 @@ module Gitlab
30
30
  end
31
31
 
32
32
  def post_api(token, url, body)
33
- @adapter.post(token, url, body)
33
+ execute_with_retry(Net::ReadTimeout) do
34
+ @adapter.post(token, url, body)
35
+ end
36
+
37
+ rescue Net::ReadTimeout
38
+ false
34
39
  end
35
40
  end
36
41
  end
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module Triage
3
- VERSION = '0.0.3'.freeze
3
+ VERSION = '0.1.0'.freeze
4
4
  end
5
5
  end
@@ -0,0 +1,22 @@
1
+ image: ruby:2.4
2
+
3
+ stages:
4
+ - triage
5
+
6
+ dry-run:triage:
7
+ stage: triage
8
+ script:
9
+ - gem install gitlab-triage
10
+ - gitlab-triage --help
11
+ - gitlab-triage --dry-run --token $API_TOKEN --project-id $CI_PROJECT_PATH
12
+ when: manual
13
+ except:
14
+ - schedules
15
+
16
+ run:triage:
17
+ stage: triage
18
+ script:
19
+ - gem install gitlab-triage
20
+ - gitlab-triage --token $API_TOKEN --project-id $CI_PROJECT_PATH
21
+ only:
22
+ - schedules
@@ -0,0 +1,19 @@
1
+ resource_rules:
2
+ issues:
3
+ rules:
4
+ - name: Comment 1 week old, unlabelled issues
5
+ conditions:
6
+ date:
7
+ attribute: created_at
8
+ condition: older_than
9
+ interval_type: week
10
+ interval: 1
11
+ labels:
12
+ - No label
13
+ state: opened
14
+ actions:
15
+ comment: |
16
+ This issue has been open for one week and is unlabelled
17
+ merge_requests:
18
+ rules:
19
+ []
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-triage
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-10 00:00:00.000000000 Z
11
+ date: 2017-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -135,6 +135,8 @@ files:
135
135
  - lib/gitlab/triage/ui.rb
136
136
  - lib/gitlab/triage/url_builders/url_builder.rb
137
137
  - lib/gitlab/triage/version.rb
138
+ - support/.gitlab-ci.example.yml
139
+ - support/.triage-policies.example.yml
138
140
  homepage: https://gitlab.com/gitlab-org/triage
139
141
  licenses:
140
142
  - MIT