Logo

dhall-buildkite / 1.1.0 / Annotated / Monorepo.dhall

Description

Monorepo Module

This module provides functionality to filter out jobs based on `scope` and `filter`.
It is designed to work with a monorepo setup where jobs are defined with specific tags and scopes.

Features

- Filters jobs based on tags and scope.
- Supports custom filtering logic by overriding `filter` and `tags` modules.
- Generates a pipeline configuration for Buildkite with the filtered jobs.
- Allows prefix commands to be added before the filtered job commands.

Usage

To use this module in your client code:
1. Override the `filter` and `tags` modules as needed.
2. Provide the required inputs: `filterName`, `tags`, `scope`, `jobs`, and `prefixCommands`.
3. The module will return a pipeline configuration that can be used in Buildkite.

Source

let Tag = ./Tag.dhall

let Scope = ./Scope.dhall

let JobSpec = ./JobSpec.dhall

let Cmd = ../../Lib/Cmds.dhall

let Pipeline = ../../Pipeline/Annotated/Type.dhall

let Prelude = ../../External/Prelude.dhall

let SelectFiles = ../../Lib/SelectFiles.dhall

let Filter = ./Filter.dhall

let Command = ../../Command/Base.dhall

let Size = ../../Command/Size.dhall

let triggerCommand = ./TriggerCommand.dhall

let List/map = Prelude.List.map

let commands
    : List Tag.Type -> Text -> Scope.Type -> List JobSpec.Type -> List Cmd.Type
    =     \(tags : List Tag.Type)
      ->  \(filterName : Text)
      ->  \(scope : Scope.Type)
      ->  \(jobs : List JobSpec.Type)
      ->  List/map
            JobSpec.Type
            Cmd.Type
            (     \(job : JobSpec.Type)
              ->  let dirtyWhen = SelectFiles.compile job.dirtyWhen

                  let trigger =
                        triggerCommand "src/Jobs/${job.path}/${job.name}.dhall"

                  in        if Filter.contains job.tags tags

                      then  let cmd =
                                        if Scope.hasAny scope job.scope

                                  then  ''
                                          echo "Triggering ${job.name} because this is a release buildkite run"
                                          ${Cmd.format trigger}
                                        ''

                                  else  if Scope.hasAny scope job.scope

                                  then  ''
                                          echo "Triggering ${job.name} because this is a nightly buildkite run"
                                          ${Cmd.format trigger}
                                        ''

                                  else  if Scope.hasAny scope job.scope

                                  then  ''
                                          if (cat _computed_diff.txt | egrep -q '${dirtyWhen}'); then
                                                echo "Triggering ${job.name} for reason:"
                                                cat _computed_diff.txt | egrep '${dirtyWhen}'
                                                ${Cmd.format trigger}
                                          fi
                                        ''

                                  else  ''
                                          echo "Skipping ${job.name} because it does not run at any scope"
                                        ''

                            in  Cmd.quietly cmd

                      else  Cmd.quietly
                              ''
                                echo "Skipping ${job.name} because this is a ${filterName} stage"
                              ''
            )
            jobs

in      \(filterName : Text)
    ->  \(tags : List Tag.Type)
    ->  \(scope : Scope.Type)
    ->  \(jobs : List JobSpec.Type)
    ->  \(prefixCommands : List Cmd.Type)
    ->  let pipelineType =
              Pipeline.build
                Pipeline.Config::{
                , spec = JobSpec::{
                  , name = "monorepo-triage-${filterName}"
                  , dirtyWhen = [ SelectFiles.everything ]
                  }
                , steps =
                  [ Command.build
                      Command.Config::{
                      , commands =
                          prefixCommands # commands tags filterName scope jobs
                      , label = "Monorepo triage ${filterName}"
                      , key = "cmds-${filterName}"
                      , target = Size.Type.Multi
                      }
                  ]
                }

        in  pipelineType.pipeline