Импорт трубопровода Jenkins2.0
Pipeline as Code — это основа версии Jenkins 2.0 и ключевой инструмент, помогающий Jenkins осуществить великолепный переход от CI к CD.
Проще говоря, так называемый конвейер — это среда рабочего процесса, работающая на Jenkins, которая соединяет задачи, которые изначально выполнялись независимо на одном или нескольких узлах, для реализации сложного процесса публикации, который трудно выполнить с помощью одной задачи.
Реализация Pipeline представляет собой набор Groovy DSL (похожий на Gradle), любой процесс публикации может быть выражен в виде скрипта Groovy, а Jenkins поддерживает чтение скриптов непосредственно из базы кода, таким образом реализуя концепцию Pipeline как кода.
Примечание:Эта статья была впервые опубликована на моем официальном аккаунтеCodeSheep,Могунажиматьилисканированиепоследующийбудь остороженЗаходи подписывайся ↓ ↓ ↓
Зачем использовать Jenkins2.0 Pipeline
Вот некоторые из моих собственных болевых точек при использовании традиционных Jenkins Jobs:
-
Традиционные задания Jenkins сложно распараллелить гибко и эффективно (четыре измерения параллелизма между заданиями, между узлами, между задачами и даже внутри задач).
-
Тенденция выхода из-под контроля традиционных Jenkins Jobs застала нас врасплох: слишком много Jobs, CI-скрипты слишком дискретны, затраты на обслуживание слишком высоки, и они очень опасны, когда зависает один сервер Jenkins, все кончено.
-
Развертывание кода ветки CI для вновь извлеченной ветки слишком громоздко.
-
Традиционный дисплей Jenkins Job действительно не интуитивно понятен.
Думаю, этих причин должно быть достаточно, чтобы обратить наше внимание на Pipeline of Jenkins 2.0!
Особенности и преимущества Pipeline:
- Упорство: после запланированного и незапланированного перезапуска мастера jenkins задание конвейера все еще может работать без каких-либо последствий. На самом деле понять очень просто.Мастер jenkins и агент подключены через ssh.Если знать nohup или disown,то можно понять,почему перезапуск мастера не повлияет на дальнейшую работу задания на агенте .
- Пауза:pipeline, основанный на groovy, может реализовать приостановку задания и дождаться ввода или утверждения пользователем, а затем продолжить выполнение. 3.Более гибкое параллельное выполнение, усиленный контроль зависимостей, Шаги, параллельное выполнение между этапами и более сложные взаимозависимости могут быть достигнуты с помощью groovy-скриптов.
- Масштабируемость: более простое расширение плагинов с помощью заводного программирования.
- Конвейер разработки кода =Очень элегантный
- As Code: Централизованное управление сценариями CI, использование базы кода для управления сценариями и непосредственное чтение сценариев из базы кода, чтобы можно было быстро получить CI проекта!
Принцип и процесс конвейера
Pipeline разработал три основных концепции для пользователей:
- Stage: конвейер можно разделить на несколько этапов, и каждый этап представляет собой набор операций. Обратите внимание, что этап — это концепция логической группировки, которая может охватывать несколько узлов.
- Node: узел — это узел Jenkins, или мастер, или агент, который является конкретной средой выполнения для выполнения шага.
- Step: Шаг — это самая основная единица операции, начиная от создания каталога и заканчивая созданием образа Docker, предоставляемого различными плагинами Jenkins.
Типичный вид сцены показан ниже:
На графике очень легко увидеть, какие этапы пройдены, какие не пройдены и когда была выполнена сборка.
Конвейерная конструкция Jenkins2.0 использует скрипт Groovy.Этапы реализации управления рабочим процессом с помощью скрипта Groovy следующие:
- Перейдите к основному интерфейсу Jenkins, чтобы создать задачу Pipeline.
На самом деле, более часто используемый MultiBranch Pipeline не показан на снимке экрана выше, но в основном он похож на обычный Pipeline.
- Настройка рабочих процессов с помощью скриптов 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 процесса сборки выглядит следующим образом:
Очевидно, что отображаемый здесь код согласуется с отформатированным кодом в скрипте 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 находятся здесь:
- Мониторинг приложений Spring Boot на практике
- Приложения SpringBoot развертываются во внешнем контейнере Tomcat.
- Практика поисковой системы ElasticSearch в SpringBt
- Предварительное изучение совместного программирования Kotlin+SpringBoot
- Практика ведения журнала Spring Boot
- Элегантное кодирование SpringBoot: благословение Ломбока
Если вам интересно, вы также можете уделить время прочтению некоторых статей автора о контейнеризации и микросервисах:
- Используйте стек технологий K8S для создания личного частного облака Серийная статья
- Подробная конфигурация сервера Nginx из списка конфигураций
- Строительство центра мониторинга визуализации контейнеров Docker
- Использование ELK для создания контейнерного центра журналов приложений Docker
- Практика фреймворка RPC: Apache Thrift
- Практика фреймворка RPC: Google gRPC
- Построение микросервисного центра отслеживания цепочки вызовов
- Контейнеры Docker обмениваются данными между хостами
- Предварительное исследование кластера Docker Swarm
- Несколько рекомендаций по эффективному написанию Dockerfile