mirror of
https://gitlab.com/TECHNOFAB/nix-gitlab-ci.git
synced 2025-12-12 02:00:13 +01:00
add new env variables to configure which CI source gets mapped to default add logic to check if pipeline exists in flake, else build "default"
95 lines
3.6 KiB
YAML
95 lines
3.6 KiB
YAML
spec:
|
|
inputs:
|
|
cache_strategy:
|
|
type: string
|
|
description: |
|
|
(empty for auto) | none | runner | cachix | attic
|
|
Sets the default strategy and will be overridden by $NIX_CI_CACHE_STRATEGY
|
|
default: "none"
|
|
cache_files:
|
|
type: array
|
|
description: |
|
|
Files to use as the cache key for the generated pipeline yaml.
|
|
If you use "ci.nix" to define CI, add that here for example
|
|
default: ["flake.nix", "flake.lock"]
|
|
---
|
|
stages:
|
|
- build
|
|
- trigger
|
|
variables:
|
|
# which version of the image should be used
|
|
_NIX_CI_VERSION: ${NIX_CI_VERSION}
|
|
_NIX_CI_IMAGE: registry.gitlab.com/technofab/nix-gitlab-ci/nix-ci:${_NIX_CI_VERSION}
|
|
# force build the pipeline yaml
|
|
_NIX_CI_FORCE_BUILD: ${NIX_CI_FORCE_BUILD}
|
|
# disable caching on the child pipeline jobs
|
|
_NIX_CI_DISABLE_CACHE: ${NIX_CI_DISABLE_CACHE}
|
|
# type of cache strategy to use (none, runner, attic, cachix)
|
|
_NIX_CI_CACHE_STRATEGY: $[[ inputs.cache_strategy ]]
|
|
# for multiple pipelines
|
|
_NIX_CI_PIPELINE_NAME: ${CI_PIPELINE_SOURCE}
|
|
# set NIX_CI_DEFAULT_SOURCES to something like "/^web/" or "/^web|push/",
|
|
# then this will default to the "default" pipeline for these sources.
|
|
# By default we map everything to "default" (man that's quite a bunch of defaults)
|
|
_NIX_CI_DEFAULT_SOURCES: "/.*/"
|
|
.env_overrides: &env_overrides
|
|
rules:
|
|
- if: $NIX_CI_IMAGE != null
|
|
variables:
|
|
_NIX_CI_IMAGE: $NIX_CI_IMAGE
|
|
- if: $NIX_CI_CACHE_STRATEGY != null
|
|
variables:
|
|
_NIX_CI_CACHE_STRATEGY: $NIX_CI_CACHE_STRATEGY
|
|
- if: $NIX_CI_DEFAULT_SOURCES != null
|
|
variables:
|
|
_NIX_CI_DEFAULT_SOURCES: $NIX_CI_DEFAULT_SOURCES
|
|
- if: '$CI_PIPELINE_SOURCE =~ $_NIX_CI_DEFAULT_SOURCES'
|
|
variables:
|
|
_NIX_CI_PIPELINE_NAME: default
|
|
- if: $NIX_CI_PIPELINE_NAME != null
|
|
variables:
|
|
_NIX_CI_PIPELINE_NAME: $NIX_CI_PIPELINE_NAME
|
|
- when: on_success
|
|
nix-ci:build:
|
|
<<: *env_overrides
|
|
stage: build
|
|
image: $_NIX_CI_IMAGE
|
|
cache:
|
|
- key:
|
|
files: $[[ inputs.cache_files ]]
|
|
prefix: $_NIX_CI_PIPELINE_NAME
|
|
paths:
|
|
- generated-gitlab-ci.yml
|
|
- key: nix
|
|
paths:
|
|
- .nix-cache/
|
|
before_script:
|
|
# generated-gitlab-ci.yml exists in the cache
|
|
- '[ -f "generated-gitlab-ci.yml" ] && export CACHED=true && echo "A cached pipeline file exists (skip cache with NIX_CI_FORCE_BUILD)" || true'
|
|
# allow the user to manually skip the cache (when the key files are not correctly configured etc.)
|
|
- '[ -n "$_NIX_CI_FORCE_BUILD" ] && unset CACHED && echo "Caching skipped for this job (through NIX_CI_FORCE_BUILD)" || true'
|
|
# only setup when we need to generate the pipeline yaml
|
|
- 'if [ -z "$CACHED" ]; then source setup_nix_ci; fi'
|
|
script:
|
|
# build the generated-gitlab-ci.yml if it does not exist in the cache
|
|
- 'if [ -z "$CACHED" ]; then nix eval --json ".#gitlab-ci:pipeline:${_NIX_CI_PIPELINE_NAME}" &>/dev/null && _NAME=$_NIX_CI_PIPELINE_NAME || _NAME="default"; fi'
|
|
- 'if [ -z "$CACHED" ]; then nix build .#gitlab-ci:pipeline:${_NAME} && install result generated-gitlab-ci.yml; fi'
|
|
after_script:
|
|
# save to binary cache or Gitlab CI cache only if we actually built something
|
|
# check if /tmp/nix-store-before exists as $CACHED never exists here and the file only exists if "setup_nix_ci" is called
|
|
- 'if [ -f "/tmp/nix-store-before" ]; then finalize_nix_ci; fi'
|
|
artifacts:
|
|
paths:
|
|
- generated-gitlab-ci.yml
|
|
nix-ci:trigger:
|
|
<<: *env_overrides
|
|
stage: trigger
|
|
needs:
|
|
- nix-ci:build
|
|
trigger:
|
|
include:
|
|
- artifact: generated-gitlab-ci.yml
|
|
job: nix-ci:build
|
|
strategy: depend
|
|
forward:
|
|
pipeline_variables: true
|