Начиная с 8-й версии сервер Gitlab включает в себя систему continuous integration. Это позволяет относительно просто и штатными средствами настроить проверку кода, сборку или даже установку в промышленную среду. В этой заметке я хочу описать пример использования Gitlab CI и GitLab Runner для Puppet-кода. GitLab Runner — это агент, который собственно и занимается выполнением инструкций описанных в специальном файле .gitlab-ci.yml. Тестирование кода будет выполняться в docker-контейнере.
Вместо предисловия
Чтобы тестирование кода работало он должен содержать описание правил проверки. Например, если модуль был создан с использованием:
$ puppet module generate hello-world
то все необходимое уже есть. Если же это не так, необходимо создать несколько файлов в корневом каталоге
Rakefile
require 'puppetlabs_spec_helper/rake_tasks'
require 'puppet-lint/tasks/puppet-lint'
PuppetLint.configuration.send('disable_80chars')
PuppetLint.configuration.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp"]
desc "Validate manifests, templates, and ruby files"
task :validate do
Dir['manifests/**/*.pp'].each do |manifest|
sh "puppet parser validate --noop #{manifest}"
end
Dir['spec/**/*.rb','lib/**/*.rb'].each do |ruby_file|
sh "ruby -c #{ruby_file}" unless ruby_file =~ /spec\/fixtures/
end
Dir['templates/**/*.erb'].each do |template|
sh "erb -P -x -T '-' #{template} | ruby -c"
end
end
spec/spec_helper.rb
require 'puppetlabs_spec_helper/module_spec_helper'
Более подробно о том что это, зачем и как еще можно этим пользоваться доступно на сайте puppet.
Подготовка контейнера с GitLab Runner
Для тестирования будем использовать контейнер, поэтому первым делом необходимо его собрать. Внутри образа с помощью Ruby Version Manager (RVM) можно использовать несколько версий ruby одновременно. Это будет полезно в некоторых случаях, например если используется 3-я версия puppet на разных версиях Linux и кастомизированные факты написанные на ruby.
Dockerfile
FROM gitlab/gitlab-runner:latest
RUN apt-get update -y && \
apt-get upgrade -y && \
apt-get install -y build-essential make curl git && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN \curl -L https://get.rvm.io | bash -s stable
RUN /bin/bash -c "source /etc/profile.d/rvm.sh; \
rvm install ruby-2.1.8 && \
rvm use --default ruby-2.1.8"
RUN /bin/bash -c "source /usr/local/rvm/scripts/rvm; \
gem install metadata-json-lint puppet puppet-lint puppetlabs_spec_helper"
VOLUME ["/etc/gitlab-runner", "/home/gitlab-runner"]
ENTRYPOINT ["/usr/bin/dumb-init", "/entrypoint"]
CMD ["run", "--user=gitlab-runner", "--working-directory=/home/gitlab-runner"]
docker-compose.yml
version: '2'
services:
gitlab_runner:
restart: always
build: .
container_name: gitlab_runner
volumes:
- /export/containers/gitlab-runner-conf:/etc/gitlab-runner
- /export/containers/gitlab-runner-data:/home/gitlab-runner
network_mode: "bridge"
Сборка и запуск контейнера:
$ docker-compose build $ docker-compose up -d $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES db3a5edadfec gitlabrunner_gitlab_runner "/usr/bin/dumb-init /" 2 seconds ago Up 2 seconds gitlab_runner
Настройка Gitlab CI для тестирования и установки модуля puppet
Для настройки gitlab-runner необходимо зайти в веб-интерфейс gitlab

Полученные данные применяются для настройки gitLab runner в созданном docker-контейнере:
$ docker exec -i -t gitlab_runner gitlab-runner register
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):
http://gitlab.rascal.local:8080/ci
Please enter the gitlab-ci token for this runner:
6FwQc7tKoMsVr7UQyYos
Please enter the gitlab-ci description for this runner:
[db3a5edadfec]: code-validator
Please enter the gitlab-ci tags for this runner (comma separated):
test
Registering runner... succeeded runner=6FwQc7tK
Please enter the executor: ssh, virtualbox, docker+machine, docker-ssh+machine, docker, docker-ssh, parallels, shell:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
Теперь можно активировать Gitlab CI для проекта:

Содержимое файла конфигурации Gitlab CI:
stages:
- test
- deploy
- import
test_job:
stage: test
script:
- rake validate lint
tags:
- test
deploy_job:
stage: deploy
script:
- cd /etc/puppetlabs/code/
- sudo /usr/local/bin/r10k puppetfile install
tags:
- puppet
only:
- master
import_job:
stage: import
script:
- sudo hammer proxy import-classes --id 1
tags:
- foreman
only:
- master
Приведенная конфигурация описывает три этапа:
- Проверку кода (на созданном в начале заметки docker-контейнере).
- Развертывание кода из ветки master на сервере Puppet
- Импорт классов puppet на сервере Foreman
На мой взгляд GitLab Runner может использоваться в 90% случаев. Для остального есть Jenkins и TeamCity.



