Implement include:component syntax

With the new decisions added to the blueprint about the directory structure we have all the pieces to start working on an MVC for components.

Problem to solve

As a user I want to create components in a project following the directory structure and guidelines in the blueprint. Then I want to consume these components in my .gitlab-ci.yml.

Details

In this phase it's not required for components to be published to a Catalog. It's sufficient for the user to know the full path of the component to use.

Proposal

Introduce include:component syntax that behaves similarly like other include types. It will automatically support with: inputs once they are available.

include:
  - component: org/my-project@main
  - component: org/my-project/my-component@main
  • For org/my-project@main we fetch the file template.yml in the root directory for the HEAD SHA of main branch.
  • For org/my-project/my-component@main we fetch the file template.yml in my-component directory for the HEAD SHA of main branch.

Version qualifiers to support are:

  • @<sha>
  • @<tag_name>
  • @<branch_name>

These qualifiers are ordered by precedence based on the decision in the blueprint.

Before merging the resulting YAML from a component we should check that the YAML, which is going to be merged with the main .gitlab-ci.yml, does not contain any of the following top-level keywords: default, variables, stages. These keywords are anti-patterns in the design of components because they would leak settings to other jobs in the pipeline.

Change should be made behind a feature flag.

Edited by Fabio Pitino