Pipeline As Code With Jenkins2.0

Node.js задняя часть Groovy Jenkins

            Pipeline As Code With Jenkins2.0

Импорт трубопровода Jenkins2.0

Pipeline as Code — это основа версии Jenkins 2.0 и ключевой инструмент, помогающий Jenkins осуществить великолепный переход от CI к CD.

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

Pipeline实现复杂发布流程

Реализация Pipeline представляет собой набор Groovy DSL (похожий на Gradle), любой процесс публикации может быть выражен в виде скрипта Groovy, а Jenkins поддерживает чтение скриптов непосредственно из базы кода, таким образом реализуя концепцию Pipeline как кода.

Примечание:Эта статья была впервые опубликована на моем официальном аккаунтеCodeSheep,Могунажиматьилисканированиепоследующийбудь остороженЗаходи подписывайся ↓ ↓ ↓

CodeSheep · 程序羊


Зачем использовать Jenkins2.0 Pipeline

Вот некоторые из моих собственных болевых точек при использовании традиционных Jenkins Jobs:

  • Традиционные задания Jenkins сложно распараллелить гибко и эффективно (четыре измерения параллелизма между заданиями, между узлами, между задачами и даже внутри задач).

  • Тенденция выхода из-под контроля традиционных Jenkins Jobs застала нас врасплох: слишком много Jobs, CI-скрипты слишком дискретны, затраты на обслуживание слишком высоки, и они очень опасны, когда зависает один сервер Jenkins, все кончено.

  • Развертывание кода ветки CI для вновь извлеченной ветки слишком громоздко.

  • Традиционный дисплей Jenkins Job действительно не интуитивно понятен.

Думаю, этих причин должно быть достаточно, чтобы обратить наше внимание на Pipeline of Jenkins 2.0!

Особенности и преимущества Pipeline:

  1. Упорство: после запланированного и незапланированного перезапуска мастера jenkins задание конвейера все еще может работать без каких-либо последствий. На самом деле понять очень просто.Мастер jenkins и агент подключены через ssh.Если знать nohup или disown,то можно понять,почему перезапуск мастера не повлияет на дальнейшую работу задания на агенте .
  2. Пауза:pipeline, основанный на groovy, может реализовать приостановку задания и дождаться ввода или утверждения пользователем, а затем продолжить выполнение. 3.Более гибкое параллельное выполнение, усиленный контроль зависимостей, Шаги, параллельное выполнение между этапами и более сложные взаимозависимости могут быть достигнуты с помощью groovy-скриптов.
  3. Масштабируемость: более простое расширение плагинов с помощью заводного программирования.
  4. Конвейер разработки кода =Очень элегантный
  5. As Code: Централизованное управление сценариями CI, использование базы кода для управления сценариями и непосредственное чтение сценариев из базы кода, чтобы можно было быстро получить CI проекта!

Принцип и процесс конвейера

Pipeline разработал три основных концепции для пользователей:

  • Stage: конвейер можно разделить на несколько этапов, и каждый этап представляет собой набор операций. Обратите внимание, что этап — это концепция логической группировки, которая может охватывать несколько узлов.
  • Node: узел — это узел Jenkins, или мастер, или агент, который является конкретной средой выполнения для выполнения шага.
  • Step: Шаг — это самая основная единица операции, начиная от создания каталога и заканчивая созданием образа Docker, предоставляемого различными плагинами Jenkins.

Типичный вид сцены показан ниже:

典型的Stage View

На графике очень легко увидеть, какие этапы пройдены, какие не пройдены и когда была выполнена сборка.

Конвейерная конструкция Jenkins2.0 использует скрипт Groovy.Этапы реализации управления рабочим процессом с помощью скрипта Groovy следующие:

  • Перейдите к основному интерфейсу Jenkins, чтобы создать задачу Pipeline.

建立PipeLine任务

На самом деле, более часто используемый MultiBranch Pipeline не показан на снимке экрана выше, но в основном он похож на обычный Pipeline.

  • Настройка рабочих процессов с помощью скриптов Groovy

使用Groovy自定义工作流

Пример сценария на приведенном выше рисунке выглядит следующим образом:

node { 
    stage('Checkout Code') { // for display purposes 
        // Get some code from a GitHub repository 
        git 'https://github.com/jglick/simple-maven-project-with-tests.git' 
    }
 
    stage('Build') { 
        // Run the maven build 
        if (isUnix()) { 
            sh "'${MAVEN_HOME}/bin/mvn' -Dmaven.test.failure.ignore clean package" 
        } else { 
            bat(/"${MAVEN_HOME}\bin\mvn" -Dmaven.test.failure.ignore clean package/) 
        } 
    } 
 
    stage('Unit test') { 
        junit '**/target/surefire-reports/TEST-UT.xml' 
        archive 'target/*.jar' 
    } 
} 
  • Начать выполнение конвейера

Этап View процесса сборки выглядит следующим образом:

stage View

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

В общем, все так элегантно!


Синтаксис и примеры DSL ключа конвейера Jenkins2.0

Вот краткое изложение основного синтаксиса DSL в Pipeline, который можно комбинировать с Groovy для завершения любого сложного процесса CI/CD, и с ними полезно ознакомиться.

  • archiveArtifacts

Архивные файлы, например:

archiveArtifacts 'target/*.jar'
  • bat

Запустите пакетный файл под платформой Windows, например

bat "call example.bat"
  • build

Триггер для создания задания Дженкинса, например

build 'TEST_JOB'
  • checkout

Оформить репо из системы SCM, например:

checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[credentialsId: '30e6c1e5-1035-4bdd-8a44-05ba8f885158', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://xxxxxx']], workspaceUpdater: [$class: 'UpdateUpdater']]) 
  • deleteDir()

Удалить текущий каталог из рабочей области

  • dir

переключать каталоги, например

dir('/home/jenkins') { // 切换到/home/jenkins目录中做一些事情
    // some block
}
  • echo

печатать информацию, такую ​​как echo 'hello world'

  • emailtext

Используя Jenkins для отправки электронных писем, можно настроить содержимое и тему, например

emailext body: 'Subject_test', subject: 'Subject_test', to: 'hansonwang99@163.com.cn'
// 邮件的正文body,主题subject,收件人to等可以进行自定义
  • error

Выдает сигнал ошибки, который может быть выдан в коде сам по себе, например ошибка 'read_error'

  • fileExists

Проверьте, существует ли файл по определенному пути в рабочей области, например:

fileExists '/home/test.txt'  // 检查是否存在test.txt
  • input

Дождитесь интерактивного ввода внешнего пользователя, например:

input message: '', parameters: [string(defaultValue: '默认值', description: '版本号', name: 'version')] // 在某一步骤,等待用户输入version参数才能往下执行
  • isUnix

Используется для определения того, выполняется ли текущая задача на Unix-подобном узле, например:

def flag = isUnix()
if( flag == false ) { // 可以据此进行判断
	echo "not run on a unix node !"
}
  • load

Вызовите внешний скрипт groovy, например:

load 'D:\\jenkins\\workspace\\test.groovy'
  • node

Назначьте узел задаче для запуска, например:

node('节点标签') { // 在对应标签的节点上运行某项任务
	Task()
}
  • parallel

Можно сказать, что параллельное выполнение задач является наиболее практичным и эффективным инструментом, например:

parallel(   //并行地执行android unit tests和android e2e tests两个任务
	'android unit tests': {
		runCmdOnDockerImage(androidImageName, 'bash /app/ContainerShip/scripts/run-android-docker-unit-tests.sh', '--privileged --rm')
	},
	'android e2e tests': {
	runCmdOnDockerImage(androidImageName, 'bash /app/ContainerShip/scripts/run-ci-e2e-tests.sh --android --js', '--rm')
	}
)
  • properties:

Задайте свойства задания, например:

properties([parameters([string(defaultValue: '1.0.0', description: '版本号', name: 'VERSION')]), pipelineTriggers([])]) // 为job设置了一个VERSION参数
  • pwdпоказать текущий каталог

  • readFile

Считайте файл из рабочей области, например:

def editionName = readFile '/home/Test/exam.txt'
  • retry

Повторите код в теле N раз, например:

retry(10) {
    // some block
}
  • sh

Выполнение сценариев оболочки, таких как: sh "sh test.sh"

  • sleep

Задержка, например задержка 2 часа: время сна: 2, единица измерения: «ЧАСЫ»

  • stage

Создайте этап задачи, например:

stage('stage name') {
    // some block
}
  • stash

Сохраните файлы для последующих сборок, например:

dir('target') {
	stash name: 'war', includes: 'x.war'
}
  • unstash

Восстановите файлы, хранящиеся на шаге stash, в текущей рабочей области, например:

def deploy(id) {
    unstash 'war'
    sh "cp x.war /tmp/${id}.war"
}
  • timeout

срок, например

timeout(time: 4, unit: 'SECONDS') {
    // some block
}
  • timestamps

Используется для добавления временных меток в консоль, например:

timestamps {
    // some block
}
  • touch

Создайте файл, например:

touch file: 'TEST.txt', timestamp: 0
  • unzip

Разархивируйте файл, например:

unzip dir: '/home/workspace', glob: '', zipFile: 'TEST.zip'
  • validateDeclarativePipeline

Проверяет, содержит ли данный файл действительный декларативный конвейер, возвращая T или F

validateDeclarativePipeline '/home/wospace'
  • waitUntil

дождаться выполнения условия

waitUntil {
    // some block
}
  • withCredentials

использовать учетные данные

withCredentials([usernameColonPassword(credentialsId: 'mylogin', variable: 'USERPASS')]) {
    sh '''
      set +x
      curl -u $USERPASS https://private.server/ > output
    '''
}
  • withEnv

Установите переменные среды, обратите внимание, что эта операция действует недавно!

withEnv(['MYTOOL_HOME=/usr/local/mytool']) {
    sh '$MYTOOL_HOME/bin/start'
}
  • writeFile

записать файл по пути

writeFile file: '/home/workspace', text: 'hello world'
  • writeJSON

Напишите файлы JSON, использование в основном такое же, как указано выше.

  • zip

Создать zip-файл

zip dir: '/home/workspace', glob: '', zipFile: 'TEST.zip'
  • ws

Настройте рабочую область и поработайте в ней, эффект аналогичен команде Dir, например:

ws('/home/jenkins_workspace') {
    // some block
}

постскриптум

Дополнительные статьи автора о SpringBt находятся здесь:


Если вам интересно, вы также можете уделить время прочтению некоторых статей автора о контейнеризации и микросервисах:


CodeSheep · 程序羊