Подтвердить что ты не робот

Как я могу проверить изменения, внесенные в Jenkinsfile локально?

При написании трубок jenkins кажется очень неудобным совершать каждое новое изменение, чтобы увидеть, работает ли оно.

Есть ли способ выполнить их локально, не передавая код?

4b9b3361

Ответ 1

Вы не можете выполнить Pipeline script локально, поскольку все его назначение - script Дженкинс. (Это одна из причин, по которой лучше всего держать ваш Jenkinsfile коротким и ограниченным кодом, который действительно имеет дело с функциями Jenkins; ваша фактическая логика построения должна обрабатываться внешними процессами или инструментами построения, которые вы вызываете через однострочный sh или bat.)

Если вы хотите протестировать изменение на Jenkinsfile вживую, но не совершая его, используйте функцию Replay добавлено в 1.14

JENKINS-33925 отслеживает желаемую автоматическую тестовую структуру.

Ответ 2

TL; DR
Структура тестирования модулей трубопроводов Jenkins

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

При разработке Jenkins Pipelines необходимо выполнить три шага. шаг 1. должен охватывать 80% случаев использования.

  • Сделайте как можно больше скриптов сборки (например, Maven, Gradle, Gulp и т.д.). Тогда в сценариях вашего конвейера просто вызовытся задачи сборки в правильном порядке. Протокол сборки просто организует и выполняет задачи сборки, но не имеет какой-либо важной логики, которая требует специального тестирования.
  • Если предыдущее правило не может быть полностью применено, перейдите к Общие библиотеки трубопроводов, где вы можете самостоятельно разработать и протестировать собственную логику и интегрировать их в конвейер.
  • Если все вышеперечисленное вам не поможет, вы можете попробовать одну из тех библиотек, которые появились недавно (март-2017). Рамка тестирования Jenkins Pipeline Unit или pipelineUnit (примеры)

Примеры

pipelineUnit В репозитории GitHub содержится несколько примеров Спока о том, как использовать Основы тестирования модулей трубопроводов Jenkins

Ответ 3

У меня есть решение, которое хорошо работает для меня. Он состоит из локального jenkins, работающего в докере, и git-веб-хука для запуска конвейера в локальном jenkins при каждом коммите. Вам больше не нужно нажимать на свой github или репозиторий bitbucket, чтобы протестировать конвейер.

Это было проверено только в среде Linux.

Это довольно просто сделать эту работу, хотя эта инструкция немного. Большинство шагов там.

Это то, что вам нужно

  • Докер установлен и работает. Это не является частью этой инструкции.
  • Дженкинс работает в докере локально. Объяснил как ниже.
    • Правильные права доступа (ssh-ключ) для вашего локального пользователя докера Jenkins для извлечения из вашего локального репозитория git. Объяснил как ниже.
    • Проект конвейера Jenkins, который извлекается из вашего локального репозитория git. Объясняется ниже.
    • Пользователь git в вашем местном Jenkins с минимальными правами. Объясняется ниже.
  • Git-проект с веб-хуком пост-фиксации, который запускает конвейерный проект. Объясняется ниже.

Вот как ты это делаешь

Дженкинс Докер

Создайте файл с именем Dockerfile вместо того, который вы выбрали. Я /opt/docker/jenkins/Dockerfile его в /opt/docker/jenkins/Dockerfile заполняю его так:

FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins

Создайте образ local_jenkins

Это вам нужно будет сделать только один раз или после добавления чего-либо в Dockerfile.

$ docker build -t local_jenkins /opt/docker/jenkins/Dockerfile

Запустите и перезапустите local_jenkins

Время от времени вы хотите легко запустить и перезапустить jenkins. Например, после перезагрузки вашей машины. Для этого я сделал псевдоним, который я поместил в .bash_aliases в моей домашней папке.

$ echo "alias localjenkinsrestart='docker stop jenkins;docker rm jenkins;docker run --name jenkins -i -d -p 8787:8080 -p 50000:50000 -v /opt/docker/jenkins/jenkins_home:/var/jenkins_home:rw local_jenkins'" >> ~/.bash_aliases
$ source .bash_aliases  # To make it work

Убедитесь, что папка /opt/docker/jenkins/jenkins_home существует и что у вас есть права на чтение и запись для нее.

Чтобы запустить или перезапустить свой Jenkins, просто наберите:

$ localjenkinsrestart

Все, что вы делаете в своем локальном jenkins, будет храниться в папке /opt/docker/jenkins/jenkins_home и сохраняться между перезапусками.

Создайте ssh ключ доступа в вашем докере

Это очень важная часть, чтобы это работало. Сначала мы запускаем Docker-контейнер и создаем для него оболочку bash:

$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash

Теперь вы вошли в докер-контейнер, это вы можете увидеть чем-то вроде [email protected]:/$ в вашем терминале. Хеш после @наверняка будет отличаться.

Создать ключ

[email protected]:/$ ssh-keygen

Нажмите ввод по всем вопросам, пока не получите ответ

Скопируйте ключ на свой компьютер. Если вам интересно, из контейнера Docker ваш компьютер - 172.17.0.1.

[email protected]:/$ ssh-copy-id [email protected]

user = ваше имя пользователя, а 172.17.0.1 - это IP-адрес вашего компьютера из контейнера Docker.

Вы должны будете ввести свой пароль на этом этапе.

Теперь давайте попробуем завершить цикл, выполнив команду ssh на вашем компьютере из контейнера Docker.

[email protected]:/$ ssh [email protected]

На этот раз вам не нужно вводить пароль. Если вы это сделаете, что-то пошло не так, и вы должны попробовать еще раз.

Теперь вы будете в домашней папке вашего компьютера. Попробуйте ls и посмотрите.

Не останавливайтесь здесь, потому что у нас есть цепочка ssh-оболочек, из которых мы должны выйти.

$ exit
[email protected]:/$ exit

Правильно! Теперь мы вернулись и готовы продолжить.

Установите свой Дженкинс

Вы найдете свой локальный Jenkins в вашем браузере по адресу http://localhost: 8787.

Когда вы в первый раз указываете свой браузер на свой локальный Jenkins, вы будете отмечены мастером установки. По умолчанию все в порядке, не забудьте установить плагин конвейера во время установки.

Настройте свои Дженкинс

Очень важно, чтобы вы активировали матричную защиту на http://localhost: 8787/configureSecurity и дали себе все права, добавив себя в матрицу и отметив все флажки. (В крайнем правом углу есть значок галочки)

  • Выберите Jenkins own user database качестве области безопасности
  • Выберите Matrix-based security на Matrix-based security в разделе Авторизация
  • Введите свое имя пользователя в поле User/group to add: и нажмите на кнопку [ Add ]
  • В таблице выше ваше имя пользователя должно появиться рядом со значком людей. Если он пересекается, вы ввели неверное имя пользователя.
  • Перейдите в крайний правый угол таблицы и нажмите кнопку с галочкой или вручную отметьте все поля в вашем ряду.
  • Убедитесь, что флажок " Prevent Cross Site Request Forgery exploits снят. (Так как этот Дженкинс доступен только с вашего компьютера, это не такая уж большая проблема)
  • Нажмите [ Save ] и выйдите из Jenkins и войдите снова, чтобы убедиться, что это работает. Если это не так, вам нужно начать сначала и /opt/docker/jenkins/jenkins_home папку /opt/docker/jenkins/jenkins_home перед перезапуском

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

Нам нужно разрешить нашему git hook подключиться к нашему локальному Jenkins с минимальными правами. Достаточно просто посмотреть и построить рабочие места. Поэтому мы создаем пользователя с именем git и паролем login.

Перейдите в браузере по адресу http://localhost: 8787/securityRealm/addUser и добавьте git качестве имени пользователя и login в login как пароль. Нажмите [ Create User ].

Добавьте права пользователю git

Перейдите на страницу http://localhost: 8787/configureSecurity в вашем браузере. Добавьте пользователя git в матрицу:

  • Напишите git в поле User/group to add: и нажмите [ Add ]

Теперь пришло время установить флажки для минимальных прав пользователя git. Только это необходимо:

  • в целом: прочитать
  • работа: сборка
  • Работа: открыть
  • работа: чтение

Убедитесь, что флажок " Prevent Cross Site Request Forgery exploits снят, и нажмите [ Save ]

Создать проект конвейера

Мы предполагаем, что у нас есть имя user и наш проект с поддержкой git с Jenkinsfile в нем называется project и находится по адресу /home/user/projects/project

В ваш http://localhost: 8787 Jenkins добавьте новый конвейерный проект. Я назвал это крючком для справки.

  • Нажмите на New Item в меню Дженкинс
  • Назовите проект hookpipeline
  • Нажмите на трубопровод
  • Нажмите [ OK ]
  • Установите флажок Poll SCM в разделе Построение триггеров. Оставьте расписание пустым.
  • В разделе Трубопровод:
    • выберите Pipeline script from SCM
    • в поле Repository URL введите [email protected]:projects/project/.git
    • в поле " Script Path введите Jenkinsfile
  • Сохранить проект Hookpipeline
  • Создайте соединительную линию вручную один раз, это необходимо для работы SCM опроса.

Создайте git hook

Перейдите в папку /home/user/projects/project/.git/hooks и создайте файл с именем post-commit который содержит это:

#!/bin/sh
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD)
MASTERBRANCH='master'

curl -XPOST -u git:login http://localhost:8787/job/hookpipeline/build
echo "Build triggered successfully on branch: $BRANCHNAME"

Сделайте этот файл исполняемым:

$ chmod +x /home/user/projects/project/.git/hooks/post-commit

Проверьте хук после фиксации:

$ /home/user/projects/project/.git/hooks/post-commit

Проверьте в Дженкинсе, был ли запущен ваш проект ловушки.

Наконец, внесите некоторые произвольные изменения в ваш проект, добавьте изменения и сделайте коммит. Это теперь вызовет конвейер в вашем местном Jenkins.

Счастливые дни!

Ответ 4

На момент написания (конец июля 2017 года) с помощью плагина Blue Ocean вы можете проверить синтаксис декларативного конвейера непосредственно в визуальном редакторе конвейера. Редактор работает из пользовательского интерфейса Blue Ocean, когда вы нажимаете "настроить" только для проектов github (это известная проблема, и они работают над тем, чтобы она работала также на git и т.д.).

Но, как объясняется в этом вопросе, вы можете открыть редактор, перейдя по ссылке:

[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/

Затем нажмите в середине страницы и нажмите Ctrl+S, это откроет текстовую область, куда вы можете вставить декларативный скрипт конвейера. Если вы нажмете "Обновить", если возникнет синтаксическая ошибка, редактор сообщит вам, где находится синтаксическая ошибка. Как на этом скриншоте:

As a quick test I wrongly typed "stepps" instead of "steps"

Если нет синтаксической ошибки, текстовое поле закроется, и страница отобразит ваш конвейер. Не волнуйтесь, это ничего не спасет (если это github-проект, он внесет изменение в Jenkinsfile).

Я новичок в Дженкинс, и это очень полезно, без этого мне приходилось много раз фиксировать Jenkinsfile, пока он не заработал (очень раздражает!). Надеюсь это поможет. Приветствия.

Ответ 5

В Jenkins есть функция "Воспроизведение", которая позволяет быстро воспроизвести задание без обновления источников:

Replay feature

Ответ 6

Насколько я знаю, этот Pipeline Plugin является "двигателем" новой механики Jenkinsfile, поэтому я вполне уверен, что вы можете использовать это для локально протестируйте свои скрипты.

Я не уверен, что при копировании в файл Jenkins необходимо выполнить какие-либо дополнительные шаги, однако синтаксис и т.д. должен быть точно таким же.

Изменить: Нашел ссылку на "движок", отметьте это описание функции, последний абзац, первая запись.

Ответ 7

В моей настройке разработки - отсутствует правильный редактор Groovy - большое количество проблем Jenkinsfile возникает из простых синтаксических ошибок. Чтобы решить эту проблему, вы можете проверить файл Jenkins для своего экземпляра Jenkins (работает в $JENKINS_HTTP_URL):

curl -X POST -H $(curl '$JENKINS_HTTP_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') -F "jenkinsfile=<Jenkinsfile" $JENKINS_HTTP_URL/pipeline-model-converter/validate

Вышеупомянутая команда - слегка измененная версия из https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(or-linting)-a-Declarative-Jenkinsfile-from-the-command-line

Ответ 8

Немного опоздал на вечеринку, но именно поэтому я написал jenny, небольшую повторную реализацию некоторых основных шагов Jenkinsfile. (https://github.com/bmustiata/jenny)

Ответ 9

Помимо функции повтора, которую уже упоминали другие (не говоря уже о ее полезности!), я нашел следующее полезное:

  • Создайте тестовое задание Pipeline, в котором вы можете ввести код трубопровода или указать свое репо/ветку файла Jenkins, чтобы быстро проверить что-то. Для более точного тестирования используйте Multibranch Pipeline, который указывает на вашу собственную вилку, где вы можете быстро вносить изменения и совершать, не затрагивая prod. Такие вещи, как BRANCH_NAME env, доступны только в Multibranch.
  • Так как Jenkinsfile - это код Groovy, просто вызовите его с помощью groovy Jenkinsfile "для проверки базового синтаксиса.

Ответ 10

Поместите свой SSH-ключ в свой профиль Jenkins, затем используйте декларативный линтер следующим образом:

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

Это сделает статический анализ вашего Jenkinsfile. В редакторе по вашему выбору определите сочетание клавиш, которое автоматически запускает эту команду. В Visual Studio Code, который я использую, перейдите в Задачи> Настроить задачи, затем используйте следующий JSON для создания команды Validate Jenkinsfile:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Validate Jenkinsfile",
      "type": "shell",
      "command": "ssh jenkins.hostname declarative-linter < ${file}"
    }
  ]
}

Ответ 11

Я использую будущее воспроизведения, чтобы сделать некоторые обновления и запустить быстро.

Ответ 12

С некоторыми ограничениями и для скриптовых конвейеров я использую это решение:

  1. Конвейерная работа со встроенным шпунтовым скриптом:

node('master') {
    stage('Run!') {
                def script = load('...you job file...')
    }
}

  1. Jenkinsfile для тестирования имеет ту же структуру, что и для lesfurets:

def execute() {
 ... main job code here ...
}
execute()