Pipelines for the GitLab project
Pipelines for gitlab-org/gitlab and gitlab-org/gitlab-foss (as well as the
dev instance's mirrors) are configured in the usual
.gitlab-ci.yml
which itself includes files under
.gitlab/ci/
for easier maintenance.
We're striving to dogfood GitLab CI/CD features and best-practices as much as possible.
Stages
The current stages are:
-
prepare: This stage includes jobs that prepare artifacts that are needed by jobs in subsequent stages. -
quick-test: This stage includes test jobs that should run first and fail the pipeline early (currently used to run Geo tests when the branch name starts withgeo-,geo/, or ends with-geo). -
test: This stage includes most of the tests, DB/migration jobs, and static analysis jobs. -
review-prepare: This stage includes a job that build the CNG images that are later used by the (Helm) Review App deployment (see Review Apps for details). -
review: This stage includes jobs that deploy the GitLab and Docs Review Apps. -
qa: This stage includes jobs that perform QA tasks against the Review App that is deployed in the previous stage. -
post-test: This stage includes jobs that build reports or gather data from the previous stages' jobs (e.g. coverage, Knapsack metadata etc.). -
pages: This stage includes a job that deploys the various reports as GitLab pages (e.g. https://gitlab-org.gitlab.io/gitlab/coverage-ruby/, https://gitlab-org.gitlab.io/gitlab/coverage-javascript/, https://gitlab-org.gitlab.io/gitlab/webpack-report/).
Default image
The default image is currently
dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.6.3-golang-1.11-git-2.22-chrome-73.0-node-12.x-yarn-1.16-postgresql-9.6-graphicsmagick-1.3.33.
It includes Ruby 2.6.3, Go 1.11, Git 2.22, Chrome 73, Node 12, Yarn 1.16,
PostgreSQL 9.6, and Graphics Magick 1.3.33.
The images used in our pipelines are configured in the
gitlab-org/gitlab-build-images
project, which is push-mirrored to https://dev.gitlab.org/gitlab/gitlab-build-images
for redundancy.
The current version of the build images can be found in the "Used by GitLab CE/EE section".
Default variables
In addition to the predefined variables, each pipeline includes the following variables:
RAILS_ENV: "test"NODE_ENV: "test"SIMPLECOV: "true"GIT_DEPTH: "20"GIT_SUBMODULE_STRATEGY: "none"GET_SOURCES_ATTEMPTS: "3"KNAPSACK_RSPEC_SUITE_REPORT_PATH: knapsack/${CI_PROJECT_NAME}/rspec_report-master.jsonEE_KNAPSACK_RSPEC_SUITE_REPORT_PATH: knapsack/${CI_PROJECT_NAME}/rspec_report-master-ee.jsonFLAKY_RSPEC_SUITE_REPORT_PATH: rspec_flaky/report-suite.jsonBUILD_ASSETS_IMAGE: "false"ES_JAVA_OPTS: "-Xms256m -Xmx256m"ELASTIC_URL: "http://elastic:changeme@docker.elastic.co-elasticsearch-elasticsearch:9200"
Common job definitions
Most of the jobs extend from a few CI definitions that are scoped to a single configuration parameter.
These common definitions are:
-
.default-tags: Ensures a job has thegitlab-orgtag to ensure it's using our dedicated runners. -
.default-retry: Allows a job to retry uponunknown_failure,api_failure,runner_system_failure. -
.default-before_script: Allows a job to use a defaultbefore_scriptdefinition suitable for Ruby/Rails tasks that may need a database running (e.g. tests). -
.default-cache: Allows a job to use a defaultcachedefinition suitable for Ruby/Rails and frontend tasks. -
.default-only: Restricts the cases where a job is created. This currently includesmaster,/^[\d-]+-stable(-ee)?$/(stable branches),/^\d+-\d+-auto-deploy-\d+$/(security branches),merge_requests,tags. Note that jobs won't be created for branches with this default configuration. -
.only-review: Only creates a job for thegitlab-orgnamespace and if Kubernetes integration is available. Also, prevents a job from being created formasterand auto-deploy branches. -
.only-review-schedules: Same as.only-reviewbut also restrict a job to only run for schedules. -
.use-pg: Allows a job to use thepostgres:9.6.14andredis:alpineservices. -
.use-pg-10: Allows a job to use thepostgres:10.9andredis:alpineservices. -
.only-ee: Only creates a job for thegitlabproject.
Changes detection
If a job extends from .default-only (and most of the jobs should), it can restrict
the cases where it should be created
based on the changes
from a commit or MR by extending from the following CI definitions:
-
.only-code-changes: Allows a job to only be created upon code-related changes. -
.only-qa-changes: Allows a job to only be created upon QA-related changes. -
.only-docs-changes: Allows a job to only be created upon docs-related changes. -
.only-code-qa-changes: Allows a job to only be created upon code-related or QA-related changes.
See https://gitlab.com/gitlab-org/gitlab/blob/master/.gitlab/ci/global.gitlab-ci.yml for the list of exact patterns.
Directed acyclic graph
We're using the needs: keyword to
execute jobs out of order for the following jobs:
graph RL;
A[setup-test-env];
B["gitlab:assets:compile<br/>(master only)"];
C[gitlab:assets:compile pull-cache];
D["cache gems<br/>(master and tags only)"];
E[review-build-cng];
F[build-qa-image];
G[review-deploy];
G2["schedule:review-deploy<br/>(master only)"];
H[karma];
I[jest];
J["compile-assets<br/>(master only)"];
K[compile-assets pull-cache];
L[webpack-dev-server];
M[coverage];
N[pages];
O[static-analysis];
P["package-and-qa-manual:master<br/>(master schedule only)"];
Q[package-and-qa];
R[package-and-qa-manual];
subgraph "`prepare` stage"
A
F
J
K
end
subgraph "`test` stage"
B --> |needs| A;
C --> |needs| A;
D --> |needs| A;
H -.-> |depends on| A;
H -.-> |depends on| J;
H -.-> |depends on| K;
I -.-> |depends on| A;
I -.-> |depends on| J;
I -.-> |depends on| K;
L -.-> |depends on| A;
L -.-> |depends on| J;
L -.-> |depends on| K;
downtime_check --> |needs and depends on| A;
db:* --> |needs| A;
gitlab:setup --> |needs| A;
O -.-> |depends on| A;
O -.-> |depends on| B;
O -.-> |depends on| C;
downtime_check --> |needs and depends on| A;
end
subgraph "`review-prepare` stage"
E --> |needs| C;
X["schedule:review-build-cng<br/>(master schedule only)"] --> |needs| B;
end
subgraph "`review` stage"
G --> |needs| E;
G2 --> |needs| E;
end
subgraph "`qa` stage"
Q --> |needs| C;
Q --> |needs| F;
R --> |needs| C;
R --> |needs| F;
P --> |needs| B;
P --> |needs| F;
review-qa-smoke -.-> |depends on| G;
review-qa-all -.-> |depends on| G;
review-qa-performance -.-> |depends on| G;
X2["schedule:review-performance<br/>(master only)"] -.-> |depends on| G2;
dast -.-> |depends on| G;
end
subgraph "`post-test` stage"
M
end
subgraph "`pages` stage"
N -.-> |depends on| B;
N -.-> |depends on| H;
N -.-> |depends on| M;
end
Test jobs
Consult GitLab tests in the Continuous Integration (CI) context for more information.
Review app jobs
Consult the Review Apps dedicated page for more information.