Как я могу проверить изменения, внесенные в Jenkinsfile локально?
При написании трубок jenkins кажется очень неудобным совершать каждое новое изменение, чтобы увидеть, работает ли оно.
Есть ли способ выполнить их локально, не передавая код?
Ответы
Ответ 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
С некоторыми ограничениями и для скриптовых конвейеров я использую это решение:
- Конвейерная работа со встроенным шпунтовым скриптом:
node('master') {
stage('Run!') {
def script = load('...you job file...')
}
}
- Jenkinsfile для тестирования имеет ту же структуру, что и для lesfurets:
def execute() {
... main job code here ...
}
execute()
Ответ 13
Хорошее резюме доступных инструментов здесь: инструменты разработки Jenkins