Определить конвейер Jenkins во внешнем файле

У нас есть несколько конвейерных заданий с одинаковой структурой и поведением: обновить доступный репозиторий, выполнить плейбук с некоторыми параметрами, значение которых зависит от среды, и протестировать с проверкой выполнения. Мы попытались абстрагировать общее поведение во внешнем файле.

ДженкинсфилеАнсибл:

#!/usr/bin/env groovy
import groovy.json.JsonOutput

node {
}

def executePlaybook(environment){
  pipeline{

    agent any

    stages{
      stage('Update repository'){
        ...
      }
      stage('Esecute playbook'){
        ...
      }
      stage('Execute tests'){
        ...
      }
    }
  }
}
return this

Каждая среда будет иметь определенный Jenkinsfile, который задает параметры и загружает общий Jenkinsfile для выполнения конвейера.

ДженкинсфайлДев:

#!/usr/bin/env groovy
import groovy.json.JsonOutput

node{
    checkout scm
    def ansible = load "../JenkinsfileAnsible"
    ansible.execute_playbook("development")
}

Код был упрощен, и у нас нет проблем с загрузкой внешнего файла или выполнением определенных функций. Проблема в том, что мы хотели определить конвейер внутри общего файла, который одинаков для каждой среды, и просто вызвать его, но мы не можем заставить его работать.

Мы столкнулись с ошибками, поскольку Jenkins не может распознать определение конвейера во внешнем файле.

Любой совет? Неужели нельзя сделать? Есть ли что-то, что нам не хватает?


person Yair Segura Albarracin    schedule 10.08.2018    source источник


Ответы (1)


Вы можете использовать общие библиотеки конвейера Jenkins из https://jenkins.io/doc/book/pipeline/shared-libraries/

Подход состоял бы в том, чтобы иметь файл Jenkins, подобный этому:

@Library('your-pipeline') _
thePipeline([param1: val1])

А в коде Pipeline Library что-то вроде:

def call(Map<String, String> pipelineConfig) {

    pipeline{

        agent any

        stages{
           stage('Update repository'){
           //You can use your pipelineConfig param1 etc.
        }
        stage('Esecute playbook'){
           ...
        }
        stage('Execute tests'){
           ...
        }
    }
}

Вы можете использовать параметры конфигурации для разных сред или даже создавать разные конвейеры для разных сред.

Надеюсь, поможет.

person dcalap    schedule 10.08.2018