.taskcluster.yml 18.9 KB
Newer Older
Johan Lorenzo's avatar
Johan Lorenzo committed
1
---
2
version: 1
Johan Lorenzo's avatar
Johan Lorenzo committed
3
reporting: checks-v1
4
policy:
Johan Lorenzo's avatar
Johan Lorenzo committed
5
6
    # XXX We restrict taskcluster to collaborators so priviledged tests (like UI tests) can run on PRs
    pullRequests: collaborators
7
tasks:
Johan Lorenzo's avatar
Johan Lorenzo committed
8
9
10
    - $let:
          taskgraph:
              branch: taskgraph
11
              revision: f949fb56d96b9509b071ba55853f2d60e8dbbf57
Johan Lorenzo's avatar
Johan Lorenzo committed
12
          trustDomain: mobile
13
      in:
14
15
16
          $let:
              # Github events have this stuff in different places...
              ownerEmail:
17
18
19
                  $if: 'tasks_for in ["cron", "action"]'
                  then: '${tasks_for}@noreply.mozilla.org'
                  else:
20
21
22
                      $if: 'tasks_for == "github-push"'
                      then: '${event.pusher.email}'
                      # Assume Pull Request
Johan Lorenzo's avatar
Johan Lorenzo committed
23
                      else:
24
25
                          $if: 'tasks_for == "github-pull-request"'
                          then: '${event.pull_request.user.login}@users.noreply.github.com'
Johan Lorenzo's avatar
Johan Lorenzo committed
26
                          else:
27
28
                              $if: 'tasks_for == "github-release"'
                              then: '${event.sender.login}@users.noreply.github.com'
29
30
31
32
33
34
              baseRepoUrl:
                  $if: 'tasks_for in ["github-push", "github-release"]'
                  then: '${event.repository.html_url}'
                  else:
                      $if: 'tasks_for == "github-pull-request"'
                      then: '${event.pull_request.base.repo.html_url}'
Johan Lorenzo's avatar
Johan Lorenzo committed
35
                      else:
36
37
38
39
40
41
42
43
                          $if: 'tasks_for in ["cron", "action"]'
                          then: '${repository.url}'
              repoUrl:
                  $if: 'tasks_for in ["github-push", "github-release"]'
                  then: '${event.repository.html_url}'
                  else:
                      $if: 'tasks_for == "github-pull-request"'
                      then: '${event.pull_request.head.repo.html_url}'
Johan Lorenzo's avatar
Johan Lorenzo committed
44
                      else:
45
46
47
48
49
50
                          $if: 'tasks_for in ["cron", "action"]'
                          then: '${repository.url}'
              project:
                  $if: 'tasks_for in ["github-push", "github-release"]'
                  then: '${event.repository.name}'
                  else:
Johan Lorenzo's avatar
Johan Lorenzo committed
51
                      $if: 'tasks_for == "github-pull-request"'
52
                      then: '${event.pull_request.head.repo.name}'
Johan Lorenzo's avatar
Johan Lorenzo committed
53
                      else:
54
55
56
57
58
59
60
61
62
63
64
                          $if: 'tasks_for in ["cron", "action"]'
                          then: '${repository.project}'
              head_branch:
                  $if: 'tasks_for == "github-pull-request"'
                  then: ${event.pull_request.head.ref}
                  else:
                      $if: 'tasks_for == "github-push"'
                      then: ${event.ref}
                      else:
                          $if: 'tasks_for == "github-release"'
                          then: '${event.release.target_commitish}'
Johan Lorenzo's avatar
Johan Lorenzo committed
65
                          else:
66
                              $if: 'tasks_for in ["action", "cron"]'
Johan Lorenzo's avatar
Johan Lorenzo committed
67
                              then: '${push.branch}'
68
69
70
71
72
73
              head_sha:
                  $if: 'tasks_for == "github-push"'
                  then: '${event.after}'
                  else:
                      $if: 'tasks_for == "github-pull-request"'
                      then: '${event.pull_request.head.sha}'
Johan Lorenzo's avatar
Johan Lorenzo committed
74
                      else:
75
76
                          $if: 'tasks_for == "github-release"'
                          then: '${event.release.tag_name}'
Johan Lorenzo's avatar
Johan Lorenzo committed
77
                          else:
78
                              $if: 'tasks_for in ["action", "cron"]'
Johan Lorenzo's avatar
Johan Lorenzo committed
79
                              then: '${push.revision}'
80

81

82
83
84
85
              head_tag:
                  $if: 'tasks_for == "github-release"'
                  then: '${event.release.tag_name}'
                  else: ''
86
87
88
89
              ownTaskId:
                  $if: '"github" in tasks_for'
                  then: {$eval: as_slugid("decision_task")}
                  else:
90
                      $if: 'tasks_for in ["cron", "action"]'
91
                      then: '${ownTaskId}'
92
93
94
95
              pullRequestAction:
                  $if: 'tasks_for == "github-pull-request"'
                  then: ${event.action}
                  else: 'UNDEFINED'
96
97
98
99
              releaseAction:
                  $if: 'tasks_for == "github-release"'
                  then: ${event.action}
                  else: 'UNDEFINED'
100
          in:
101
102
103
104
105
              $if: >
                tasks_for in ["action", "cron"]
                || (tasks_for == "github-pull-request" && pullRequestAction in ["opened", "reopened", "edited", "synchronize"])
                || (tasks_for == "github-push" && head_branch[:10] != "refs/tags/")
                || (tasks_for == "github-release" && releaseAction == "published")
106
              then:
Johan Lorenzo's avatar
Johan Lorenzo committed
107
108
109
110
                  $let:
                      level:
                          $if: 'tasks_for in ["github-push", "github-release", "action", "cron"] && repoUrl == "https://github.com/mozilla-mobile/fenix"'
                          then: '3'
111
                          else: '1'
112
113
114
115

                      short_head_branch:
                          $if: 'head_branch[:11] == "refs/heads/"'
                          then: {$eval: 'head_branch[11:]'}
Johan Lorenzo's avatar
Johan Lorenzo committed
116
                  in:
117
118
                    $mergeDeep:
                        - $if: 'tasks_for != "action"'
Johan Lorenzo's avatar
Johan Lorenzo committed
119
                          then:
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
                              taskId: '${ownTaskId}'
                        - taskGroupId:
                              $if: 'tasks_for == "action"'
                              then:
                                  '${action.taskGroupId}'
                              else:
                                  '${ownTaskId}'  # same as taskId; this is how automation identifies a decision task
                          schedulerId: '${trustDomain}-level-${level}'
                          created: {$fromNow: ''}
                          deadline: {$fromNow: '1 day'}
                          expires: {$fromNow: '1 year 1 second'}  # 1 second so artifacts expire first, despite rounding errors
                          metadata:
                              $merge:
                                  - owner: "${ownerEmail}"
                                    source: '${repoUrl}/raw/${head_sha}/.taskcluster.yml'
                                  - $if: 'tasks_for in ["github-push", "github-pull-request", "github-release"]'
Johan Lorenzo's avatar
Johan Lorenzo committed
136
                                    then:
137
138
                                        name: "Decision Task"
                                        description: 'The task that creates all of the other tasks in the task graph'
Johan Lorenzo's avatar
Johan Lorenzo committed
139
                                    else:
140
141
142
143
144
145
146
147
148
149
150
                                        $if: 'tasks_for == "action"'
                                        then:
                                            name: "Action: ${action.title}"
                                            description: '${action.description}'
                                        else:
                                            name: "Decision Task for cron job ${cron.job_name}"
                                            description: 'Created by a [cron task](https://firefox-ci-tc.services.mozilla.com/tasks/${cron.task_id})'
                          provisionerId: "mobile-${level}"
                          workerType: "decision"
                          tags:
                              $if: 'tasks_for in ["github-push", "github-pull-request"]'
Johan Lorenzo's avatar
Johan Lorenzo committed
151
                              then:
152
                                  kind: decision-task
Johan Lorenzo's avatar
Johan Lorenzo committed
153
                              else:
154
                                  $if: 'tasks_for == "action"'
Johan Lorenzo's avatar
Johan Lorenzo committed
155
                                  then:
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
                                      kind: 'action-callback'
                                  else:
                                      $if: 'tasks_for == "cron"'
                                      then:
                                          kind: cron-task
                          routes:
                              $flattenDeep:
                                  - checks
                                  - $if: 'level == "3"'
                                    then:
                                        - tc-treeherder.v2.${project}.${head_sha}
                                        # TODO Bug 1601928: Make this scope fork-friendly once ${project} is better defined. This will enable
                                        # staging release promotion on forks.
                                        - $if: 'tasks_for == "github-push"'
                                          then:
                                              - index.project.mobile.${project}.v2.branch.${short_head_branch}.latest.taskgraph.decision
                                              - index.project.mobile.${project}.v2.branch.${short_head_branch}.revision.${head_sha}.taskgraph.decision
                                        - $if: 'tasks_for == "cron"'
                                          then:
175
176
177
178
                                              # cron context provides ${head_branch} as a short one
                                              - index.project.mobile.${project}.v2.branch.${head_branch}.latest.taskgraph.decision-${cron.job_name}
                                              - index.project.mobile.${project}.v2.branch.${head_branch}.revision.${head_sha}.taskgraph.decision-${cron.job_name}
                                              - index.project.mobile.${project}.v2.branch.${head_branch}.revision.${head_sha}.taskgraph.cron.${ownTaskId}
179
180
                          scopes:
                              $if: 'tasks_for == "github-push"'
Johan Lorenzo's avatar
Johan Lorenzo committed
181
                              then:
182
183
                                  # `https://` is 8 characters so, ${repoUrl[8:]} is the repository without the protocol.
                                  - 'assume:repo:${repoUrl[8:]}:branch:${short_head_branch}'
Johan Lorenzo's avatar
Johan Lorenzo committed
184
                              else:
185
                                  $if: 'tasks_for == "github-pull-request"'
Johan Lorenzo's avatar
Johan Lorenzo committed
186
                                  then:
187
                                      - 'assume:repo:github.com/${event.pull_request.base.repo.full_name}:pull-request'
Johan Lorenzo's avatar
Johan Lorenzo committed
188
                                  else:
189
                                      $if: 'tasks_for == "github-release"'
190
                                      then:
191
                                          - 'assume:repo:${repoUrl[8:]}:release'
192
                                      else:
193
194
195
196
197
198
                                          $if: 'tasks_for == "action"'
                                          then:
                                              # when all actions are hooks, we can calculate this directly rather than using a variable
                                              - '${action.repo_scope}'
                                          else:
                                              - 'assume:repo:${repoUrl[8:]}:cron:${cron.job_name}'
Johan Lorenzo's avatar
Johan Lorenzo committed
199

200
201
202
                          requires: all-completed
                          priority: lowest
                          retries: 5
Johan Lorenzo's avatar
Johan Lorenzo committed
203

204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
                          payload:
                              env:
                                  # run-task uses these to check out the source; the inputs
                                  # to `mach taskgraph decision` are all on the command line.
                                  $merge:
                                      - MOBILE_BASE_REPOSITORY: '${baseRepoUrl}'
                                        MOBILE_HEAD_REPOSITORY: '${repoUrl}'
                                        MOBILE_HEAD_REF: '${head_branch}'
                                        MOBILE_HEAD_REV: '${head_sha}'
                                        MOBILE_HEAD_TAG: '${head_tag}'
                                        MOBILE_REPOSITORY_TYPE: git
                                        TASKGRAPH_BASE_REPOSITORY: https://hg.mozilla.org/ci/taskgraph
                                        TASKGRAPH_HEAD_REPOSITORY: https://hg.mozilla.org/ci/${taskgraph.branch}
                                        TASKGRAPH_HEAD_REV: ${taskgraph.revision}
                                        TASKGRAPH_REPOSITORY_TYPE: hg
                                        REPOSITORIES: {$json: {mobile: "Fenix", taskgraph: "Taskgraph"}}
                                        HG_STORE_PATH: /builds/worker/checkouts/hg-store
                                        ANDROID_SDK_ROOT: /builds/worker/android-sdk
                                      - $if: 'tasks_for in ["github-pull-request"]'
                                        then:
                                            MOBILE_PULL_REQUEST_NUMBER: '${event.pull_request.number}'
                                      - $if: 'tasks_for == "action"'
                                        then:
                                            ACTION_TASK_GROUP_ID: '${action.taskGroupId}'  # taskGroupId of the target task
                                            ACTION_TASK_ID: {$json: {$eval: 'taskId'}}  # taskId of the target task (JSON-encoded)
                                            ACTION_INPUT: {$json: {$eval: 'input'}}
                                            ACTION_CALLBACK: '${action.cb_name}'
                                      - $if: 'tasks_for == "github-release"'
                                        then:
                                            MOBILE_HEAD_TAG: '${event.release.tag_name}'
                              features:
                                  taskclusterProxy: true
                                  chainOfTrust: true
                              # Note: This task is built server side without the context or tooling that
                              # exist in tree so we must hard code the hash
                              image:
                                  mozillareleases/taskgraph:decision-mobile-6020473b1a928d8df50e234a7ca2e81ade2220a4fb5fbe16b02477dd64a49728@sha256:98d226736b7d03907114bf37938002b90e8a37cbe3a297690e349f1ddddb1d7c
Johan Lorenzo's avatar
Johan Lorenzo committed
241

242
                              maxRunTime: 1800
Johan Lorenzo's avatar
Johan Lorenzo committed
243

244
245
246
247
248
249
250
251
252
253
254
255
256
257
                              command:
                                  - /usr/local/bin/run-task
                                  - '--mobile-checkout=/builds/worker/checkouts/src'
                                  - '--taskgraph-checkout=/builds/worker/checkouts/taskgraph'
                                  - '--task-cwd=/builds/worker/checkouts/src'
                                  - '--'
                                  - bash
                                  - -cx
                                  - $let:
                                        extraArgs: {$if: 'tasks_for == "cron"', then: '${cron.quoted_args}', else: ''}
                                    in:
                                        $if: 'tasks_for == "action"'
                                        then: >
                                            PIP_IGNORE_INSTALLED=0 pip install --user /builds/worker/checkouts/taskgraph &&
258
                                            taskcluster/scripts/decision-install-sdk.sh &&
259
260
261
262
263
                                            ln -s /builds/worker/artifacts artifacts &&
                                            ~/.local/bin/taskgraph action-callback
                                        else: >
                                            PIP_IGNORE_INSTALLED=0 pip install --user /builds/worker/checkouts/taskgraph &&
                                            PIP_IGNORE_INSTALLED=0 pip install --user arrow taskcluster pyyaml &&
264
                                            taskcluster/scripts/decision-install-sdk.sh &&
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
                                            ln -s /builds/worker/artifacts artifacts &&
                                            ~/.local/bin/taskgraph decision
                                            --pushlog-id='0'
                                            --pushdate='0'
                                            --project='${project}'
                                            --message=""
                                            --owner='${ownerEmail}'
                                            --level='${level}'
                                            --base-repository="$MOBILE_BASE_REPOSITORY"
                                            --head-repository="$MOBILE_HEAD_REPOSITORY"
                                            --head-ref="$MOBILE_HEAD_REF"
                                            --head-rev="$MOBILE_HEAD_REV"
                                            --head-tag="$MOBILE_HEAD_TAG"
                                            --repository-type="$MOBILE_REPOSITORY_TYPE"
                                            --tasks-for='${tasks_for}'
                                            ${extraArgs}
Johan Lorenzo's avatar
Johan Lorenzo committed
281

282
283
284
285
286
                              artifacts:
                                  'public':
                                      type: 'directory'
                                      path: '/builds/worker/artifacts'
                                      expires: {$fromNow: '1 year'}
Johan Lorenzo's avatar
Johan Lorenzo committed
287

288
289
290
291
292
293
294
                          extra:
                              $merge:
                                  - treeherder:
                                        $merge:
                                            - machine:
                                                  platform: gecko-decision
                                            - $if: 'tasks_for in ["github-push", "github-pull-request"]'
Johan Lorenzo's avatar
Johan Lorenzo committed
295
                                              then:
296
                                                  symbol: D
Johan Lorenzo's avatar
Johan Lorenzo committed
297
                                              else:
298
                                                  $if: 'tasks_for == "github-release"'
299
                                                  then:
300
                                                      symbol: 'ship_fenix'
301
                                                  else:
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
                                                      $if: 'tasks_for == "action"'
                                                      then:
                                                          groupName: 'action-callback'
                                                          groupSymbol: AC
                                                          symbol: "${action.symbol}"
                                                      else:
                                                          groupSymbol: cron
                                                          symbol: "${cron.job_symbol}"
                                  - $if: 'tasks_for == "action"'
                                    then:
                                        parent: '${action.taskGroupId}'
                                        action:
                                            name: '${action.name}'
                                            context:
                                                taskGroupId: '${action.taskGroupId}'
                                                taskId: {$eval: 'taskId'}
                                                input: {$eval: 'input'}
                                  - $if: 'tasks_for == "cron"'
                                    then:
                                        cron: {$json: {$eval: 'cron'}}
                                  - tasks_for: '${tasks_for}'