Рубрики
Uncategorized

Породить Дженкинс из кода

Как вызвать Jenkins только из конфигурации в качестве кода. Tagged с DevOps, тестирование, безопасность, Linux.

Через CI Glise Glass

В корпоративной инфраструктуре CI конфигурация является ключевой.

Когда дело доходит до Дженкинс , мы можем легко посмотреть на это Как будто это всего лишь прославленная коллекция рабочих мест Crontab Анкет Только позже мы понимаем, что это стало намного больше, и это управляет конфиденциальные данные и конфигурация Больше, чем мы впервые понимаем.

Учетные данные, информация об хосте, инструкции по работе, тестирование и определения рабочих процессов производства, а также все специальные настройки и плагины для поддержания шоу. Используя Работа DSL является одним из первых важных вех, которые а Команда CI должна достичь При работе с Дженкинсом. Это, по крайней мере, обеспечивает нам некоторую безопасность. С помощью Job DSL наши определения работы, которые служат чертежом для наших трубопроводов продукта, можно поддерживать в контроле версий. Это действительно снимает вес у плеч парней DevOps.

Это дает нам душевное спокойствие, если хотите.

Все еще , в очаге нашего Дженкинса есть злой секрет, и этот секрет — это Конфигурация, которую мы провели утомительной ручной работой на странице конфигураций . Если наши серверы случаются с Укусить пыль Мы можем изо всех сил пытаться выяснить, как заставить нашу работу снова работать в ванили Дженкинс, ничего не зная об этих неявных зависимостях, которые являются результатом некоторых Special Конфигурация порта или установка плагина, которая была сделана много лет назад какой -то парень Кто даже не в фирме в то время. Это может быть довольно неприятной, чтобы воскресить инфраструктуру CI после такой неудобной аварии.

Я собираюсь углубиться в более продвинутую тему здесь, поэтому, если вы новичок в Jenkins, лучше начать с самого начала. Что не является документацией. Ну давай же. Не лги себе. Вы учитесь только делая вещи. Просто установите Jenkins и начните ломать его по -разному. Серьезно.

Не согласно руководству

Давайте объявим о нашей цели таким образом:

Установите Jenkins прямо из кода, используя конфигурацию, которая хранится в файлах, чтобы ее можно было управлять версией.

Нам нужен процесс сценария, который можно запустить из командной строки с помощью одной команды и нескольких параметров.

Одна вещь Я должен добавить: Здесь много неявных зависимостей, о которых нужно позаботиться при выполнении нулевой к герою Автоматизированная настройка Дженкинса. Существуют определенные подводные камни (например, обработка необходимых зависимостей, управление совместимостью наших требований к плагину с выбранной версией Jenkins или выяснение того, как управлять экземплярами Java Jenkins или определенного плагина при настройке через CLI). Я не дам вам полного решения здесь. Считайте это Коллекция идей , или Руководство если хочешь. Это тот же процесс, который моя команда использовала при создании нашего собственного решения для кода.

Посмотрим процесс

Прежде чем мы перейдем к написанию кода, вы также можете посмотреть на Новый плагин конфигурации как код Это может очень помочь поддерживать конфигурацию Дженкинса. Во всяком случае, согласно слухам, это может скоро стать основным компонентом Дженкинса.

Первый шаг: получите свой файл войны в Дженкинсе.

Ни один Дженкинс не работает без необходимого бинарного. Вы можете получить его отсюда: https://updates.jenkins-ci.org/download/war/

Создайте свой собственный дом Jenkins

Мы начнем С нуля Анкет Буквально мы создадим новый пустой каталог .jenkins служить домом для нашего будущего Дженкинса, и мы будем Заполнить это в некотором роде что это можно интерпретировать Дженкинсом как основную конфигурацию Дженкинса. Для этого, чтобы иметь возможность служить домашним каталогом для нашего нового экземпляра Дженкинса, он должен выглядеть примерно так:

|-- config.xml
|-- jenkins.install.InstallUtil.lastExecVersion
|-- org.jenkinsci.main.modules.sshd.SSHD.xml
`-- users
|   |-- pencillr_xxxxxxxxxxxxxxxxxxx
|   |   `-- config.xml
    `-- users.xml

По мере того, как мы проходим процесс, все файлы, перечисленные выше, будут подробно объяснены.

Начнем с создания домашнего каталога:

jenkins_home="/home/$USER/.jenkins"
mkdir "${jenkins_home}"

Если вы когда -либо начинали Jenkins, вы знаете, что сначала есть Процесс настройки, через который вы создаете пользователя администратора Анкет Все, что мы хотим по существу Pre-Create Анкет

Во -первых, мы должны Избегайте Дженкинс начинает этот процесс настройки. Мы достигаем этого, добавив нашу выбранную версию Jenkins в нашу недавно созданную Jenkins.install. Installtil.lastexecversion файл.

jenkins_version=2.175.1 # your Jenkins version, see: https://jenkins.io/changelog/
echo "$jenkins_version" > "${jenkins_home}"/jenkins.install.InstallUtil.lastExecVersion

Добавьте запись пользователя

Мы добавляем пользователя администратора из кода, создав файлы конфигурации Представление учетной записи пользователя администратора . Мы создаем Пользователи Дир в нашем доме Дженкинса, содержащий users.xml файл. Дженкинс из версии 2.150.1 И дальнейшее использование users.xml Файл, который содержит имя пользователя -> Картирование каталогов профилей. Мы будем следовать этой конвенции здесь.

username=pencillr # the admin username you like
mkdir "${jenkins_home}/users"
touch "${jenkins_home}/users/users.xml"
mkdir "${jenkins_home}/${username}_1234567890123456789" # notice that this is an arbitrary hash
touch "${jenkins_home}/${username}_1234567890123456789/config.xml"

Наш config.xml под "$ {jenkins_home}"/пользователи будет таким, используя наше имя пользователя по адресу @username @:



  1
  
    
      @username@
      @username@_1234567890123456789
    
  

Теперь мы перейдем к определению конфигурации пользователя под нашим "$ {jenkins_home}/users/$ {username} _1234567890123456789" каталог. Нам нужен config.xml Файл здесь, чтобы представить нашу учетную запись пользователя администратора. Это не обычная процедура регистрации пользователя, поэтому, естественно, вы должны сделать свой пароль. Мы можем сделать это, а также добавить соль пароля, чтобы сделать нашу конфигурацию более безопасной.

pass_salt=$(< /dev/urandom tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1)
pass_hash=$(echo "${jenkins_password}{${jenkins_password_salt}}" | \
    sha256sum -b | cut -f 1 -d " ")

Мы хотим, чтобы Дженкинс, доступный SSH, поэтому мы также добавляем наш общедоступный ключ в файл конфигурации, который в конце концов будет выглядеть так:



  
    
      $pass_salt:$pass_hash
    
    
      $ssh_public_key
    
  

Доступность SSH

Наш план состоит в том, чтобы внедрить конфигурацию через CLI после работы нашего экземпляра Jenkins. Для этого мы должны разрешить SSH Access к API явно. Мы делаем это, просто добавив желаемый порт SSH в "$ jenkins_home" - - jenkinsci.main.modules.sshd. Sshd.xml файл.



  $jenkins_sshd_port

Последний шаг — включить наши предпочтительные настройки безопасности в Дженкинсе. Мы делаем это в нашем основном файле конфигурации в "$ jenkins_home"/config.xml Анкет



  
    true
  
  
    true
    false
  

Теперь у нас есть наша основная настройка Jenkins. Начните Дженкинс на своем новобранном домашнем режиме как:

java -DJENKINS_HOME=$JENKINS_HOME jar jenkins.war --httpPort=$PORT"

Настройка плагинов.

Поскольку у нас есть SSH, доступный Jenkins, мы можем сделать всю конфигурацию на наших Jenkins через SSH. Чтобы увидеть, какие команды CLI вы можете использовать на своих собственных Jenkins, проверьте их, открыв браузер и посещая Localhost: $ port/cli. Вы также должны войти в систему с недавно созданными учетными данными. После этого мы готовы запустить наши команды.

Просто чтобы упомянуть, действительно есть CLI Client Для этой цели, но здесь для простоты, мы не будем использовать этот файл JAR.

Вы можете проверить, доступен ли CLI через SSH с проверкой идентификатора сеанса вашего Jenkins:

# ssh port is the one you defined in the SSHD file
ssh -p $SSH_PORT $USER@localhost session-id

Установка плагинов так же проста, как предполагает помощь CLI:

ssh -p $ ssh_port $ user@localhost install -plugin source … [-deploy] [-name val] [-restart]

Смотрите помощь CLI, это довольно просто:

 SOURCE    : If this points to a local file (?-remoting? mode only), that file
             will be installed. If this is an URL, Jenkins downloads the URL
             and installs that as a plugin. If it is the string ?=?, the file
             will be read from standard input of the command, and ?-name? must
             be specified. Otherwise the name is assumed to be the short name
             of the plugin in the existing update center (like ?findbugs?), and
             the plugin will be installed from the update center. If the short
             name includes a minimum version number (like ?findbugs:1.4?), and
             there are multiple update centers publishing different versions,
             the update centers will be searched in order for the first one
             publishing a version that is at least the specified version.
 -deploy   : Deploy plugins right away without postponing them until the reboot.
 -name VAL : If specified, the plugin will be installed as this short name
             (whereas normally the name is inferred from the source name
             automatically).
 -restart  : Restart Jenkins upon successful installation.

Применить конфигурацию через CLI

Вы можете применить конфигурацию к Дженкинсу просто через Groovy Scrips Анкет Дженкинс довольно потрясающий, когда дело доходит до доступности. Вы можете получить доступ к экземплярам Java плагинов, а также Дженкинс сам через консоли сценария. Вы можете ввести любой Groovy Script с помощью следующего метода через SSH:

ssh -p $SSH_PORT $USER@localhost groovy = < "${your_groovy_script_file}

Давайте посмотрим на пример, в котором мы установили количество повторных попыток SCM Дженкинса, внедрив простой сценарий, поэтому у нас есть более избыточная логика проверки в наших Дженкинсах.

#!/usr/bin/env groovy

import jenkins.model.Jenkins

def jenkins = Jenkins.getInstanceOrNull()
jenkins.setScmCheckoutRetryCount(5)
jenkins.save()
}

Другой пример: здесь мы удостоверимся, что плагин TimeStamper добавляет временные метки во всем мире ко всем консольным журналам консоли.

#!/usr/bin/env groovy

import hudson.plugins.timestamper.TimestamperConfig

//  Enable timestamper plugin globally
def timestamper = TimestamperConfig.get()
if (!timestamper.isAllPipelines()) {
    timestamper.setAllPipelines(true)
}

Вы можете обнаружить интерфейсы экземпляра Дженкинса и его плагины, прокручивая через Java Docs . Это не гулять в парке Я знаю.

Создать рабочие места

Все, что нам нужно сейчас, это создать нашу работу, используя наши определения JobDsl.

К сожалению, у нас сейчас нет работы, но у нас может быть начальная работа с простой трюком. Все, что вам нужно, это создать работу семян вручную, а затем сохранить его представление XML в файл. Затем в ваших сценариях вы можете внедрить этот XML -файл, который будет создан в качестве начального задания. Вы можете вызвать это также через CLI.

ssh -p $SSH_PORT $USER@localhost create-job "$SEED_JOB_NAME" "${seed_job_as_xml}"

Выгода

Действительно, это все немного нетрадиционно, но иногда нужно идти на большие расстояния, чтобы обеспечить избыточность корпоративного уровня. Создание ваших сценариев конфигурации может быть утомительной работой, но это может стоить усилий. Я также добавляю здесь, что может быть много подводных камней, прежде чем вы сможете безупречно разорвать и разорвать ваш Дженкинс.

Оригинал: «https://dev.to/pencillr/spawn-a-jenkins-from-code-gfa»