При написании трубок jenkins кажется очень неудобным совершать каждое новое изменение, чтобы увидеть, работает ли оно.
Есть ли способ выполнить их локально, не передавая код?
При написании трубок jenkins кажется очень неудобным совершать каждое новое изменение, чтобы увидеть, работает ли оно.
Есть ли способ выполнить их локально, не передавая код?
Вы не можете выполнить Pipeline script локально, поскольку все его назначение - script Дженкинс. (Это одна из причин, по которой лучше всего держать ваш Jenkinsfile
коротким и ограниченным кодом, который действительно имеет дело с функциями Jenkins; ваша фактическая логика построения должна обрабатываться внешними процессами или инструментами построения, которые вы вызываете через однострочный sh
или bat
.)
Если вы хотите протестировать изменение на Jenkinsfile
вживую, но не совершая его, используйте функцию Replay добавлено в 1.14
JENKINS-33925 отслеживает желаемую автоматическую тестовую структуру.
TL; DR
Структура тестирования модулей трубопроводов Jenkins
Длинная версия
Испытание трубопровода Дженкинса становится все более и более больным. В отличие от классического декларативного подхода к настройке работы, когда пользователь ограничивался тем, что пользовательский интерфейс открывал новый Jenkins Pipeline, является полноценным языком программирования для процесса сборки, в котором вы смешиваете декларативную часть с вашим собственным кодом. Как хорошие разработчики, мы хотим иметь некоторые модульные тесты для этого типа кода.
При разработке Jenkins Pipelines необходимо выполнить три шага. шаг 1. должен охватывать 80% случаев использования.
Примеры
pipelineUnit В репозитории GitHub содержится несколько примеров Спока о том, как использовать Основы тестирования модулей трубопроводов Jenkins
У меня есть решение, которое хорошо работает для меня. Он состоит из локального jenkins, работающего в докере, и git-веб-хука для запуска конвейера в локальном jenkins при каждом коммите. Вам больше не нужно нажимать на свой github или репозиторий bitbucket, чтобы протестировать конвейер.
Это было проверено только в среде Linux.
Это довольно просто сделать эту работу, хотя эта инструкция немного. Большинство шагов там.
Создайте файл с именем 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
Перейдите в папку /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.
Счастливые дни!
На момент написания (конец июля 2017 года) с помощью плагина Blue Ocean вы можете проверить синтаксис декларативного конвейера непосредственно в визуальном редакторе конвейера. Редактор работает из пользовательского интерфейса Blue Ocean, когда вы нажимаете "настроить" только для проектов github (это известная проблема, и они работают над тем, чтобы она работала также на git и т.д.).
Но, как объясняется в этом вопросе, вы можете открыть редактор, перейдя по ссылке:
[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/
Затем нажмите в середине страницы и нажмите Ctrl+S
, это откроет текстовую область, куда вы можете вставить декларативный скрипт конвейера. Если вы нажмете "Обновить", если возникнет синтаксическая ошибка, редактор сообщит вам, где находится синтаксическая ошибка. Как на этом скриншоте:
Если нет синтаксической ошибки, текстовое поле закроется, и страница отобразит ваш конвейер. Не волнуйтесь, это ничего не спасет (если это github-проект, он внесет изменение в Jenkinsfile).
Я новичок в Дженкинс, и это очень полезно, без этого мне приходилось много раз фиксировать Jenkinsfile, пока он не заработал (очень раздражает!). Надеюсь это поможет. Приветствия.
В Jenkins есть функция "Воспроизведение", которая позволяет быстро воспроизвести задание без обновления источников:
Насколько я знаю, этот Pipeline Plugin является "двигателем" новой механики Jenkinsfile, поэтому я вполне уверен, что вы можете использовать это для локально протестируйте свои скрипты.
Я не уверен, что при копировании в файл Jenkins необходимо выполнить какие-либо дополнительные шаги, однако синтаксис и т.д. должен быть точно таким же.
Изменить: Нашел ссылку на "движок", отметьте это описание функции, последний абзац, первая запись.
В моей настройке разработки - отсутствует правильный редактор 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
Немного опоздал на вечеринку, но именно поэтому я написал jenny
, небольшую повторную реализацию некоторых основных шагов Jenkinsfile. (https://github.com/bmustiata/jenny)
Помимо функции повтора, которую уже упоминали другие (не говоря уже о ее полезности!), я нашел следующее полезное:
Поместите свой 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}"
}
]
}
Я использую будущее воспроизведения, чтобы сделать некоторые обновления и запустить быстро.
С некоторыми ограничениями и для скриптовых конвейеров я использую это решение:
node('master') {
stage('Run!') {
def script = load('...you job file...')
}
}
def execute() {
... main job code here ...
}
execute()
Хорошее резюме доступных инструментов здесь: инструменты разработки Jenkins