Качество кукольного кода (3 части серии)
В На прошлой неделе пост Я представил, как настроить Кукольный каталог развлекается Развлекаться между двумя кукольными средами.
Разве это не было бы здорово, если этот инструмент может быть использован для выполнения автоматического анализа удара перед объединением ветви Git (AKA Chare English или запрос на тягу)? Ну, это может.
Наша текущая настройка основана на Redhat openshift и Gitlab Отказ Это, однако, легко переносимо к другому варианту установки.
Кукольная инфраструктура
Марионеточная инфраструктура в настоящее время работает в openshift, используя нашу серию Кукольные элементы Hearm Charts Для Puppeterver, PuppetDB, Щенцевой доски и кукольного каталога Diff Viewer.
Мы находимся в процессе миграции от Beachet 5 в Beachet 6, поэтому в настоящее время у нас есть два развернутых диаграммы Puppeterver, один для каждой версии. Puppeterver
Сервис указывает на двух марионеток 5 стручек, а Puppeterver6
Сервис указывает на двух марионеток 6 стручков.
У нас есть Passthrough Repenshift Parts, сидя перед службами, чтобы открыть их до остальной части инфратуры (по порту 443 вместо 8140).
Линта и развертывание
Развертывание кукольного кода выполняется с использованием диаграммы бегуна GitLab, развертывание которой устанавливает громкость CucetCode (ПВХ от развертывания Puppeterver). Затем мы запускаем R10k в трубопроводе GitLab каждый раз, когда ветка нажата.
Мы также пересекаем код перед развертыванием его, используя Ожовери Кодового плагина качества Отказ
Вот что это выглядит в .gitlab-ci.yml
:
-------- stages: - lint - deploy .create_r10k_yaml: &create_r10k_yaml | cat << EOF > /tmp/r10k.yaml --- :cachedir: /etc/puppetlabs/code/cache :sources: :main: remote: $CI_PROJECT_DIR basedir: /etc/puppetlabs/code/environments EOF linting-puppet-hiera: image: camptocamp/onceover-codequality:latest stage: lint script: - 'onceover run codequality --no_docs' tags: - puppetmaster rules: # Skip linting if the commit message contains "[skip lint]" - if: '$CI_COMMIT_MESSAGE !~ /\[skip lint\]/' r10k-deploy: image: puppet/r10k:3.1.0 stage: deploy tags: # Select GitLab runner from the Puppet OpenShift env (which mounts Puppetcode) - puppetmaster before_script: - while [ -f /etc/puppetlabs/code/r10k.lock ]; do echo -n "Waiting for lock from "; cat /etc/puppetlabs/code/r10k.lock || echo; sleep 2; done - hostname -f > /etc/puppetlabs/code/r10k.lock script: - umask 0002 # Git https secrets are mounted in the GitLab runner - ln -s /secrets/.netrc ~/ - *create_r10k_yaml - git fetch --unshallow - 'git branch -r | grep -v "\->" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done' - r10k deploy --color -c /tmp/r10k.yaml environment ${CI_COMMIT_REF_NAME} -p --verbose=debug - puppet generate types --environment ${CI_COMMIT_REF_NAME} after_script: - rm -f /etc/puppetlabs/code/r10k.lock
Каталог отличается
Когда запрос слияния открыт, мы хотим проанализировать влияние, которое он будет иметь, прежде чем мы сможем объединить его. Это где каталог diff играет большую роль.
Если у вас не имеет огромную кукольную инфраструктуру, Diff каталог довольно тяжелый для запуска, поскольку он запросит много каталогов в небольшом количестве времени.
Новый --old_catalog_from_puppetdb
Опция, представленная в версии 1.7.0, снижает нагрузку вдвое, получая «из» каталогов от PuppetDB, но он все еще является широкой партией запросов к серверам марионеток.
По этой причине мы проводим каталог diff только по требованию, как ручная задача. Lint и развертывание запускаются во второй раз, чтобы сделать их обязательными шагами, прежде чем слияние можно проверить.
Вот установка:
.create_puppetdb_conf: &create_puppetdb_conf | cat << EOF > /etc/puppetlabs/puppet/puppetdb.conf [main] server_urls = https://puppetdb:8081 EOF .create_csr_attributes_yaml: &create_csr_attributes_yaml | cat << EOF > /etc/puppetlabs/puppet/csr_attributes.yaml --- custom_attributes: # Our autosign script uses hashed secrets based on a psk, # the certname and the environment coded in the certificate 1.2.840.113549.1.9.7: '$(echo -n "$psk/$(puppet config print certname)/production" | openssl dgst -binary -sha256 | openssl base64)' extension_requests: # We use the pp_authorization=catalog extension to set up auth.conf for v4/catalog 1.3.6.1.4.1.34380.1.3.1: 'catalog' 1.3.6.1.4.1.34380.1.1.12: 'production' EOF .cleanup_cert: &cleanup_cert | curl -s -X DELETE \ "Accept:application/json" -H "Content-Type: text/pson" \ --cacert "/etc/puppetlabs/puppet/ssl/certs/ca.pem" \ --cert "/etc/puppetlabs/puppet/ssl/certs/$(puppet config print certname).pem" \ --key "/etc/puppetlabs/puppet/ssl/private_keys/$(puppet config print certname).pem" \ "https://puppetserver:8140/puppet-ca/v1/certificate_status/$(puppet config print certname)?environment=production" catalog-diff: image: puppet/puppet-agent:6.15.0 stage: diff tags: # Select GitLab runner in Puppet OpenShift env to get direct access to services - puppetmaster script: - apt update - apt install -y locales puppetdb-termini - locale-gen en_US.UTF-8 - *create_puppetdb_conf - *create_csr_attributes_yaml # Generate a certificate and get it signed - puppet ssl submit_request --ca_server puppetserver --certificate_revocation=false # We currently diff with puppetserver6 for the migration - puppet catalog --environment ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} --certificate_revocation=false diff puppetserver:8140/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME} puppetserver6:8140/${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} --show_resource_diff --changed_depth 1000 --content_diff --old_catalog_from_puppetdb --certless --threads 4 --output_report /catalog-diff/mr_${CI_MERGE_REQUEST_IID}_${CI_JOB_ID}.json after_script: # We have configured our auth.conf to allow nodes to clean their own cert, see https://dev.to/camptocamp-ops/automatic-renewal-of-puppet-certificates-28pm - *cleanup_cert - echo "You can view the report details at https://puppetdiff.example.com/?report=mr_${CI_MERGE_REQUEST_IID}_${CI_JOB_ID}" # Post a comment on the Merge Request - 'curl -k -X POST -H "Private-Token: $CI_BOT_TOKEN" -d "body=You can view the Catalog Diff report details at https://puppetdiff.example.com/?report=mr_${CI_MERGE_REQUEST_IID}_${CI_JOB_ID}" $CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/notes' # Allow failure so the Merge Request can be validated even without catalog diff allow_failure: true rules: - if: '$CI_MERGE_REQUEST_ID' when: manual variables: LANG: en_US.UTF-8 LC_ALL: en_US.UTF-8
Несколько замечаний по этой установке:
PuppetDB обращается через SSL. Поскольку у нас есть допустимые сертификаты для доступа к серверу кукол, мы также можем, но 8080 в порядке, если у вас есть такая возможность.
Мы используем Autosign Script Подписать сертификаты, используя PSK (который мы хэш). Если вам легче, вы также можете ввести действительный ключ и сертификат в сборку вместо PSK.
Если вы не генерируете сертификат, вам также не нужен шаг очистки.
Отчеты сохраняются в
/каталог-различие
Справочник, который устанавливается на бегун от кукольного каталога Diff Viewer PVC. Таким образом, отчеты доступны непосредственно в зрителе, передавая их имя в строке запроса.Запрос скручивания запроса слияния требует прохождения
Ci_bot_token
переменная к сборке. В настоящее время мы устанавливаем один в переменные сборки, используя учетную запись GitLab Robot. Если у вас есть серебряный план GitLab, вы можете использоватьCi_job_token
переменной вместо этого.
На что это похоже?
Вот несколько скриншотов типичного рабочего процесса.
Проверка запроса слияния, с комментарием, оставленным ботом после того, как сборка DIFF каталога была запущена (см. 3 этапа в строке 3)
Просмотр отчета, сгенерированного кукольным каталогом, Diff запустить
Демонстрация
Вот демонстрация видео установки, описанной выше:
В итоге
Эта настройка позволяет нам:
- Проверьте качество кода (Lint) перед развертыванием сред
- Проверьте, какие изменения будут доставлены в кукольные каталоги, прежде чем принимать запрос слияния
Как указано в предыдущем сообщении в блоге, это не учитывается для каждого изменения, поскольку изменения в плагинах (фактах, типах и провайдерах, авгусских линзах и т. Д.) Также могут быть обнаружены серверы, но не будут видели в каталоге Diffs.
Качество кукольного кода (3 части серии)
Оригинал: «https://dev.to/camptocamp-ops/automated-puppet-impact-analysis-1c1»