.taskcluster.yml
author Nathan Froyd <froydnj@mozilla.com>
Wed, 15 Nov 2017 14:53:16 -0400
changeset 443801 402cad93aa6ece010f3c834b9d20e431c4ee8f8b
parent 437750 82ca05dc42e91a1be20877314541b57d13ec51a9
child 445559 249c0c15d90758a558fa2707dccfc4d52de3fe2a
permissions -rw-r--r--
Bug 1325632 - part 5 - ensure that we compile with -fno-sized-deallocation when possible; r=chmanchester We currently turn off the C++14 sized-deallocation facility on MSVC, and we'd like to ensure we do the same thing for clang and gcc. To do so, we add new functionality to moz.configure for checking and adding compilation flags, similar to the facility for checking and adding warning flags. The newly added facility is then used to add -fno-sized-deallocation to the compilation flags, when the option is supported. Once we do this, we can't define the sized deallocation functions in mozalloc.h; the compiler will complain that we are using -fno-sized-deallocation, yet defining these special functions that we'll never use. These functions were added for MinGW, where we needed to compile with C++14 ahead of other platforms to be compatible with MSVC headers. But they're no longer necessary, though they would be if we removed -fno-sized-deallocation; the compiler will complain if we do that and we'll add them back at that point.

# This file is rendered via JSON-e by
# - mozilla-taskcluster - https://docs.taskcluster.net/reference/integrations/mozilla-taskcluster/docs/taskcluster-yml
# - cron tasks - taskcluster/taskgraph/cron/decision.py
# - action tasks - taskcluster/taskgraph/actions/registry.py
version: 1
tasks:
  - $let:
      # sometimes the push user is just `ffxbld` or the like, but we want an email-like field..
      ownerEmail: {$if: '"@" in push.owner', then: '${push.owner}', else: '${push.owner}@noreply.mozilla.org'}
      # ensure there's no trailing `/` on the repo URL
      repoUrl: {$if: 'repository.url[-1] == "/"', then: {$eval: 'repository.url[:-1]'}, else: {$eval: 'repository.url'}}
    in:
      taskId: {$if: 'tasks_for != "action"', then: '${as_slugid("decision")}'}
      taskGroupId:
        $if: 'tasks_for == "action"'
        then:
          '${action.taskGroupId}'
        else:
          '${as_slugid("decision")}' # same as taskId; this is how automation identifies a decision tsak
      schedulerId: 'gecko-level-${repository.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-file/${push.revision}/.taskcluster.yml"
          - $if: 'tasks_for == "hg-push"'
            then:
              name: "Gecko Decision Task"
              description: 'The task that creates all of the other tasks in the task graph'
            else:
              $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://tools.taskcluster.net/tasks/${cron.task_id})'

      provisionerId: "aws-provisioner-v1"
      workerType: "gecko-${repository.level}-decision"

      tags:
        $if: 'tasks_for == "hg-push"'
        then: {createdForUser: "${ownerEmail}"}
        else:
          $if: 'tasks_for == "action"'
          then:
            createdForUser: '${ownerEmail}'
            kind: 'action-callback'

      routes:
        $if: 'tasks_for == "hg-push"'
        then:
          - "index.gecko.v2.${repository.project}.latest.firefox.decision"
          - "index.gecko.v2.${repository.project}.revision.${push.revision}.firefox.decision"
          - "index.gecko.v2.${repository.project}.pushlog-id.${push.pushlog_id}.decision"
          - "tc-treeherder.v2.${repository.project}.${push.revision}.${push.pushlog_id}"
          - "tc-treeherder-stage.v2.${repository.project}.${push.revision}.${push.pushlog_id}"
          - "notify.email.${ownerEmail}.on-failed"
          - "notify.email.${ownerEmail}.on-exception"
        else:
          - "tc-treeherder.v2.${repository.project}.${push.revision}.${push.pushlog_id}"
          - "tc-treeherder-stage.v2.${repository.project}.${push.revision}.${push.pushlog_id}"
          - $if: 'tasks_for == "action"'
            then: "index.gecko.v2.${repository.project}.pushlog-id.${push.pushlog_id}.actions.$ownTaskId"
            else: "index.gecko.v2.${repository.project}.latest.firefox.decision-${cron.job_name}"

      scopes:
        $if: 'tasks_for == "hg-push"'
        then:
          - 'assume:repo:${repoUrl[8:]}:*'
          - 'queue:route:notify.email.${ownerEmail}.*'
        else:
          $if: 'tasks_for == "action"'
          then:
            - '${action.repo_scope}'
          else:
            - 'assume:repo:${repoUrl[8:]}:cron:${cron.job_name}'

      dependencies: []
      requires: all-completed

      priority: lowest
      retries: 5

      payload:
        env:
          # checkout-gecko uses these to check out the source; the inputs
          # to `mach taskgraph decision` are all on the command line.
          $merge:
            - GECKO_BASE_REPOSITORY: 'https://hg.mozilla.org/mozilla-unified'
              GECKO_HEAD_REPOSITORY: '${repoUrl}'
              GECKO_HEAD_REF: '${push.revision}'
              GECKO_HEAD_REV: '${push.revision}'
              GECKO_COMMIT_MSG: {$if: 'tasks_for != "action"', then: '${push.comment}'}
              HG_STORE_PATH: /builds/worker/checkouts/hg-store
              TASKCLUSTER_CACHES: /builds/worker/checkouts
            - $if: 'tasks_for == "action"'
              then:
                ACTION_TASK_GROUP_ID: '${action.taskGroupId}'
                ACTION_TASK_ID: {$json: {$eval: 'taskId'}}
                ACTION_TASK: {$json: {$eval: 'task'}}
                ACTION_INPUT: {$json: {$eval: 'input'}}
                ACTION_CALLBACK: '${action.cb_name}'
                ACTION_PARAMETERS: {$json: {$eval: 'parameters'}}

        cache:
          level-${repository.level}-checkouts-sparse-v1: /builds/worker/checkouts

        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
        # XXX Changing this will break Chain of Trust without an associated puppet and
        # scriptworker patch!
        image: 'taskcluster/decision:2.0.0@sha256:4039fd878e5700b326d4a636e28c595c053fbcb53909c1db84ad1f513cf644ef'

        maxRunTime: 1800

        command:
          - /builds/worker/bin/run-task
          - '--vcs-checkout=/builds/worker/checkouts/gecko'
          - '--sparse-profile=build/sparse-profiles/taskgraph'
          - '--'
          - bash
          - -cx
          - $let:
              extraArgs: {$if: 'tasks_for == "cron"', then: '${cron.quoted_args}', else: ''}
            in:
              $if: 'tasks_for == "action"'
              then: >
                cd /builds/worker/checkouts/gecko &&
                ln -s /builds/worker/artifacts artifacts &&
                ./mach --log-no-times taskgraph action-callback
              else: >
                cd /builds/worker/checkouts/gecko &&
                ln -s /builds/worker/artifacts artifacts &&
                ./mach --log-no-times taskgraph decision
                --pushlog-id='${push.pushlog_id}'
                --pushdate='${push.pushdate}'
                --project='${repository.project}'
                --message="$GECKO_COMMIT_MSG"
                --owner='${ownerEmail}'
                --level='${repository.level}'
                --base-repository="$GECKO_BASE_REPOSITORY"
                --head-repository="$GECKO_HEAD_REPOSITORY"
                --head-ref="$GECKO_HEAD_REF"
                --head-rev="$GECKO_HEAD_REV"
                ${extraArgs}

        artifacts:
          'public':
            type: 'directory'
            path: '/builds/worker/artifacts'
            expires: {$fromNow: '1 year'}

      extra:
        $merge:
          - treeherder:
              $merge:
                - machine:
                    platform: gecko-decision
                - $if: 'tasks_for == "hg-push"'
                  then:
                    symbol: D
                  else:
                    $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'}
                  parameters: {$eval: 'parameters'}