mirror of
https://gitlab.com/TECHNOFAB/nix-gitlab-ci.git
synced 2025-12-12 02:00:13 +01:00
add multi-arch (arm & x64) image add multiple pipelines (ci now creates the "default" pipeline as a shorthand) simplify devenv flake input merge all cache options together, now $NIX_CI_CACHE_STRATEGY decides how the cache works setup_nix_ci and finalize_nix_ci are now flake packages and work standalone the specific image is not needed anymore, any image with the right dependencies works runner cache is not the default anymore (because it sucked most of the time) the pipeline is selected by $NIX_CI_PIPELINE_NAME or if empty by $CI_PIPELINE_SOURCE, so for the old behaviour $NIX_CI_PIPELINE_NAME=default is needed, future work will be needed to handle this more nicely
72 lines
2.8 KiB
YAML
72 lines
2.8 KiB
YAML
spec:
|
|
inputs:
|
|
cache_strategy:
|
|
type: string
|
|
description: |
|
|
(empty for auto) | none | runner | cachix | attic
|
|
When left empty $NIX_CI_CACHE_STRATEGY will be used, which defaults to none
|
|
default: ""
|
|
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: ${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)
|
|
_CACHE_STRATEGY_TMP: $[[ inputs.cache_strategy ]]
|
|
_NIX_CI_CACHE_STRATEGY: ${NIX_CI_CACHE_STRATEGY:-${_CACHE_STRATEGY_TMP:-none}}
|
|
# for multiple pipelines
|
|
_NIX_CI_PIPELINE_NAME: ${NIX_CI_PIPELINE_NAME:-${CI_PIPELINE_SOURCE:-default}}
|
|
nix-ci:build:
|
|
stage: build
|
|
image: $_NIX_CI_IMAGE
|
|
cache:
|
|
- key:
|
|
files: $[[ inputs.cache_files ]]
|
|
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 build .#gitlab-ci-config && install result generated-gitlab-ci.yml; fi'
|
|
after_script:
|
|
# NOTE: environment variables of before_script and script don't exist here anymore
|
|
#
|
|
# 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:
|
|
stage: trigger
|
|
needs:
|
|
- nix-ci:build
|
|
trigger:
|
|
include:
|
|
- artifact: generated-gitlab-ci.yml
|
|
job: nix-ci:build
|
|
strategy: depend
|
|
forward:
|
|
pipeline_variables: true
|