При написании конвейеров jenkins кажется очень неудобным фиксировать каждое новое изменение, чтобы посмотреть, работает ли оно.
Есть ли способ выполнить их локально без фиксации кода?
При написании конвейеров jenkins кажется очень неудобным фиксировать каждое новое изменение, чтобы посмотреть, работает ли оно.
Есть ли способ выполнить их локально без фиксации кода?
Вы не можете выполнить сценарий конвейера локально, поскольку его вся цель - сценарий Jenkins. (Это одна из причин, по которой лучше сделать ваш Jenkinsfile
кратким и ограниченным кодом, который на самом деле имеет дело с функциями Jenkins; ваша фактическая логика сборки должна обрабатываться с помощью внешних процессов или инструментов сборки, которые вы вызываете с помощью однострочного sh
или bat
шага. .)
Если вы хотите протестировать изменение Jenkinsfile
в реальном времени, но без фиксации его, используйте функция воспроизведения, добавленная в 1.14.
JENKINS-33925 отслеживает желаемое для автоматизированной среды тестирования.
sh
или bat
, используйте многоплатформенный язык, например python
. Теперь вы можете (возможно) поменять местами узлы Windows и Linux.
- person cowlinator; 20.06.2019
У меня есть решение, которое мне подходит. Он состоит из локального jenkins, работающего в докере, и веб-перехватчика git для запуска конвейера в локальных jenkins при каждой фиксации. Вам больше не нужно отправлять данные в репозиторий github или bitbucket для тестирования конвейера.
Это было протестировано только в среде Linux.
Сделать это довольно просто, хотя эта инструкция довольно длинная. Большинство шагов уже есть.
Вместо вашего выбора создайте файл с именем 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/
Запустите и перезапустите 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 в докере jenkins
Это очень важная часть для работы. Сначала мы запускаем контейнер докера и создаем для него оболочку bash:
$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash
Теперь вы вошли в контейнер докеров, это вы можете увидеть по чему-то вроде jenkins@e7b23bad10aa:/$
в вашем терминале. Хеш после @ обязательно будет отличаться.
Создайте ключ
jenkins@e7b23bad10aa:/$ ssh-keygen
Нажимайте клавишу ВВОД для всех вопросов, пока не получите ответ
Скопируйте ключ на свой компьютер. Если вам интересно, внутри контейнера докеров ваш компьютер 172.17.0.1.
jenkins@e7b23bad10aa:/$ ssh-copy-id [email protected]
user = ваше имя пользователя, а 172.17.0.1 - это IP-адрес вашего компьютера из контейнера докеров.
На этом этапе вам нужно будет ввести свой пароль.
Теперь давайте попробуем завершить цикл, отправив ssh-соединение на ваш компьютер из контейнера докеров.
jenkins@e7b23bad10aa:/$ ssh [email protected]
На этот раз пароль вводить не нужно. Если да, значит, что-то пошло не так, и вам нужно попробовать еще раз.
Теперь вы окажетесь в домашней папке вашего компьютера. Попробуйте ls
и посмотрите.
Не останавливайтесь на достигнутом, поскольку у нас есть цепочка оболочек ssh, от которой нам нужно избавиться.
$ exit
jenkins@e7b23bad10aa:/$ exit
Верно! Теперь мы вернулись и готовы продолжить.
Установите Jenkins
Вы найдете свой локальный Jenkins в своем браузере по адресу http://localhost:8787.
Когда вы впервые укажете в браузере локальный Jenkins, вас откроет мастер установки. По умолчанию все в порядке, однако убедитесь, что вы установили плагин конвейера во время установки.
Настройте дженкинс
очень важно, чтобы вы активировали безопасность на основе матрицы на http://localhost:8787/configureSecurity/ и предоставьте себе все права, добавив себя в матрицу и отметив все поля. (Справа есть значок с флажками)
Jenkins’ own user database
в качестве области безопасностиMatrix-based security
.User/group to add:
и нажмите кнопку [ Add ]
.Prevent Cross Site Request Forgery exploits
не установлен. (Так как этот Jenkins доступен только с вашего компьютера, это не такая уж большая проблема)[ Save ]
и выйдите из Jenkins, а затем снова, чтобы убедиться, что он работает. Если это не так, вам придется начинать все сначала и очищать папку /opt/docker/jenkins/jenkins_home
перед перезапускомДобавьте пользователя git
Нам нужно разрешить нашему git-хуку входить в наш локальный Jenkins с минимальными правами. Достаточно просто увидеть и построить рабочие места. Поэтому мы создаем пользователя с именем git
и паролем login
.
Направьте свой браузер на http://localhost:8787/securityRealm/addUser и добавьте git
в качестве имени пользователя и 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
в меню Jenkins.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, был ли запущен ваш проект hookpipeline.
Наконец, внесите произвольное изменение в свой проект, добавьте изменения и сделайте фиксацию. Теперь это запустит конвейер в вашем локальном Jenkins.
Счастливые дни!
docker build -t local_jenkins /opt/docker/jenkins/Dockerfile
на docker build -t local_jenkins /opt/docker/jenkins
, потому что Docker жаловался на невозможность подготовить контекст: контекст должен быть каталогом.
- person Etienne Neveu; 05.07.2018
$ docker inspect jenkins | grep Gateway
- person javabeangrinder; 17.01.2019
ssh [email protected]
вместо использования IP-адреса. Также убедитесь, что вы включили функцию удаленного входа в систему в системных настройках macOs - ›меню« Общая папка ».
- person pangiole; 27.11.2019
curl -v -XPOST -u git:$API_TOKEN http://localhost:8787/job/VMInit/build
после получения значения токена API из пользовательского интерфейса через страницу конфигурации вашего пользователя (правый верхний угол. См. jenkins.io/doc/book/system-administration/)
- person millebi; 19.06.2020
docker exec -u 0 -it jenkins /bin/bash
и вы root! Делай плохие дела!
- person millebi; 02.09.2020
TL; DR
Расширенная версия
Тестирование Jenkins Pipeline становится все более сложной задачей. В отличие от классического подхода к конфигурации декларативного задания, когда пользователь был ограничен тем, что предоставляет пользовательский интерфейс, новый конвейер Jenkins представляет собой полноценный язык программирования для процесса сборки, в котором вы смешиваете декларативную часть со своим собственным кодом. Как хорошие разработчики, мы хотим иметь несколько модульных тестов и для такого кода.
При разработке Jenkins Pipelines необходимо выполнить три шага. шаг 1. должен охватывать 80% случаев использования.
Примеры
Репозиторий GitHub pipelineUnit содержит несколько примеров Spock о том, как использовать Платформа тестирования Jenkins Pipeline Unit
На момент написания (конец июля 2017 г.) с Blue Ocean плагин, вы можете проверить синтаксис декларативного конвейера прямо в редакторе визуального конвейера. Редактор работает из пользовательского интерфейса Blue Ocean, когда вы нажимаете «настроить» только для проектов github (это известная проблема, и они работают над тем, чтобы она работала также и на git и т. Д.).
Но, как объясняется в этом вопросе, вы можете открыть редактор, просмотрев :
[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/
Затем щелкните в центре страницы и нажмите Ctrl+S
, это откроет текстовое поле, куда вы можете вставить декларативный сценарий конвейера. Когда вы нажимаете Обновить, если есть синтаксическая ошибка, редактор сообщит вам, где синтаксическая ошибка. Как на этом скриншоте:
Если синтаксической ошибки нет, текстовое поле закроется, и на странице отобразится ваш конвейер. Не волнуйтесь, он ничего не сохранит (если это проект на github, он зафиксирует изменение Jenkinsfile).
Я новичок в Jenkins, и это очень полезно, без этого мне приходилось много раз фиксировать Jenkinsfile, пока он не заработал (очень раздражает!). Надеюсь это поможет. Ваше здоровье.
Немного поздно для вечеринки, но именно поэтому я написал jenny
, небольшую повторную реализацию некоторых основных шагов Jenkinsfile. (https://github.com/bmustiata/jenny)
Насколько мне известно, этот Pipeline Plugin является «движком» новая механика Jenkinsfile, так что я вполне уверен, что вы можете использовать ее для локального тестирования своих скриптов.
Я не уверен, нужны ли какие-либо дополнительные шаги при копировании в Jenkinsfile, однако синтаксис и т. Д. Должен быть точно таким же.
Изменить: нашел ссылку на "движок", отметьте это описание функции, последний абзац, первая запись.
В моих настройках разработки - отсутствие подходящего редактора 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
Помимо функции воспроизведения, о которой уже упоминали другие (то же самое о ее полезности!), Я обнаружил, что следующие полезны:
Поместите свой SSH-ключ в свой профиль Jenkins, затем используйте декларативный линтер следующим образом:
ssh jenkins.hostname.here declarative-linter < Jenkinsfile
Это сделает статический анализ вашего Jenkinsfile. В редакторе по вашему выбору определите сочетание клавиш, которое запускает эту команду автоматически. В Visual Studio Code, который я использую, выберите «Задачи»> «Настроить задачи», а затем используйте следующий JSON для создания команды Проверить файл Jenkins:
{
"version": "2.0.0",
"tasks": [
{
"label": "Validate Jenkinsfile",
"type": "shell",
"command": "ssh jenkins.hostname declarative-linter < ${file}"
}
]
}
Для простоты вы можете создать Jenkinsfile в корне репозитория git, аналогично приведенному ниже примеру Jenkinsfile на основе отличного синтаксиса декларативного конвейера.
pipeline {
agent any
stages {
stage('Build the Project') {
steps {
git 'https://github.com/jaikrgupta/CarthageAPI-1.0.git'
echo pwd()
sh 'ls -alrt'
sh 'pip install -r requirements.txt'
sh 'python app.py &'
echo "Build stage gets finished here"
}
}
stage('Test') {
steps {
sh 'chmod 777 ./scripts/test-script.sh'
sh './scripts/test-script.sh'
sh 'cat ./test-reports/test_script.log'
echo "Test stage gets finished here"
}
}
}
https://github.com/jaikrgupta/CarthageAPI-1.0.git
Теперь вы можете настроить новый элемент в Jenkins как задание конвейера. Выберите
Definition
какPipeline script from SCM
иGit
для параметраSCM
. Вставьте ссылку на репозиторий проекта git в URL-адрес репозитория иJenkinsfile
в поле имени сценария. Затем щелкните параметрlightweight checkout
и сохраните проект. Поэтому всякий раз, когда вы отправляете фиксацию в репозиторий git, вы всегда можете протестировать изменения, запускающиеBuild Now
каждый раз в Jenkins.
Чтобы упростить настройку работы Jenkins Pipeline, следуйте инструкциям на приведенных ниже рисунках.
Я использую воспроизведение будущего, чтобы сделать некоторые обновления и быстро запустить.
С некоторыми ограничениями и для скриптовых конвейеров я использую это решение:
node('master') {
stage('Run!') {
def script = load('...you job file...')
}
}
def execute() {
... main job code here ...
}
execute()
Вы можете просто проверить свой конвейер, чтобы выявить проблемы с синтаксисом. У Jenkins есть хороший API для проверки Jenkisfile - https: // jenkins_url / конвейер-модель-преобразователь / проверка
Используя curl и передав свой .Jenkinsfile, вы мгновенно получите проверку синтаксиса
curl --user username:password -X POST -F "jenkinsfile=<jenkinsfile" https://jenkins_url/pipeline-model-converter/validate
Вы можете добавить этот рабочий процесс в редакторы: