Getting started
All cici configuration is managed by the .cici config directory. The
contents of this directory are part of your project and should be committed to
version control.
The cici config file
cici's primary driver is the cici config file, located at .cici/config.yaml.
This file defines all available pipeline targets and how to configure them for
the target CI/CD system.
mkdir -p .cici
touch .cici/config.yaml
Here is a minimal example from the pages
component:
name: pages
repo_url: https://gitlab.com/saferatday0/library/pages
gitlab_project_path: saferatday0/library/pages
brief: >-
Publish static sites to GitLab Pages.
description: |-
GitLab Pages is a static site hosting service that allows you to publish
websites directly from your GitLab repositories. It automatically builds
and deploys static sites from your code using GitLab CI/CD pipelines,
supporting popular static site generators like Jekyll, Hugo, Gatsby, and
plain HTML/CSS/JavaScript.
Key features include free hosting for public repositories, custom domain
support, HTTPS encryption, and seamless integration with GitLab’s version
control workflow. It’s commonly used for project documentation, personal
blogs, portfolio sites, and company websites that don’t require server-side
processing.
This pipeline publishes the contents of a `public` directory to [GitLab
Pages](https://docs.gitlab.com/ee/user/project/pages/#how-it-works) on the
default branch. This ensures that documentation is always being built, but only
published when desired.
View the example site: https://saferatday0.gitlab.io/library/pages/
targets:
- name: pages
brief: >-
Publish the contents of a `public` directory to
[GitLab Pages](https://docs.gitlab.com/ee/user/project/pages/#how-it-works)
groups:
- documentation
More examples can be found in the saferatday0 library such as:
Read on to learn how to write your own.
Component metadata
Some information about the component project is necessary for cici to function correctly. All components require these fields.
# .cici/config.yaml
name: example
repo_url: https://gitlab.com/example/example
gitlab_project_path: example/example
brief: >-
Foo bar the bazz utility.
description: |-
The fizzy buzzy lorem ipsum converts bar to bazz. Use this cool utility to
do software things.
Pipeline targets
# ...
targets:
- name: example-bazz
brief: >-
Run the bazz utility on the project
# more targets ...
Pipeline variables
# ...
variables:
EXAMPLE_BAZZ_OPTIONS:
default: "-o option1"
brief: Bar bazz utility options.
description: |-
Here is a lot more information about the example-bazz pipeline. This
pipeline has been featured in several major films and has received
accolades from the academy.
examples:
- value: -o option2 --verbose
# more variables ...
Supplemental GitLab CI file
At present, cici still relies on some native GitLab CI/CD syntax to render final pipelines. This couples cici to GitLab at present, and we are working to remove this requirement.
This file is located at .cici/.gitlab-ci.yml. Here is a minimal example from
the pages component:
# SPDX-FileCopyrightText: UL Research Institutes
# SPDX-License-Identifier: Apache-2.0
stages:
- test
- build
- deploy
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "push" && $CI_OPEN_MERGE_REQUESTS
when: never
- when: always
pages:
stage: deploy
image: "${CONTAINER_PROXY}busybox"
variables:
GIT_DEPTH: "1"
GIT_STRATEGY: "none"
cache: {}
script: [":"]
artifacts:
paths:
- public/
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Fields in .cici/config.yaml take precedence over redundant fields in
.cici/gitlab-ci.yml.
More examples can be found in the saferatday0 library such as: