Home / gitlab-runner-template
GitLab CI templates
gitlab-ci-templates
is a repository of GitLab CI template jobs and pipelines that aims to help Eclipse Foundation Open Sources projects get started quickly in the Eclipse Infrastructure OKD and with all features provided by GitLab.
Getting started!
Create a .gitlab-ci.yml
file in your project root directory.
ex:
include:
- project: 'eclipsefdn/it/releng/gitlab-runner-service/gitlab-ci-templates'
file: pipeline.gitlab-ci.yml'
And push to the GitLab repository.
NOTE: You must first activate CI/CD
feature in your project.
Settings
-> General
, select section Visibility, project features, permissions
, Check CI/CD
, and Save.
Template job lists
Job | Description |
---|---|
workflow |
Define a workflow for your pipeline |
dco |
DCO check tool that certify that a contributor has the right to submit their code according to the Developer Certificate of Origin (DCO) |
hadolint |
Control docker image quality with hadolint tool |
reuse |
Check REUSE compliance |
buildkit |
Build docker image with buildkit and crane tools and specific instance dedicated in EF infrastructure (SERVICE_ADDRESS) |
eca |
Check Eclipse Contributor Agreement from commits in Merge Request |
ssh |
Configure ssh client in a before_script section |
git |
Configure git client in a before_script section |
download-eclipse.org |
Push artifacts to download.eclipse.org just override script section |
repo-eclipse-org |
Push artifacts to repo.eclipse.org just override script section |
renovate |
Automated dependency updates. Renovate |
matrix |
Get credentials for matrix bot |
Template auth job lists
Job | Description | Inherit |
---|---|---|
ef-buildkit |
Configure buildkit client with docker.com credentials |
ef-buildkit-docker.com |
ef-buildkit-docker.com |
Configure buildkit client with docker.com credentials |
buildkit |
ef-buildkit-quay.com |
Configure buildkit client with quay.io credentials |
buildkit |
ef-git |
Configure git client with gitlab credentials | ef-git-gitlab |
ef-git-gitlab |
Configure git client with gitlab credentials | git |
ef-git-github |
Configure git client with github credentials | git |
ef-download-eclipse.org |
Configure job with projects-storage credentials |
download-eclipse.org |
ef-repo-eclipse-org |
Configure job with repo.eclipse.org credentials |
repo-eclipse-org |
ef-build-develocity |
Configure job with develocity.eclipse.org credentials |
ef-build-develocity |
ef-build-develocity-maven |
Configure job with develocity.eclipse.org credentials and build with maven |
ef-build-develocity |
ef-build-develocity-gradle |
Configure job with develocity.eclipse.org credentials and build with gradle |
ef-build-develocity |
ef-renovate |
Configure job with renovate credentials |
How to include a template job in your pipeline
include:
- project: 'eclipsefdn/it/releng/gitlab-runner-service/gitlab-ci-templates'
file: '/jobs/dco.gitlab-ci.yml'
stages:
- compliance
EF specific variables
These variables are injected at runner creation:
* EF_PROJECT_ID
* EF_SHORT_NAME
e.g: with eclipse cbi project
* EF_PROJECT_ID=techonology.cbi
* EF_SHORT_NAME=cbi
EF_PROJECT_ID
can be used in the path when using secrets from the secretsmanager
.
Secrets manager
GitLab CI can use the internal secrets manager to fetch secrets for publishing docker images, accessing internal services, ...
e.g:
secrets:
REPO_USERNAME:
vault: $EF_PROJECT_ID/repo.eclipse.org/username@cbi
file: false
REPO_PASSWORD:
vault: $EF_PROJECT_ID/repo.eclipse.org/password@cbi
file: false
NOTE: If you are not sure of the path, don't hesitate to ask a support
Build Docker image with buildkit
Buildkit job needs CI_REGISTRY_IMAGE
variable definition.
CI Auth variables must be set a least in project CI/CD variable configuration with a mask or in a vault:
* CI_REGISTRY_USER
: docker registry username
* CI_REGISTRY_PASSWORD
: docker registry token
The registry by default is docker.io
, but can be overriden with CI_REGISTRY
.
include:
- project: 'eclipsefdn/it/releng/gitlab-runner-service/gitlab-ci-templates'
file: '/jobs/buildkit.gitlab-ci.yml'
variables:
CI_REGISTRY_IMAGE: docker.io/eclipsecbi/gitlab-ci-templates
Full example with secrets:
e.g:
include:
- project: 'eclipsefdn/it/releng/gitlab-runner-service/gitlab-ci-templates'
file: '/jobs/buildkit.gitlab-ci.yml'
variables:
CI_REGISTRY_IMAGE: docker.io/eclipsecbi/gitlab-ci-templates
buildkit:
secrets:
CI_REGISTRY_USER:
vault: $EF_PROJECT_ID/docker.com/username@cbi
file: false
CI_REGISTRY_PASSWORD:
vault: $EF_PROJECT_ID/docker.com/api-token@cbi
file: false
IMPORTANT: Buildkit needs a build docker image infrastructure, address of this infrastructure can be changed with BUILDKIT_ADDRESS
.
Publish to projects-storage (download.eclipse.org)
Replace the script section based on what needs to be copied to the Project Storage server.
include:
- project: 'eclipsefdn/it/releng/gitlab-runner-service/gitlab-ci-templates'
file: '/jobs/projects-storage.gitlab-ci.yml'
projects-storage:
extends: .projects-storage
stage: deploy
secrets:
SSH_PRIVATE_KEY:
vault: $EF_PROJECT_ID/projects-storage.eclipse.org/id_rsa@cbi
SSH_PRIVATE_KEY_PASSPHRASE:
vault: $EF_PROJECT_ID/projects-storage.eclipse.org/id_rsa.passphrase@cbi
script:
- echo "Copy your artifacts with ssh."
- ssh "genie.$EF_SHORT_NAME@$SSH_HOSTNAME" ls -l "$DOWNLOADS_PATH"
Pipeline lists
Pipeline compliance
Pipeline compliance groups all compliance jobs in one include file.
include:
- project: 'eclipsefdn/it/releng/gitlab-runner-service/gitlab-ci-templates'
file: pipeline-compliance.gitlab-ci.yml'
Pipeline autodevops
Pipeline autodevops
includes only features from GitLab working in the Eclipse Foundation Infrastructure.
include:
- project: 'eclipsefdn/it/releng/gitlab-runner-service/gitlab-ci-templates'
file: pipeline-autodevops.gitlab-ci.yml'
These are all autodevops
features included:
- template: Jobs/Container-Scanning.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/Container-Scanning.gitlab-ci.yml
- template: Jobs/SAST.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml
- template: Jobs/SAST-IaC.latest.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml
- template: Jobs/Secret-Detection.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml
- template: Jobs/Dependency-Scanning.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml
The following features are not supported yet due to Openshift security policies: * Auto Code Quality * Auto License Compliance (License scanning of CycloneDX files is supported on OpenShift) * Auto Browser Performance Testing * Auto Build * Operational Container Scanning (Note: Pipeline Container Scanning is supported)
Pipeline container
Pipeline container groups all related container tools jobs in one file, including:
* buildkit
job
* hadolint
job
* autodevops
pipeline
include:
- project: 'eclipsefdn/it/releng/gitlab-runner-service/gitlab-ci-templates'
file: pipeline-container.gitlab-ci.yml'
Pipeline "Full"
This pipeline includes previous pipelines (pipeline-compliance
, pipeline-autodevops
), and adds container build feature and hadolint tool analysis.
include:
- project: 'eclipsefdn/it/releng/gitlab-runner-service/gitlab-ci-templates'
file: pipeline.gitlab-ci.yml'
variables:
CI_REGISTRY_IMAGE: docker.io/eclipsecbi/gitlab-ci-templates
IMPORTANT: CI_REGISTRY_IMAGE
, docker registry auth variables are mandatory on this pipeline.
Workflow
Default workflow provided is as follows:
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_PIPELINE_SOURCE == "web" || $CI_PIPELINE_SOURCE == "parent_pipeline"
- if: $CI_MERGE_REQUEST_IID
- if: $CI_COMMIT_TAG
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
This one can be easily overriden in .gitlab-ci.yml
project file.
Quick tips!
How to disable a specific job?
How to allow a job to fail and not the pipeline?
How to target a docker file in a directory?
buildkit:
variables:
BUILD_CONTEXT: test/docker
BUILD_CONTEXT_CHANGE: test/docker
hadolint:
variables:
DOCKERFILE_CONTEXT: test/docker
DOCKERFILE_CONTEXT_CHANGE: test/docker
How to only build docker image with latest tag?
How to apply my own tag strategy for docker image?
By default, the buildkit job proposes a tagging strategy for docker image, but this one can be overriden in before_script
section by project.
WARNING: if you use autodevops
you must apply this new strategy to Container Scanning
container_scanning:
variables:
GIT_STRATEGY: fetch
BUILD_CONTEXT_CHANGE: "" # https://gitlab.com/gitlab-org/gitlab/-/issues/216906
before_script:
- echo 'define your tag stategy'
- export CS_REGISTRY_USER=$CI_REGISTRY_USER
- export CS_REGISTRY_PASSWORD=$CI_REGISTRY_PASSWORD
- export CS_IMAGE="$CI_REGISTRY_IMAGE${CONTAINER_NAME:+"/$CONTAINER_NAME"}":"$IMAGE_TAG"
Other use cases
Maven integration with repo.eclipse.org
Configure distributionManagement
in the pom.xml
.
...
<distributionManagement>
<repository>
<id>repo.eclipse.org</id>
<name>Project Repository - Releases</name>
<url>https://repo.eclipse.org/content/repositories/project-releases/</url>
</repository>
<snapshotRepository>
<id>repo.eclipse.org</id>
<name>Project Repository - Snapshots</name>
<url>https://repo.eclipse.org/content/repositories/project-snapshots/</url>
</snapshotRepository>
</distributionManagement>
....
Create settings.xml
file in your project with this configuration.
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<interactiveMode>false</interactiveMode>
<servers>
<server>
<id>repo.eclipse.org</id>
<username>${env.REPO_USERNAME}</username>
<password>${env.REPO_PASSWORD}</password>
</server>
</servers>
<mirrors>
<mirror>
<id>eclipse.maven.central.mirror</id>
<name>Eclipse Central Proxy</name>
<url>https://repo.eclipse.org/content/repositories/maven_central/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
Job example to deploy to repo.eclipse.org
:
repo.eclipse.org:
stage: deploy
image: maven:3.9.6-eclipse-temurin-21
secrets:
REPO_USERNAME:
vault: <project_id>/repo.eclipse.org/username@cbi
file: false
REPO_PASSWORD:
vault: <project_id>/repo.eclipse.org/password@cbi
file: false
variables:
MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
script:
- mvn $MAVEN_CLI_OPTS deploy -s settings.xml
Gitlab Services Integration
For security reasons, most official images from dockerhub don't work with the foundation's okd cluster.
Which is the case with the postgresql
docker image. But alternatives exist.
Do not hesitate to ask for support in such cases.
variables:
POSTGRESQL_DATABASE: smo
POSTGRESQL_USER: custom_user
POSTGRESQL_PASSWORD: custom_pass
gitlab-services-integration:
stage: integration
needs: []
services:
- name: quay.io/sclorg/postgresql-15-c9s
alias: Postgres
image: Postgres
script:
- export PGPASSWORD=$POSTGRES_PASSWORD
- psql -h "postgres" -U "$POSTGRESQL_USER" -d "$POSTGRESQL_DATABASE" -c "SELECT 'OK' AS status;"
NOTE: Variables to pass to the services have to be defined at the pipeline level.