Если вы новичок в концепции 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 (✋) на кнопку хлопка ниже, чтобы помочь поделиться этим с другими людьми, которым также может понравиться этот пост.

Спасибо.