Если вы новичок в концепции CI/CD или знакомы, но не знаете, как интегрироваться с помощью NodeJS, этот пост для вас. Я работал над приложением, в котором мне нужно было подключиться к Jenkins, запустить задание и вернуть журнал сборки во внешний интерфейс с помощью NodeJS. Я изо всех сил пытался найти решение своей проблемы, поэтому я решил написать этот пост. Давайте начнем.
Прежде всего, я создам тестовое задание в Jenkins, скажем, «node_test_job».
Если вы видите первое задание в списке, оно создается в папке Передача файлов. Путь к заданию: «http://localhost:8080/job/FileTransfers/job/node_test_job» . Это важно отметить, так как я буду использовать этот путь для запуска сборки. Это фристайл проект, который я буду интегрировать с NodeJS API. Для этого установим пакет NPM Jenkins от Silas.
Создайте файл, например JenkinsJob.js, и импортируйте пакет NPM.
const Jenkins = require('jenkins')
Затем инициализируйте новый клиент Jenkins со следующими параметрами:
- crushIssuer (Boolean, по умолчанию: false): включить поддержку защиты CSRF.
- baseUrl (строка): URL-адрес Дженкинса
- formData (функция, необязательная): включить поддержку загрузки файлов в параметризованных сборках (должно передаваться в
require('form-data')
в качестве значения для этой опции) - заголовки (объект, необязательный): заголовки, включенные в каждый запрос
- promisify (Boolean|Function, необязательный): преобразовать методы обратного вызова в обещания
- и многое другое через папи
let jenkins = Jenkins({ baseUrl: 'http://user:pass@localhost:8080', crumbIssuer: true });
Примечание: — crushIssuer — это плагин, встроенный в ядро Jenkins. Он предоставляет расширенные параметры конфигурации и рекомендуется для защиты экземпляра от CSRF-атак. {crumbIssuer: true} включить поддержку защиты от CSRF.
Как проверить токен крохи?
Чтобы ваш API работал, проверьте, включена ли крошка, перейдя по URL-адресу http://user:pass@localhost:8080/crumbIssuer/api/json
Это должно получить тебе такой ответ- {"_class":"hudson.security.csrf.DefaultCrumbIssuer","crumb":"66ea7501ba4fe54adbbbdef6552a7","crumbRequestField":"Jenkins-Crumb"}
Вы также можете включить эту функцию в Jenkins-
GOTO: Jenkins > Manage Jenkins > Configure Global Security
и включить Prevent Cross Site Request Forgery exploits
.
Выберите Default Crumb Issuer
из Crumb Algorithm
и сохраните, чтобы применить изменения и включить.
Дополнительную информацию см. на странице CSRF Protection Wiki. .
После успешного подключения вы можете получить информацию о своем сервере с помощью следующего фрагмента кода:
jenkins.info(function(err, data) { if (err) throw err; console.log('info', data); });
Теперь, когда я могу подключить Jenkins и получить информацию о сервере, я попытаюсь собрать «node_test_job», который мы создали ранее. Продолжим редактировать
JenkinsJob.js-
const Jenkins = require('jenkins'); let jenkins = Jenkins({ baseUrl: 'http://user:pass@localhost:8080', crumbIssuer: true }); jenkins.job.build(jenkins.job['jenkins']['_opts']['headers']['referer']+"job/FileTransfers/job/node_test_job", function(err,data){ if (err) throw err; console.log('queue item number', data) });
jenkins.job['jenkins'['_opts'['headers'['referer']+"job/FileTransfers/job/node_test_jobэквивалентно"http: //localhost:8080/job/FileTransfers/job/node_test_job»путь.
Приведенный выше код начнет создание задания. Стоит отметить, что этот метод также предоставляет возможность построения с параметрами.
Теперь, когда задание перемещено в очередь на сборку, давайте получим результат сборки по завершении. Для этого пакет npm поставляется с методом logStream, который выводит журнал сборки для нескольких случаев события.
const Jenkins = require('jenkins'); let buildNum; let jenkins = Jenkins({ baseUrl: 'http://user:pass@localhost:8080', crumbIssuer: true }); jenkins.job.build("node_test_job", function(err, data){ if (err) throw err; if(data){ jenkins.job.get("node_test_job", function(err, data){ if (err) throw err; buildNum = data['nextBuildNumber']; let log = jenkins.build.logStream("node_test_job",buildNum) log.on('data',function(text){ console.log(text) }) log.on('error',function(err){ console.error(err) }) log.on('end',function(){ console.log('end') }) }) } });
В приведенном выше коде я объявил переменную buildNum, которая должна получить номер последней сборки, запускаемой jenkins.job.build(). Поэтому не нужно беспокоиться о вводе номера сборки вручную.
Приведенный выше код сгенерирует следующий вывод в командной строке:
Started by user Sourav Paul Running as SYSTEM Building in workspace /var/lib/jenkins/workspace/FileTransfers/node_test_job Finished: SUCCESS
Это просто, но мне потребовалось время, чтобы устранить неполадки с подключением API к Jenkins, поскольку я столкнулся с проблемами crushIssuer и запрещенными соединениями. Если вы столкнулись с тем же, вы можете обратиться к ссылке GitHub.
Я надеюсь, что это помогло вам разобраться с интеграцией Jenkins с NodeJS API (и обработкой ошибок). Хотелось бы услышать, есть ли у вас другой подход к проблеме или способ улучшить это решение.
Если этот пост помог вам, нажмите +5 (✋) на кнопку хлопка ниже, чтобы помочь поделиться этим с другими людьми, которым также может понравиться этот пост.
Спасибо.