Як я можу перевірити зміну, внесену в Jenkinsfile локально?


210

Коли пишуть конвеєри про джинкіни, здається, дуже незручно здійснювати кожну нову зміну, щоб побачити, чи працює вона.

Чи є спосіб виконати їх локально, не вводячи код?

Відповіді:


139

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

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

JENKINS-33925 відстежує потрібне для автоматизованого тестування.


У публікації блогу йдеться про кнопку "повторити". Будь-яка ідея куди? Я не можу знайти його.
BoltzmannBrain

8
@BoltzmannBrain, перейди на сторінку Дженкінса своєї роботи з будівництва. У лівій частині ви побачите список попередніх запусків збірки. Якщо ви наведіть курсор миші на ідентифікатор запуску збірки (наприклад, "# 123") або дату запуску збірки, з'явиться невелика стрілка вниз. При натисканні на нього виявляється контекстне меню, яке має опцію "Відтворити". Опція також доступна на сторінці запуску збірки.
Доброї ночі Nerd Pride

2
Конкурс дозволяє виконувати локальні сценарії проти цільового сервера збірки, тому ви можете перевірити, що він буде працювати і на віддаленому сервері, перш ніж вносити зміни. concourse.ci/fly-cli.html . Функція повторення Дженкінса дещо аналогічна цій, за винятком того, що вона має обмеження, і ви повинні створити збірку спочатку, щоб повторно її відтворити.
mdo123

2
Ви можете ознайомитись з цим проектом, який має на меті забезпечити те, що ви шукаєте.
Ромен

1
Погляньте на JenkinsPipelineUnit ( github.com/jenkinsci/JenkinsPipelineUnit )
користувач864279

78

У мене є рішення, яке добре працює для мене. Він складається з місцевих джинкінів, що працюють у докері, та гачкового мережевого гачка, який запускає трубопровід у місцевих дженкінах на кожній комісії. Вам більше не потрібно натискати на своє сховище github або bitbucket, щоб перевірити конвеєр.

Це було протестовано лише в середовищі Linux.

Зробити цю роботу досить просто, хоча ця інструкція довга. Більшість кроків є.

Це те, що вам потрібно

  • Докер встановлений і працює. Це не є частиною цієї інструкції.
  • Дженкінс, що працює в докер на місцевому рівні. Пояснив, як нижче.
    • Належні права (ключ доступу до ssh) для вашого місцевого користувача докера Jenkins, щоб витягнути з вашого місцевого git repo. Пояснив, як нижче.
    • Проект конвеєра Дженкінса, який виводиться з вашого локального сховища git. Пояснено нижче.
    • Користувач git у вашому місцевому Дженкінсі з мінімальними правами. Пояснено нижче.
  • Git-проект із веб-гачком після фіксації, який запускає проект конвеєра. Пояснено нижче.

Ось як ви це робите

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

Створіть на своєму виборі файл під назвою 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

Час від часу ви хочете легко запускати та перезавантажувати дженкіни. Наприклад, після перезавантаження машини. Для цього я зробив псевдонім, який я вклав .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папка існує та що у вас є права на читання та запис користувачів на неї.

Щоб запустити або перезапустити джинсини, просто введіть:

$ localjenkinsrestart

Все, що ви робите у своїх місцевих джинкінах, буде зберігатися у папці / opt / docker / jenkins / jenkins_home та зберігатися між перезавантаженнями.

Створіть ключ доступу до ssh у своїх докерних дженкінах

Це дуже важлива частина для цього. Спочатку запускаємо контейнер docker і створюємо до нього оболонку bash:

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

Тепер ви ввійшли в контейнер докера, це ви можете побачити на зразок jenkins@e7b23bad10aa:/$свого терміналу. Хеш після @ точно точно відрізнятиметься.

Створіть ключ

jenkins@e7b23bad10aa:/$ ssh-keygen

Натисніть клавішу Enter у всіх питаннях, поки не отримаєте відповідне запит

Скопіюйте ключ на свій комп’ютер. Зсередини докерного контейнера ваш комп'ютер становить 172.17.0.1, якщо вам цікаво.

jenkins@e7b23bad10aa:/$ ssh-copy-id user@172.17.0.1

user = ваше ім'я користувача та 172.17.0.1 - ip-адреса вашого комп'ютера зсередини контейнера докера.

У цей момент вам доведеться ввести пароль.

Тепер давайте спробуємо завершити цикл, відправивши його на комп'ютер із контейнера докера.

jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1

Цього разу вам не потрібно вводити пароль. Якщо у вас щось пішло не так, і вам доведеться спробувати ще раз.

Тепер ви знаходитесь в домашній папці комп’ютерів. Спробуйте lsі подивіться.

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

$ exit
jenkins@e7b23bad10aa:/$ exit

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

Встановіть свій Дженкінс

Ви знайдете свого місцевого Дженкінса у своєму браузері за адресою http: // localhost: 8787 .

Перший раз, коли ви вкажете веб-переглядач на свій місцевий Дженкінс, він буде змащений майстром установки. Значення за замовчуванням добре, але обов’язково встановіть плагін трубопроводу під час налаштування.

Налаштуйте свої джинсини

Це дуже важливо , що ви активуєте безпеку на основі матриці на HTTP: // локальний: 8787 / configureSecurity і дати собі повне право , додавши себе в матрицю і відзначте всі ящики. (У крайньому правому куті є значок галочок)

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

Додайте користувача git

Нам потрібно дозволити нашому git-гачку ввійти до місцевого Дженкінса з мінімальними правами. Достатньо лише побачити та створити робочі місця. Тому ми створюємо користувача, якого називають 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 Дженкінс додає новий проект трубопроводу. Для позначення я назвав його крючкопроводом.

  • Клацніть на New Itemв меню Дженкінса
  • Назвіть проект hookpipeline
  • Клацніть на Трубопровід
  • Клацніть [ OK ]
  • Поставте прапорець Poll SCMу розділі "Тригери". Залиште графік порожнім.
  • У розділі Трубопровід:
    • виберіть Pipeline script from SCM
    • у Repository URLполе введітьuser@172.17.0.1:projects/project/.git
    • у Script Pathполе введітьJenkinsfile
  • Збережіть проект підключення
  • Побудуйте гак-конвеєр вручну один раз, це потрібно, щоб SCM опитування почав працювати.

Створіть гак для git

Перейдіть до /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

Перевірте в Дженкінсі, чи був запущений проект вантажної лінії.

Нарешті внесіть у свій проект деякі довільні зміни, додайте зміни та виконайте зобов'язання. Це призведе до запуску газопроводу у вашому місцевому Дженкінсі.

Щасливі дні!


Я повинен був замінити docker build -t local_jenkins /opt/docker/jenkins/Dockerfileз , docker build -t local_jenkins /opt/docker/jenkinsтому що Docker скаржився «Не в змозі підготувати контекст: контекст повинен бути каталог».
Етьєн Невеу

1
Я отримую цю помилку в Mac. Може хтось, будь ласка, допоможе мені у цьому? >> ПОМИЛКА: ssh: підключення до порту 172.17.0.1 22: З'єднання відмовлено -
Маной Шрестха

@ManojShrestha: ip 172.17.0.1 є ip за замовчуванням для машини, на якій працює докер-контейнер. Ви можете використовувати свої машини (MAC: s) ip замість цього.
javabeangrinder

@ManojShrestha: Ви також можете спробувати дізнатися шлюз ip для вашої установки так: $ docker inspect jenkins | grep Gateway
javabeangrinder

2
Якщо ваш хокер докера встановлений на macOS, і ви хочете, щоб ssh увійти в нього зсередини контейнера докера, вам слід ssh user@docker.for.mac.localhost замість використання IP-адреси. Також переконайтеся, що ви включили функцію віддаленого входу з меню Налаштування системи macOs -> Меню спільної папки
Paolo Angioletti

61

TL; DR

Довга версія
тестування трубопроводів Дженкінса все більше відчуває біль. На відміну від класичного декларативного підходу до налаштування роботи, коли користувач обмежився тим, що інтерфейс викрив новий Jenkins Pipeline, є повноцінною мовою програмування для процесу складання, де ви змішуєте декларативну частину з власним кодом. Як хороші розробники, ми також маємо провести кілька одиничних тестів для цього виду коду.

Є три кроки, які слід дотримуватися, розробляючи трубопроводи Дженкінса. Крок 1. повинен охоплювати 80% випадків використання.

  1. Робіть якомога більше в сценаріях побудови (наприклад, Maven, Gradle, Gulp тощо). Тоді у ваших сценаріях конвеєра просто викликуються завдання з побудови у потрібному порядку. Конвеєр побудови просто оркеструє та виконує завдання зі збирання, але не має жодної основної логіки, яка потребує спеціального тестування.
  2. Якщо попереднє правило неможливо застосувати повністю, перейдіть до спільних бібліотек Pipeline, де ви можете самостійно розробити та протестувати власну логіку та інтегрувати їх у конвеєр.
  3. Якщо все вищезгадане вам не вдається, ви можете спробувати одну з тих бібліотек, які вийшли нещодавно (березень-2017). Рамка для тестування конвеєра Дженкінса або трубопровідUnit (приклади). З 2018 року є також Jenkinsfile Runner , пакет для виконання конвеєрів Jenkins з інструменту командного рядка.

Приклади

PipelineUnit репо GitHub містить деякі приклади Спок про те , як використовувати тестування бази Дженкінс трубопроводу Unit


1
Чи можете ви також включити коротке порівняння цих двох бібліотек?
sorin

24

У Дженкінса є функція "Повтор", яка дозволяє швидко відтворювати завдання без оновлення джерел:

Функція повторного відтворення


1
Зауважте, що він відображається на сторінці збірки, а не на сторінці проекту чи філії.
ArtOfWarfare

17

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

Але, як пояснено в цьому питанні, ви можете відкрити редактор, переглядаючи:

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

Потім клацніть посередині сторінки і натисніть Ctrl+S, це відкриє текстову область, куди ви можете вставити декларативний сценарій конвеєра. Якщо натиснути Оновити , якщо є синтаксична помилка, редактор повідомить вам, де знаходиться синтаксична помилка. Як на цьому скріншоті:

Як швидкий тест, я неправильно набрав "кроки" замість "кроки"

Якщо немає синтаксичної помилки, текстова область закриється, і сторінка візуалізує ваш конвеєр. Не хвилюйтесь, що це нічого не врятує (якщо це проект github, він здійснить зміну Jenkinsfile).

Я новачок у Дженкінсі, і це дуже корисно, без цього мені доводилося робити багато разів Дженкінсфіл, поки це не спрацює (дуже дратує!). Сподіваюсь, це допомагає. Ура.


2
Це тому, що станом на 2017 рік, Дженкінс все ще спрямований на вирішення проблем інженерів програмного забезпечення, що вказують на клацання; клацніть;) .... Принаймні, в Atom є гідний ліній Groovy. Є лише Groovy, але це допомагає.
sorin

Редактор із підсвічуванням синтаксису також є частиною класичного інтерфейсу jenkins.
Вадимо

6

Трохи запізнився на вечірку, але тому я написав jenny, невелике повторне виконання деяких основних кроків Дженкінсфіл. ( https://github.com/bmustiata/jenny )


Без образи, але якщо ви постійно не оновлюєте свої речі, це буде досить марно, оскільки синтаксис конвеєра знаходиться в постійному потоці, як здається, на даний момент.
krad

Не береться. З того, що я бачив до цього часу, синтаксис конвеєра, він майже стандартизований для основних кроків конвеєра ( jenkins.io/doc/pipeline/steps/workflow-basic-steps ). Я використовую його вже близько 2 років, не наштовхуючись на якісь несумісні зміни назад. Плагіни Дженкінса не слід використовувати imho, а зміну API можна абстрагувати за допомогою спеціальних команд у спільних бібліотеках, де ви матимете гарантії API. Якщо ви говорите про декларативний синтаксис, це може бути правдою. Я використовую лише програмний API в своїх трубопроводах, і це те, що підтримує Дженні. Rock solid :)
bogdan.mustiata

5

Наскільки я знаю цей плагін трубопроводу є "двигуном" нової механіки Jenkinsfile, тому я цілком позитивний, що ви можете використовувати це для локальної перевірки сценаріїв.

Я не впевнений, чи потрібні якісь додаткові кроки, коли ви копіюєте його в файл Jenkinsfile, однак синтаксис тощо повинен бути точно таким же.

Редагувати: Знайдено посилання на "двигун", перевірте опис цієї функції, останній абзац, перший запис.


5

У моїх налаштуваннях розробки - відсутній належний редактор 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


4
Це саме те, що я шукав - на жаль, він працює лише для декларативних конвеєрів, а не для сценаріїв сценаріїв :(
thom_nic

2

Окрім функції Replay, про яку вже згадували інші (давно про її корисність!), Я виявив і корисне наступне:

  1. Створіть тестове завдання на трубопроводі, де ви можете ввести код трубопроводу або вказати на репо / відділення Jenkinsfile, щоб швидко щось перевірити. Для більш точного тестування використовуйте багатогалузевий трубопровід, який вказує на вашу власну вилку, де ви можете швидко вносити зміни та вносити зобов’язання, не впливаючи на prod. Такі речі, як BRANCH_NAME env, доступні лише у кількох галузях.
  2. Оскільки Jenkinsfile - код Groovy, просто попросіть його за допомогою "groovy Jenkinsfile", щоб перевірити базовий синтаксис.

Використання окремих завдань, які ви можете приховати та не заплутати своїх користувачів, - одна з найважливіших речей. Я редагую файли Дженкінса за допомогою IntelliJ. Це досить добре показує недоліки синтаксису. Однак ключова річ - кнопка відповіді. Я створюю гілку з базовим запуском зміни, яка зазвичай йде трохи не так. Потім я редагую Jenkinsfile і копіюю та вставляю його у вікно Replay, і запускаю ще раз - повторюю це, доки воно не спрацьовує, а потім виконую робочу версію.
johnfo

2

Вставте ключ SSH у свій профіль Дженкінса, а потім використовуйте декларативний вкладиш наступним чином:

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

Це зробить статичний аналіз на вашому Jenkinsfile. У вибраному редакторі визначте комбінацію клавіш, яка автоматично виконує цю команду. У коді Visual Studio, який я використовую, перейдіть до Завдання> Налаштувати завдання, а потім скористайтеся наступною JSON для створення команди Validate Jenkinsfile :

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

0

Я використовую функцію повторного відтворення, щоб зробити деяке оновлення та швидко запустити.


1
Чи можете ви надати трохи більше інформації про те, як ви робите цю роботу?
kosnik

1
Я використовую Bit-bucket в якості джерела менеджера, тоді я створив проект про Дженкінс, бажаю відкрити своє сховище автоматично, рекомендую цю посаду. Після кожного натискання мого репорта Дженкінс автоматично відтворить мій файл Дженкінса, і якщо він не вдасться, у лівому меню з’являється кнопка під назвою Перейграти, ==> ця кнопка відкриє редактор, що містить ваш файл Дженкінса, ви можете відредагувати його та повторити завдання ,
АхмедДріра

0

З деякими обмеженнями і для сценаріїв трубопроводів я використовую таке рішення:

  1. Трубопровідна робота з накресленим рифленим сценарієм:

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

  1. Jenkinsfile для тестування мають таку ж структуру, як і для лесфуретів:

def execute() {
 ... main job code here ...
}
execute()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.