В настоящее время я использую Hashicorp Packer и Terraform для формирования своей инфраструктуры в VMWare. Вот краткая разбивка: Packer создает образ, а затем Terraform извлекает этот образ для создания инфраструктуры на его основе. Я углублюсь в эту тему в следующем посте, но это даст вам представление о моем путешествии.
Как только Packer и Terraform были бесшовно интегрированы с VMWare, у меня возникла проблема. Каждый раз, когда я настраивал свой репозиторий Packer, мне приходилось вручную запускать команду packer build на моей локальной конфигурации. Впоследствии мне пришлось бы терпеливо ждать завершения процесса сборки.
Меня осенило, что эта процедура является главным кандидатом на автоматизацию с помощью конвейера Дженкинса. Если вы не знакомы, конвейер Дженкинса — это автоматизированная последовательность сценариев (часто написанная в файле Jenkinsfile) и предназначенная для непрерывной интеграции и доставки. Он берет на себя сборку, тестирование и развертывание модификаций кода. И сегодня я с радостью расскажу вам о том, как настроить ваш собственный конвейер Jenkins!
Необходимые условия
- В этом руководстве предполагается, что у вас уже есть и работают Jenkins и Gitea.
- В этом руководстве предполагается, что у вас уже есть рабочая настройка Packer
Если есть интерес к этим темам, я был бы более чем счастлив написать подробные посты в блоге о них. Просто дайте мне знать в комментариях ниже!
Подготовка экземпляра Jenkins
Предполагая, что у вас уже установлен Jenkins на виртуальной машине или в контейнере, вам нужно будет выполнить несколько быстрых шагов, выполнив следующие действия
Установите Packer на хост Jenkins:
- Если вы используете Jenkins в Docker, выполните docker exec, чтобы войти в контейнер и продолжить установку там. Такой подход может быть не самой лучшей практикой, но для наших целей его будет достаточно. Обратитесь к этой ссылке для получения подробных инструкций по установке Packer.
Дополнительные зависимости:
- Во время настройки я заметил, что mkisofs необходим для правильной работы Packer на моей машине. Вы можете столкнуться с аналогичным требованием. Чтобы установить его, просто запустите apt install mkisofs.
Начало работы с Jenkins
Для начала вам нужно перейти по адресу https://<your_jenkins_instance>/manage/pluginManager/available а затем найти плагин Gitea.
После того, как плагин будет загружен, установлен и перезапущен Jenkins, перейдите в https://<your_jenkins_instance>/manage/configure. Здесь вы можете прокрутить вниз и начать интеграцию вашего экземпляра Gitea с Jenkins:
Просто нажмите Add», а затем выберите Gitea Server
Затем в поле Name присвойте вашему экземпляру Gitea понятное имя. В поле Server URL укажите URL-адрес экземпляра Gitea.
Приготовление гитеи
Прежде чем мы сможем продолжить, нам нужно немного времени, чтобы создать нового пользователя по имени Jenkins в Gitea. Хотя теоретически вы можете использовать свои личные учетные данные или учетные данные администратора на последующих шагах, лучше всего следовать принципу наименьших привилегий и создать пользователя, который будет иметь доступ только к вашему репозиторию Packer.
Для этого перейдите в раздел Site Administration > User Accounts». Здесь вы можете выбрать Create User Account». Установите имя пользователя Jenkins, а затем укажите пароль.
Затем добавьте только что созданного пользователя Jenkins в качестве соавтора в проект Git.
Создание Jenkinsfile
Прежде чем настраивать фактическое задание конвейера в пользовательском интерфейсе Jenkins, вам потребуется создать новый файл в корне вашего репозитория (а затем зафиксировать/отправить его в репозиторий после завершения) с именем Jenkinsfile. В этом файле вы заполните его примерно следующим образом:
// This Jenkinsfile defines a declarative pipeline
pipeline {
// Specifies that this pipeline can run on any available agent
agent any
// Defines the sequence of stages that will be executed
stages {
// This stage checks out the source code from the SCM (Source Code Management) system
stage('Checkout') {
steps {
// This command checks out the source code from the SCM into the Jenkins workspace
checkout scm
}
}
// This stage validates the Packer template
stage('Validate Packer Template') {
steps {
script {
// This command validates the Packer HCL (HashiCorp Configuration Language) template using the provided variable files. Ensure these file names are correct for your setup.
sh "packer validate -var-file variables.pkrvars100GBdisk.hcl -var-file vsphere.pkrvars.hcl ubuntu-22.04.pkr.hcl"
}
}
}
// This stage builds a VMWare image using Packer
stage('Build VMWare Image') {
when {
// This condition ensures that this stage will only run if the previous 'Validate Packer Template' stage succeeded
expression { currentBuild.resultIsBetterOrEqualTo('SUCCESS') }
}
steps {
script {
// This command builds a VMWare image using Packer with the provided variable files
// It will forcefully build the image even if it exists and will prompt for action on any errors
// Ensure these file names are correct for your setup
sh "packer build -force -on-error=ask -var-file variables.pkrvars100GBdisk.hcl -var-file vsphere.pkrvars.hcl ubuntu-22.04.pkr.hcl"
}
}
}
}
// Defines actions to be executed after the stages, regardless of their outcome
post {
// This will always archive any .log files in the workspace, even if there are none
always {
archiveArtifacts artifacts: '**/*.log', allowEmptyArchive: true
}
// If any stage failed, this will print an error message
failure {
echo "The build failed. Please check the logs."
}
}
}
Jenkinsfile определяет конвейер, который выполняет три основные задачи: во-первых, он извлекает исходный код из системы управления исходным кодом (SCM); затем он проверяет шаблон Packer для создания образов VMWare; и если проверка прошла успешно, он приступает к сборке образа VMWare с использованием указанного шаблона Packer. После всех этапов он архивирует все .log файлы, найденные в рабочей области, и в случае сбоя на каком-либо этапе выводится уведомление для пользователя для проверки журналов.
Создание конвейера
Теперь, когда пользователь Jenkins создан в Gitea и Jenkinsfile существует в вашем репозитории, мы можем продолжить создание нашего конвейера. Начиная с панели Jenkins, выберите New Item»
Присвойте новому элементу имя, а затем выберите Pipeline» и тип проекта.
На новой странице вам будет предложено настроить свой конвейер, одним из необязательных элементов, который вы можете использовать, является Poll SCM. Это позволяет Jenkins периодически опрашивать репозиторий на предмет изменений по расписанию, подобному cron. В примере, который я показал здесь, он будет опрашивать репозиторий каждый час на предмет изменений и, если он увидит, что в репозитории произошли новые изменения с момента последней сборки, он начнет новую сборку с новым кодом.
💡
Небольшое примечание: это также можно сделать с помощью вебхуков, если вы предпочитаете идти по этому пути. Чтобы начать работу, ознакомьтесь с этой документацией
На следующем этапе потребуется немного больше настроек. Для начала измените раскрывающийся список Definition на Pipeline script from SCM. По сути, это означает, что конвейер будет ссылаться на Jenkinsfile в репозитории (который я покажу в конце этого руководства). Затем вам нужно будет заполнить Repository URL.
Далее установите учетные данные на те, которые вы создали в Gitea ранее. Если вы еще не добавили их в Jenkins, вы можете просто добавить их на этом этапе.
Здесь следует обратить внимание на имя ветки в вашем репозитории, из которой вы хотели бы получить данные. По умолчанию, я полагаю, что это было установлено на */master, но имя моей ветки main.
Наконец, в нижней части этой страницы конфигурации вы можете видеть, что поле Script Path по умолчанию заполнено Jenkinsfile. Это будет ссылаться на Jenkinsfile из вашего репозитория.
Запуск конвейера
Предполагая, что этот файл был отправлен в ваш репозиторий, теперь вы можете продолжить работу вашего конвейера! Чтобы запустить его вручную, просто нажмите Build Now» на странице конвейера:
Внутри него вы должны увидеть что-то похожее на это, показывая, как он строится с помощью шагов, которые мы описали в Jenkinsfile.
Заключение
Мы рассмотрели процесс автоматизации создания образов VMWare с помощью комбинации Jenkins, Gitea и Packer. Интегрировав эти инструменты, мы не только оптимизировали процесс сборки, но и обеспечили согласованность и сократили ручное вмешательство, которое часто может быть подвержено ошибкам. Такая конфигурация, основанная на принципах «инфраструктура как код» (IaC), расширяет наши возможности по поддержанию воспроизводимой инфраструктуры, позволяя быстро выполнять итерации и корректировки по мере необходимости.
При наличии этого конвейера Jenkins каждое изменение в нашем репозитории Packer запускает хорошо организованную серию событий, от проверки наших шаблонов Packer до создания образов VMWare. Такая автоматизация гарантирует, что наша инфраструктура остается современной, безопасной и эффективной.
Для тех, кто перешел от ручной сборки к этой автоматизированной настройке, преимущества будут очевидны с точки зрения экономии времени и достижения согласованности. И если это ваш первый опыт работы с конвейерами Jenkins или IaC, то это захватывающее знакомство с миром автоматизированного управления инфраструктурой.
Забегая вперед, можно сказать, что возможности безграничны. По мере развития технологий и роста потребностей в инфраструктуре появляется множество возможностей для расширения и совершенствования нашего конвейера, интеграции дополнительных инструментов или углубления в расширенные функции Jenkins. Следите за новостями и всегда помните: автоматизация — это не только упрощение задач; Речь идет о том, чтобы сделать наши системы умнее, надежнее и быстрее реагировать на наши постоянно меняющиеся потребности. Удачного строительства!