Architecture
CentOS Stream pipeline¶
In this section we describe what steps are needed for an update to be shipped in CentOS Stream.
Let's imagine we would like to update a package python3.9 to a new version 3.9.17 in CentOS Stream 9.
-
We create a merge request to the dist-git of the package:
https://gitlab.com/redhat/centos-stream/rpms/python3.9/-/merge_requests/33
-
Every merge request triggers a check pipeline on CentOS Stream Zuul CI:
https://centos.softwarefactory-project.io/zuul/t/centos/buildset/a2e433d73301431690dbe4a87e85ea63
The pipeline runs set of jobs, like
mock-build
andrpm-sti-test
, and adds a comment to the merge request with the outcome of the test run. -
RHEL Engineer1 reviews the Merge Request and its test results and merges the Merge Request.
-
RHEL Engineer builds a package in CentOS Stream Koji:
https://kojihub.stream.centos.org/koji/buildinfo?buildID=34118
After the build is completed it lands in the c9s-gate tag in that Koji instance.
-
When CentOS package lands in
c<N>s-gate
tag, internally on Red Hat infrastructure the RHEL build from the same git commit is triggered. When that RHEL build passes automated testing and QE verification, the CentOS build is tagged intoc<N>s-pending
tag and appears in the CentOS Stream buildroot. -
Periodically a Jenkins job picks up the content of the
c<N>s-pending
tag from Koji and builds a so-called compose (repositories, iso-images, container-images) from it. -
Same Jenkins job runs a test of the compose using the t_functional test suite.
-
If the test pass, the compose can then be published to mirrors.
Three gates¶
In the process above there are three decision making points which define whether the update will reach the end user. We will call those points "gates".
The same test scenario can be executed in any of the gates depending on the goals, resources and other considerations.
It is important to note that while update is going through the pipeline, it takes different forms: from a patch to sources in the Gitlab Merge request gate to a binary RPM in the Koji gate and then entire repository and images in the compose gate.
Therefore to test a change we need to run the test pipeline so that it can consume the correct type of artifact2. Additionally each gate has its own triggering event (gate entry) and an event, which happens when the change is approved (gate exit).
Merge Request gate¶
Artifact: patch to dist-git
Gate entry: merge request is created.
Gate exit: merge request is merged.
Koji gate¶
Artifact: koji build.
Gate entry: package is tagged to c<N>s-gate
tag in CentOS
Stream Koji
Gate exit: package is tagged to c<N>s-pending
tag in CentOS
Stream Koji
Compose gate¶
Artifact: compose.
Gate entry: new compose is built by the compose Jenkins job
Gate exit: compose is pushed to mirrors via Jenkins job - TBA
-
Any RHEL Engineer has the ability to review and merge Gitlab merge requests, but usually each component(package) has a dedicated person or a team responsible for it. You can find who is responsible for accepting the change checking the Assignee field of the corresponding Jira or Bugzilla issue. ↩
-
There is a work being done on unifying the artifacts between gates. The idea is to produce compose type of artifact in every gate, including MR and Koji gates, so that test pipelines can be reused between gates easily. ↩