2022-08-22
1020

Структура Jenkins pipeline

Создание pipeline

Pipline — это конфигурация задачи jenkins в виде кода, написанного на языке groovy. Для возможности создания должен стоять плагин pipline.

Для создания pipeline нужно в меню нажать Создать item, ввести Имя задачи и выбрать pipeline, затем ОК.

Pipeline можно написать в jenkins, или указать путь к файлу в Git.

Чтобы писать pipeline в jenkins, в разделе Pipeline Definition должен быть выбран pipeline script и в поле script можно писать сам код, шаблон для написания можно получить выбрав Hello word в выпадающем меню в правом верхнем углу поля script.

Чтобы получить pipeline из git в выпадающем меню под Pipeline Definition нужно выбрать pipeline script from SCM, выбрать SCM - Git, в пункте Repository URL указать путь к репозиторию, в пункте Script Path указать файл, например jenkinsfiles/first_steps.jenkins. В пункте Branch Specifier указать ветку, по умолчанию в GitHub она теперь называется main, раньше называлась master.

Для подключения к публичному репозиторию git можно использовать https ссылку без пароля, но если нужно осуществить подключение по ssh или подключиться к закрытому репозиторию, то нужны учетные данные для подключения.

pipeline

Включает в себя всю работу. Декларативный синтаксис, специфичный для конвейера, который определяет "блок", содержащий все содержимое и инструкции для выполнения всего конвейера.
pipeline {
  ...
}

agent

Определяет, где будет выполнятся pipeline или его этап.

any — выполнение на любом доступном агенте
pipeline {
  agent any
  ...
}
none — при применении на верхнем уровне пайплайна глобальный агент не будет выделен для всего цикла конвейера и каждая секция этапа должна будет содержать свою собственную секцию агента
pipeline {
  agent none
  stages {
    stage('test'){
      agent any
      steps {}
    }
  }
  ...
}
node — выполнить на агенте с указанным именем
pipeline {
  agent {node {label 'agent1'}}
  ...
}
label — выполнить на агенте с меткой
pipeline {
  agent { label 'label1' }
  ...
}

//на агенте имеющем обе указанные метки
pipeline {
  agent { label 'label1 && label2' }
  ...
}

//на агенте имеющем одну или другую метку
pipeline {
  agent { label 'label1 || label2' }
  ...
}
В качестве агента может выступать docker, тогда нужно написать в таком виде. При этом docker должен быть установлен на сервере jenkins
pipeline {
    agent {
      docker {
        image 'nginx'
        label 'label1'
        args  '-v /tmp:/tmp'
      }
  }
}
возможны другие параметры
Так же можно запустить docker через Dockerfile
pipeline {
  agent {
    dockerfile {
      filename 'Dockerfile.build'
      dir 'build'
      label 'label1'
      additionalBuildArgs  '--build-arg version=1.0.2'
      args '-v /tmp:/tmp'
    }
  }
}

stages

Все этапы stage объединяются в общий блок stages
pipeline {
  agent any

  stages {
    stage('stage 1') {
      ...
    }
    stage('stage 2') {
      ...
    }
    stage('stage 3') {
      ...
    }
  }
}

stage

Определяет концептуально отдельное подмножество задач, например, этапы "Сборка", "Тестирование" и "Развертывание". Содержит в себе шаги - steps.
pipeline {
  agent any

  stages {
    stage('Сборка') {
      steps {
        ...
      }
    }
    stage('Тестирование') {
      steps {
        ...
      }
    }
    stage('Развертывание') {
      steps {
        ...
      }
    }
  }
}

steps

Steps — задача, состоящая из одного или нескольких действий. Раздел steps может быть только один в stage.
def val1 = 5
pipeline {
  agent any

  stages {
    stage('stage 1') {
      steps {
        echo '1'
        echo '2'
        echo '3'
        print val1
      }
    }
  }
}

post

Определяет один или несколько дополнительных шагов, которые выполняются по завершении выполнения конвейера или этапа (в зависимости от расположения раздела post).

    Для блока post можно указать выполнение при следующих условиях:
  • always - выполнять всегда;
  • changed - если статус выполнения отличается от предыдущего;
  • fixed - если текущий запуск прошел успешно, а предыдущий нет;
  • regression - если текущий запуск не прошел, а предыдущий был успешен;
  • aborted - если предыдущий запуск был прерван (обычно вручную);
  • failure - если текущий запуск имеет статус "Сбой";
  • success - если текущий запуск имеет статус "Успешно";
  • unstable - если текущий запуск имеет статус "Нестабильный";
  • unsuccessful - если не имеет статуса "Успешно";
  • cleanup - если все остальные условия оценены;
pipeline {
  agent any
  stages {
      stage('ls') {
          steps {
              sh 'ls'
          }
      }
  }
  post {
      always {
          echo 'finished'
      }
      success {
          echo 'succeeded!'
      }
      unstable {
          echo 'unstable'
      }
      failure {
          echo 'failed'
      }
      changed {
          echo 'different'
      }
  }
}