Skip to content

GitLab Next

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
GitLab
GitLab
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 36,069
    • Issues 36,069
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
    • Iterations
  • Merge Requests 1,299
    • Merge Requests 1,299
  • Requirements
    • Requirements
    • List
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
    • Test Cases
  • Operations
    • Operations
    • Metrics
    • Incidents
    • Environments
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Analytics
    • Analytics
    • CI/CD
    • Code Review
    • Insights
    • Issue
    • Repository
    • Value Stream
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • GitLab.org
  • GitLabGitLab
  • Issues
  • #29654

Closed
Open
Created Jun 21, 2019 by Jason Yavorska@jyavorska💬Contributor

Ability to set rules for triggering pipeline in entirety

Problem to solve

Sometimes you want to define rules to decide whether an entire .gitlab-ci.yml is run. The only way to do that now is to add the duplicate criteria to every single job in the workflow, and then if none of them end up resolving to true, the entire workflow is skipped. It would be more efficient if there was a global setting for a .gitlab-ci.yml that could be evaluated first.

This would also help with composability where you have less influence on the per-job rules, which could potentially cause issues where those jobs run even when you don't want anything to happen.

Another good example of where this is difficult today is with the only: merge_requests rule. You may always want to run every job for a merge request too, but there is no easy way to do this except by copy-pasting the only: merge_requests value into every single job.

Intended users

Software Developers

Proposal

We will add a new top level workflow: section that supports a single entity inside, a rules: section. In order to determine if the .gitlab-ci.yml should be triggered at all, this is evaluated first:

workflow:
  rules: # this rule says that the entire pipeline should only run for merge requests, or for `master`.
    - branch: master
    - merge-request: yes 

only_changes: 
  script: ...
  rules: # this job will only run on changes to .rb files because it has its own rule stating so:
    - changes: *.rb

always_run: # this job will always run as long as the pipeline is running, so doesn't need to add any rules.
  script: ...

Note that the top level workflow: evaluation is independent of the job rules: or only/except definitions. It is not re-evaluated on a per-job basis. If a job has a rules: section, it is evaluated independently of the workflow:rules section at the time the job is started.

Also, this feature builds on top of our new rules: syntax implemented here: https://gitlab.com/gitlab-org/gitlab-ce/issues/60085, but only implements the when:never: rules (if no when: is added, it treats it as a match and moves on.)

workflow: keyword name

We chose the name workflow: for the keyword because, with child/parent pipelines and other potential future features, a single .gitlab-ci.yml can represent what will be instantiated as multiple pipelines. A pipeline: keyword in this scenario would be confusing, but a workflow represents this complete combination of potential jobs and pipelines that are represented by a single .gitlab-ci.yml.

Permissions and Security

Documentation

In addition to documenting this feature on its own, we also need to update the pipelines for merge requests documentation to reference that this example can be useful for avoiding two pipelines being created (i.e., when there's a mix of merge request and general pipeline jobs):

workflow:
  rules:
    - branch: master
    - merge-request: yes

Testing

What does success look like, and how can we measure that?

Links / references

Edited Dec 13, 2019 by Jason Yavorska
Assignee
Assign to
12.7
Milestone
12.7 (Past due)
Assign milestone
Time tracking
None
Due date
None
Reference: gitlab-org/gitlab#29654