GitLab CI Events Proposal 5: Combined proposal

In this proposal we have separate files for cohesive groups of events. The files are being included into the main .gitlab-ci.yml configuration file.

# my/events/packages.yaml

spec:
  events:
    - events/package/published
    - events/audit/package/*
  inputs:
    env:
---
do_something:
  script: ./run_for $[[ event.name ]] --env $[[ inputs.env ]]
  rules:
    - if: $[[ event.payload.package.name ]] == "my_package"

In the .gitlab-ci.yml file, we can enable the subscription:

# .gitlab-ci.yml

include:
  - local: my/events/packages.yaml
    inputs:
      env: test

GitLab will detect changes in the included files, and parse their specs. All the information required to define a subscription will be encapsulated in the spec, hence we will not need to read a whole file. We can easily read spec header and calculate its checksum what can become a workflow identifier.

Once we see a new identifier, we can redefine subscriptions for a particular project and then to upsert them into the database.

We will use an efficient GIN index matching technique to match publishers with the subscribers to run pipelines.

The syntax is also compatible with CI Components, and make it easier to define components that will only be designed to run for events happening inside GitLab.

No entrypoint file variant

Another variant of this proposal is to move away from the single GitLab CI YAML configuration file. In such case we would define another search directory, like .gitlab/workflows/ where we would store all YAML files.

We wouldn’t need to include workflow / events files anywhere, because these would be found by GitLab automatically. In order to implement this feature this way we would need to extend features like “custom location for .gitlab-ci.yml file”.

Example, without using a main configuration file (the GitLab CI YAML file would be still supported):

# .gitlab/workflows/push.yml

spec:
  events:
    - events/repository/push
---
rspec-on-push:
  script: bundle exec rspec
# .gitlab/workflows/merge_requests.yml

spec:
  events:
    - events/merge_request/push
---
rspec-on-mr-push:
  script: bundle exec rspec
# .gitlab/workflows/schedules.yml

spec:
  events:
    - events/pipeline/schedule/run
---
smoke-test:
  script: bundle exec rspec --smoke
Last modified August 23, 2024: Ensure frontmatter is consistent (e47101dc)