I’ve found a couple of solutions that work with Sphinx:

  1. Define a folder for each variant that includes a conf.py file and an index file.
  2. Add a function to conf.py that copies the customer1/index file to index.rst. The HTML then builds the landing page in the root folder.
  3. Define a variant specific table of contents in each index file. Apply exclusion in each table of contents to each other variant folder.
  4. With complex content, have each variant’s topic files in its own docs sub-folder and single-source common content. If not, you can probably just apply logic switches in the topic files via the only directive.
  5. Add a for loop in your pipeline.

For example

# ./customer1/conf.py
conf_original = 'index'
conf_target = '../../index.rst'
shutil.copyfile(conf_original, conf_target)
# ./.gitlab-ci.yml
variables:
  variants: customer1 customer2
  
html:
  stage: build
  script:
    - for variant in $variants; do
        sphinx-build -c variants/${variant} -b html -t ${variant} . _build/main/${variant};
      done
  artifacts:
    paths:
      - _build/$CI_COMMIT_REF_NAME