Немного про то, как мы запускаем молекула в сиай. Про то, как писать молекула тесты тут речи не пойдет.
Предположим, что в роли в molecule у нас есть несколько сценариев.
default(debian), centos, rocky.
Можно добавить сколько угодно своих или разделить еще более явно сценарии по версиям дистрибутивов.
Основной .gitlab-ci:
workflow:
auto_cancel:
on_new_commit: interruptible
variables:
ANSIBLE_MAIN_VERSION: "ansible-2.15"
ANSIBLE_HOST_KEY_CHECKING: "false"
ANSIBLE_RETRY_FILES_ENABLED: "false"
ANSIBLE_SSH_PIPELINING: "true"
ANSIBLE_DISPLAY_SKIPPED_HOSTS: "false"
ANSIBLE_FORCE_COLOR: "true"
stages:
- primary_test
- additional_tests
before_script:
- export PATH="/home/gitlab-runner/.local/bin:$PATH"
- pip install --no-cache-dir --upgrade --ignore-installed tox
- |
for req in molecule/*/requirements.yml; do envsubst < "$req" > /tmp/req.yml.tmp && mv /tmp/req.yml.tmp "$req"
done
# Базовый тест: main ansible version × все сценарии
molecule-test:
stage: primary_test
script:
- tox -e ${ANSIBLE_MAIN_VERSION}
after_script:
- >
if [ $CI_JOB_STATUS == 'canceled' ]; then
molecule destroy --scenario-name ${MOLECULE_SCENARIO} || true
fi
parallel:
matrix:
- MOLECULE_SCENARIO:
- default
- centos
- rocky
interruptible: true
tags:
- molecule-test
# Дополнительные тесты: остальные ansible versions × все сценарии
tox-tests:
stage: additional_tests
script:
- tox -e ${ANSIBLE}
after_script:
- >
if [ $CI_JOB_STATUS == 'canceled' ]; then
molecule destroy --scenario-name ${MOLECULE_SCENARIO} || true
fi
parallel:
matrix:
- ANSIBLE:
- ansible-2.16
- ansible-2.17
- ansible-2.18
MOLECULE_SCENARIO:
- default
- centos
- rocky
interruptible: true
tags:
- molecule-test
В основном тесте прогоняем все сценарии по всем версиям дистрибутивов но с ansible-core 2.15. Остальное запускаем через matrix и tox.
Пример tox.ini:
[tox]
envlist = ansible-2.{15,16,17,18}
skipsdist = true
recreate = true
parallel_show_output = true
[testenv]
commands =
python --version
ansible --version
ansible-lint --version
molecule --version
molecule test --scenario-name {env:MOLECULE_SCENARIO:default}
setenv =
TOX_ENVNAME={envname}
PY_COLORS=1
ANSIBLE_FORCE_COLOR=1
ANSIBLE_HOST_KEY_CHECKING="false"
ANSIBLE_RETRY_FILES_ENABLED="false"
ANSIBLE_SSH_PIPELINING="true"
ANSIBLE_DISPLAY_SKIPPED_HOSTS="false"
passenv = *
[testenv:ansible-2.15]
basepython = python3.11
deps =
-rrequirements.txt
ansible-core==2.15.*
ansible-lint==24.*
[testenv:ansible-2.16]
basepython = python3.12
deps =
-rrequirements.txt
ansible-core==2.16.*
ansible-lint==24.*
[testenv:ansible-2.17]
basepython = python3.12
deps =
-rrequirements.txt
ansible-core==2.17.*
ansible-lint==24.*
[testenv:ansible-2.18]
basepython = python3.12
deps =
-rrequirements.txt
ansible-core==2.18.*
ansible-lint==24.*
Итого на стадии additional_tests мы прогоняем тесты по всей матрице. Разные версии ansible + сценарии. Естественно раннер должен быть в таком случае привелигированным и правильно настроенным. Но это уже отдельная история.
Если используйте tox 4.x.x версии, то лучше использовать именование без точки, иначе может быть конфликт. Например в matrix можно передать так значения:
- ANSIBLE:
- py311-ansible215
- py312-ansible216
- py312-ansible217
- py312-ansible218
Соответственно в tox.ini:
[tox]
envlist =
py311-ansible215
py312-ansible216
py312-ansible217
py312-ansible218
И далее заменить именование по файлу.
#ansible
#molecule