1. Что такое сборочная линия?
В Jenkins есть два типа конвейеров: декларативный конвейер и скриптовый конвейер. Скриптовый конвейер — это скрипт конвейера, используемый старой версией Jenkins. В новой версии Jenkins рекомендуется использовать декларативный конвейер. В документации описан только конвейер объявлений.
В декларативном синтаксисе конвейера процесс конвейера определяется в Pipeline{}, а блок Pipeline определяет всю работу, выполненную во всем конвейере, например:
Описание параметра:
//Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Build'
}
}
stage('Test') {
steps {
echo 'Test'
}
}
stage('Deploy') {
steps {
echo 'Deploy'
}
}
}
}
В синтаксисе скриптового конвейера существует один или несколько блоков Node, которые выполняют основную работу на протяжении всего конвейера.
Описание параметра:
//Jenkinsfile (Scripted Pipeline)
node {
stage('Build') {
echo 'Build'
}
stage('Test') {
echo 'Test'
}
stage('Deploy') {
echo 'Deploy'
}
}
Декларативные конвейеры должны содержаться в блоке Pipeline, например в формате блока Pipeline.
pipeline {
/* insert Declarative Pipeline here */
}
Основные операторы и выражения, допустимые в декларативном конвейере, подчиняются тем же правилам, что и синтаксис Groovy, со следующими исключениями.
pipeline{}
Разделы в декларативном конвейере — это не ключевые слова или инструкции, а блоки области кода, содержащие одного или нескольких агентов, стадий, сообщений, директив и шагов.
Агент представляет собой место, где выполняются шаги и команды во всем конвейере или на определенном этапе. Эта часть должна быть определена на верхнем уровне блока конвейера и может быть определена снова на этапе, но уровень этапа не является обязательным.
Выполнение конвейера на любом доступном агенте, синтаксис конфигурации
pipeline {
agent any
}
Указывает, что сценарий конвейера не имеет глобальной конфигурации агента. Если агент верхнего уровня настроен как «Нет», каждый раздел этапа должен содержать свой собственный агент. Синтаксис конфигурации
pipeline {
agent none
stages {
stage('Stage For Build'){
agent any
}
}
}
pipeline {
agent none
stages {
stage('Stage For Build'){
agent { label 'role-master' }
steps {
echo "role-master"
}
}
}
}
Аналогично настройке метки, за исключением того, что вы можете добавить некоторые дополнительные конфигурации, такие как customWorkspace (установить рабочий каталог по умолчанию).
pipeline {
agent none
stages {
stage('Stage For Build'){
agent {
node {
label 'role-master'
customWorkspace "/tmp/zhangzhuo/data"
}
}
steps {
sh "echo role-master > 1.txt"
}
}
}
}
Конвейеры или этапы выполнения выполняются с использованием контейнеров, созданных из файлов Dockerfile, включенных в исходный код. В это время соответствующий агент записывается следующим образом:
agent {
dockerfile {
filename 'Dockerfile.build' //имя файла dockerfile
dir 'build' //Выполняем образ сборки и рабочий каталог
label 'role-master' //Выполнение узла изузла, выбор метки
additionalBuildArgs '--build-arg version=1.0.2' //Параметры сборки
}
}
Аналогично dockerfile, вы можете напрямую использовать поле docker для указания внешнего образа, что может сэкономить время создания. Например, используйте образ maven для упаковки, и вы можете одновременно указать аргументы.
agent{
docker{
image '192.168.10.15/kubernetes/alpine:latest' //Зеркальный адрес
label 'role-master' //Выполнение из узла, выбор метки
args '-v /tmp:/tmp' //Начало зеркалирования параметров
}
}
Необходимо развернуть плагины, связанные с Kubernetes, официальная документация:
https://github.com/jenkinsci/kubernetes-plugin/
workspaceVolume persistentVolumeClaimWorkspaceVolume(claimName: "jenkins-agent", mountPath: "/", readOnly: "false")
workspaceVolume nfsWorkspaceVolume(serverAddress: "192.168.10.254", serverPath: "/nfs", readOnly: "false")
workspaceVolume dynamicPVC(storageClassName: "nfs-client", requestsSize: "1Gi", accessModes: "ReadWriteMany")
workspaceVolume emptyDirWorkspaceVolume()
workspaceVolume hostPathWorkspaceVolume(hostPath: "/opt/workspace", readOnly: false)
Пример
agent {
kubernetes {
cloud 'kubernetes'
slaveConnectTimeout 1200
workspaceVolume emptyDirWorkspaceVolume()
yaml '''
kind: Pod
metadata:
name: jenkins-agent
spec:
containers:
- args: [\'$(JENKINS_SECRET)\', \'$(JENKINS_NAME)\']
image: '192.168.10.15/kubernetes/jnlp:alpine'
name: jnlp
imagePullPolicy: IfNotPresent
- command:
- "cat"
image: "192.168.10.15/kubernetes/alpine:latest"
imagePullPolicy: "IfNotPresent"
name: "date"
tty: true
restartPolicy: Never
'''
}
}
pipeline {
agent {
kubernetes {
cloud 'kubernetes'
slaveConnectTimeout 1200
workspaceVolume emptyDirWorkspaceVolume()
yaml '''
kind: Pod
metadata:
name: jenkins-agent
spec:
containers:
- args: [\'$(JENKINS_SECRET)\', \'$(JENKINS_NAME)\']
image: '192.168.10.15/kubernetes/jnlp:alpine'
name: jnlp
imagePullPolicy: IfNotPresent
- command:
- "cat"
image: "192.168.10.15/kubernetes/alpine:latest"
imagePullPolicy: "IfNotPresent"
name: "date"
tty: true
- command:
- "cat"
image: "192.168.10.15/kubernetes/kubectl:apline"
imagePullPolicy: "IfNotPresent"
name: "kubectl"
tty: true
restartPolicy: Never
'''
}
}
environment {
MY_KUBECONFIG = credentials('kubernetes-cluster')
}
stages {
stage('Data') {
steps {
container(name: 'date') {
sh """
date
"""
}
}
}
stage('echo') {
steps {
container(name: 'date') {
sh """
echo 'k8s is pod'
"""
}
}
}
stage('kubectl') {
steps {
container(name: 'kubectl') {
sh """
kubectl get pod -A --kubeconfig $MY_KUBECONFIG
"""
}
}
}
}
}
pipeline {
agent none
stages {
stage('Example Build') {
agent { docker 'maven:3-alpine' }
steps {
echo 'Hello, Maven'
sh 'mvn --version'
}
}
stage('Example Test') {
agent { docker 'openjdk:8-jre' }
steps {
echo 'Hello, JDK'
sh 'java -version'
}
}
}
}
Обычно часть сообщения размещается в нижней части конвейера. Например, в этом примере, независимо от статуса завершения этапа, будет выводиться сообщение «Я снова скажу привет!».
//Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Example1') {
steps {
echo 'Hello World1'
}
}
stage('Example2') {
steps {
echo 'Hello World2'
}
}
}
post {
always {
echo 'I will always say Hello again!'
}
}
}
Вы также можете post написано в этап, показанный ниже Примером Example1 Выполнение не удалось post。
//Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Example1') {
steps {
sh 'ip a'
}
post {
failure {
echo 'I will always say Hello again!'
}
}
}
}
}
Раздел «Шаги» представляет собой один или несколько шагов, выполняемых в данной инструкции этапа, например выполнение команды оболочки, определенной в шагах.
//Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
Или используйте поле sh для выполнения нескольких инструкций.
//Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Example') {
steps {
sh """
echo 'Hello World1'
echo 'Hello World2'
"""
}
}
}
}
Директивы могут использоваться для вынесения некоторых условных суждений или предварительной обработки некоторых данных при выполнении этапа. В соответствии с разделами директивы не являются ключевым словом или инструкцией, но включают в себя такие конфигурации, как среда, параметры, параметры, триггеры, этап, инструменты, ввод и т. д. когда.
Environment В основном используется Всуществоватьсборочная средняя линияконфигурацияиссумпеременная среды,в соответствии с Конфигурацияизрешение о местоположениипеременные сфера применения. Да определение в конвейеределатьдляглобальные переменные,ХОРОШОКонфигурациясуществовать stage серединакак следует stage переменные среды. Эта директива поддерживает специальный метод credentials()
,Этот метод доступен Всуществовать Jenkins Доступ к предопределенным учетным данным через идентификатор в среде. Для типа Secret Text изсертификат,credentials()
Это может быть Secret Текстовое содержимое присваивается переменным среды. Для учетных данных стандартной учетной записи и типа пароля указанная переменная среды равна username и пароль, а также определит две дополнительные изпеременные среды,соответственнодляMYVARNAME_USR
иMYVARNAME_PSW
。
//Пример
pipeline {
agent any
environment { //Глобальные переменные вступят в силу везде, где есть стадиясередина.
NAME= 'zhangzhuo'
}
stages {
stage('env1') {
environment { //Определение переменной существующих стадий вступит в силу только на текущем этапе, а на других стадиях не вступит в силу.
HARBOR = 'https://192.168.10.15'
}
steps {
sh "env"
}
}
stage('env2') {
steps {
sh "env"
}
}
}
}
//используется здесьk8sизkubeconfig файл Пример
pipeline {
agent any
environment {
KUBECONFIG = credentials('kubernetes-cluster')
}
stages {
stage('env') {
steps {
sh "env" //По умолчанию содержимое выходной переменной будет зашифровано
}
}
}
}
usernamme:password
//используется здесьk8sизkubeconfig файл Пример
pipeline {
agent any
environment {
HARBOR = credentials('harbor-account')
}
stages {
stage('env') {
steps {
sh "env"
}
}
}
}
Конвейер Jenkins поддерживает множество встроенных инструкций. Например, повторная попытка может повторить неудачный шаг n раз и может привести к различным результатам в соответствии с разными инструкциями. Наиболее часто используемые инструкции следующие:
pipeline {
agent any
options {
timeout(time: 1,единица измерения: 'HOURS') //Время ожидания 1 час час,Если вы не добавите unitПараметр по умолчанию для 1min
timestamps() //Каждая строка вывода будет печатать временную метку
buildDiscarder(logRotator(numToKeepStr: '3')) //Сохраняем три исторических постройки Версия
quietPeriod(10) //Обратите внимание, что запуск сборки вручную не имеет эффекта
retry(3) //сборочная линия Количество повторов после неудачи
}
stages {
stage('env1') {
steps {
sh "env"
sleep 2
}
}
stage('env2') {
steps {
sh "env"
}
}
}
}
Option Кроме написанного в Pipeline Верхний этаж в порядке в stage середина,нонаписано в stage в option Поддерживает только retry、 тайм-аут, временные метки или есть и stage Связанные декларативные параметры, такие как пропуститьDefaultCheckout. в stage уровень options Это написано следующим образом
pipeline {
agent any
stages {
stage('env1') {
options { //Определите существование здесь. Это вступит в силу на данном этапе.
timeout(time: 2, unit: 'SECONDS') // тайм-аут 2 секунды
timestamps() //Каждая строка вывода будет печатать временную метку
retry(3) //сборочная линия Количество повторов после неудачи
}
steps {
sh "env && sleep 2"
}
}
stage('env2') {
steps {
sh "env"
}
}
}
}
Параметры предоставляют список параметров, которые пользователь должен предоставить при запуске конвейера. Значения этих определяемых пользователем параметров могут быть предоставлены шагам конвейера через объект params. Может быть определен только на верхнем уровне конвейера.
В настоящее время поддерживаются следующие типы параметров:
Параметры плагина
Пример
pipeline {
agent any
parameters {
string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '1') //При выполнении сборки необходимо вручную настроить параметры строкового типа Конфигурация, а затем присвоить их переменным
text(name: 'DEPLOY_TEXT', defaultValue: 'One\nTwo\nThree\n', description: '2') //Текстовые параметры необходимо указать при выполнении сборки, а затем присвоить переменным
booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '3') //Логические параметры
choice(name: 'CHOICES', choices: ['one', 'two', 'three'], description: '4') //Выбираем параметры списка формы
password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password') //Параметры типа пароля будут зашифрованы
imageTag(name: 'DOCKER_IMAGE', description: '', image: 'kubernetes/kubectl', filter: '.*', defaultTag: '', registry: 'https://192.168.10.15', credentialId: 'harbor-account', tagOrder: 'NATURAL') //Получаем имя и тег изображения
gitParameter(branch: '', branchFilter: 'origin/(.*)', defaultValue: '', description: 'Branch for build and deploy', name: 'BRANCH', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH')
} //Получаем список ветвей склада git, на который должен ссылаться git
stages {
stage('env1') {
steps {
sh "env"
}
}
stage('git') {
steps {
git branch: "$BRANCH", credentialsId: 'gitlab-key', url: 'git@192.168.10.14:root/env.git' //использоватьgitParameter, он должен иметь это значение
}
}
}
}
существовать Pipeline Может использоваться в triggers Чтобы автоматически запускать задачи выполнения конвейера, вы можете использовать Webhook、Cron、 pollSCM и upstream Запустите конвейер другими способами.
Сборка по времени, если определенная сборка линия Изготовление занимает много времени или определенная сборочная линии необходимо регулярно выполнять сборку в течение определенного периода времени, вы можете использовать cron Настройте триггер, например, запускайте его каждые четыре часа с понедельника по пятницу.
Примечание: Ч не означает HOURS значит, но Hash Аббревиатура из. Главная для решенной множественной сборки линиясуществовать При одновременной работе в системе создается давление нагрузки.
pipeline {
agent any
triggers {
cron('H */4 * * 1-5') //Каждый четвертый час с понедельника по пятницу, когдаодин раз cron('H/12 * * * *') //Выполнять каждые 12 минут
cron('H * * * *') //Каждый 1 час выполнено, когдаодин раз }
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
Вышестоящий может решить, запускать ли конвейер, на основе результатов выполнения вышестоящего задания. Например, конвейер запускается при успешном выполнении задания 1 или задания 2.
В настоящее время поддерживаются следующие состояния: SUCCESS, UNSTABLE, FAILURE, NOT_BUILT, ABORTED и т. д.
pipeline {
agent any
triggers {
upstream(upstreamProjects: 'env', threshold: hudson.model.Result.SUCCESS) //Создаем эту сборку, когда сборка env завершится успешно линия
}
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
Настройка ввода поддерживает следующие параметры.
pipeline {
agent any
stages {
stage('Example') {
input {
message «Продолжишь?»
ok "продолжать"
submitter "alice,bob"
parameters {
string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
}
}
steps {
echo "Hello, ${PERSON}, nice to meet you."
}
}
}
}
When директива позволяетсборочная линия Решите, должно ли действие выполняться исходя из заданных условий stage,when Директива должна содержать как минимум условие. если when Содержит несколько условий, все подусловия должны быть возвращены. True,stage может быть выполнено.
When также можно комбинировать с синтаксисом not, allOf и AnyOf для достижения более гибкого сопоставления условий.
В настоящее время наиболее часто используемые встроенные условия следующие:
when { changelog '.*^\\[DEPENDENCY\\] .+$' }
Пример:при разветвлениидля main выполнено, когда Example Deploy шаг
pipeline {
agent any
stages {
stage('Example Build') {
steps {
echo 'Hello World'
}
}
stage('Example Deploy') {
when {
branch 'main' //несколько ветвейсборочная линия, ветка для будет выполнена.
}
steps {
echo 'Deploying'
}
}
}
}
Вы также можете настроить несколько условий одновременно. Например, если ветвь является производственной и значение переменной DEPLOY_TO является основным, будет выполнен пример развертывания.
pipeline {
agent any
environment {
DEPLOY_TO = "main"
}
stages {
stage('Example Deploy') {
when {
branch 'main'
environment name: 'DEPLOY_TO', value: 'main'
}
steps {
echo 'Deploying'
}
}
}
}
ХОРОШОиспользовать anyOf Просто сопоставьте одно из условий, например, ветка main или DEPLOY_TO для main или master выполнено, когда Deploy
pipeline {
agent any
stages {
stage('Example Deploy') {
when {
anyOf {
branch 'main'
environment name: 'DEPLOY_TO', value: 'main'
environment name: 'DEPLOY_TO', value: 'master'
}
}
steps {
echo 'Deploying'
}
}
}
}
ХОРОШОиспользовать expression Выполняйте регулярное сопоставление, например, когда BRANCH_NAME для main или мастер, и DEPLOY_TO для master или main Будет выполнено только тогда, когда Example Deploy
pipeline {
agent any
stages {
stage('Example Deploy') {
when {
expression { BRANCH_NAME ==~ /(main|master)/ }
anyOf {
environment name: 'DEPLOY_TO', value: 'main'
environment name: 'DEPLOY_TO', value: 'master'
}
}
steps {
echo 'Deploying'
}
}
}
}
По умолчанию, если определенный stage из agent,существовать Введите stage из agent После этого stage из when Условие будет только оцениваться, но есть варианты изменить это. Например существуют введите stage из agent Предварительная оценка when,Можетиспользовать до Агент, когда when для true Это делается только тогда, когда stage
В настоящее время предпосылками для поддержки из являются следующие:
beforeOptions имеет приоритет выше, чем beforeInput, и выше, чем beforeAgent.
Пример
pipeline {
agent none
stages {
stage('Example Build') {
steps {
echo 'Hello World'
}
}
stage('Example Deploy') {
when {
beforeAgent true
branch 'main'
}
steps {
echo 'Deploying'
}
}
}
}
существоватьдекларативныйсборочная среднюю линию можно использовать Parallel полей очень удобно реализовать параллельное построение, например ветки A、B、 C Выполнить параллельную обработку
pipeline {
agent any
stages {
stage('Non-Parallel Stage') {
steps {
echo 'This stage will be executed first.'
}
}
stage('Parallel Stage') {
failFast true //Указывает, что до тех пор, пока одна ветка не сможет собраться, она будет запущена напрямую, не дожидаясь сборки других ветвей.
parallel {
stage('Branch A') {
steps {
echo "On Branch A"
}
}
stage('Branch B') {
steps {
echo "On Branch B"
}
}
stage('Branch C') {
stages {
stage('Nested 1') {
steps {
echo "In stage Nested 1 within Branch C"
}
}
stage('Nested 2') {
steps {
echo "In stage Nested 2 within Branch C"
}
}
}
}
}
}
}
}
Как уже говорилось выше, сборочная поддерживает два синтаксиса: декларативный и скриптовый, оба из которых поддерживают создание непрерывной доставки сборочной информации. линия. И то и другое можно использовать для существования. Web UI или Jenkinsfile серединаопределениесборочная линия, но обычно Jenkinsfile Поместите его в хранилище кода середина (конечно, его можно разместить и в существующем отдельном хранилище кода середина для управления).
создаватьодин Jenkinsfile и размещение его в репозитории кода дает следующие преимущества
Jenkins Многие встроенные переменные могут существовать напрямую. Jenkinsfile серединаиспользовать,Можетпроходить JENKINS_URL/pipeline/syntax/globals#env
Получите полный список. В настоящее время чаще используются изпеременные средыследующее
Пример, если сборка линияимядляprint_env
,Сборка 2,каждыйпеременныеизценить。
BUILD_ID:2
BUILD_NUMBER:2
BUILD_TAG:jenkins-print_env-2
BUILD_URL:http://192.168.10.16:8080/job/print_env/2/
JOB_NAME:print_env
NODE_NAME:built-in
JENKINS_URL:http://192.168.10.16:8080/
WORKSPACE:/bitnami/jenkins/home/workspace/print_env
Вышеупомянутая переменная сохранит существование Map середина,Можетиспользовать env.BUILD_ID или env.JENKINS_URL Ссылка на встроенную переменную
pipeline {
agent any
stages {
stage('print env') {
parallel {
stage('BUILD_ID') {
steps {
echo "$env.BUILD_ID"
}
}
stage('BUILD_NUMBER') {
steps {
echo "$env.BUILD_NUMBER"
}
}
stage('BUILD_TAG') {
steps {
echo "$env.BUILD_TAG"
}
}
}
}
}
}
Динамические переменные назначаются динамически на основе результата определенной инструкции. Значение переменной меняется в зависимости от результата выполнения инструкции. Как показано ниже
//Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
environment {
// использовать returnStdout
CC = """${sh(
returnStdout: true,
script: 'echo -n "clang"' //Если использоватьshellЗаказеcho echo присваивает переменную, лучше всего добавить -n, чтобы отменить перевод строки
)}"""
// использовать returnStatus
EXIT_STATUS = """${sh(
returnStatus: true,
script: 'exit 1'
)}"""
}
stages {
stage('Example') {
environment {
DEBUG_FLAGS = '-g'
}
steps {
sh 'printenv'
}
}
}
}
Jenkins издекларативныйсборочная линия Грамматика Функция Credentials(), которая поддерживает secret текст (зашифрованный текст), имя пользователя и пароль (имя пользователя и пароль) и secret file (зашифрованный файл) wait Далее давайте рассмотрим некоторые часто используемые методы обработки учетных данных.
Этот пример демонстрирует объединение двух Secret Текстовый ваучер, присвоенный индивидуальным изпеременным приезжай в гости Amazon Web услуга, потребность Предварительно создав эти два документа из Полномочия (совещание практического отделения может иметь демонстрацию), Jenkinsfile Содержимое файла следующее
//Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
environment {
AWS_ACCESS_KEY_ID = credentials('txt1')
AWS_SECRET_ACCESS_KEY = credentials('txt2')
}
stages {
stage('Example stage 1') {
steps {
echo "$AWS_ACCESS_KEY_ID"
}
}
stage('Example stage 2') {
steps {
echo "$AWS_SECRET_ACCESS_KEY"
}
}
}
}
//Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
environment {
BITBUCKET_COMMON_CREDS = credentials('harbor-account')
}
stages {
stage('printenv') {
steps {
sh "env"
}
}
}
Приведенная выше конфигурация будет сгенерирована автоматически. 3 переменные среды
Вам необходимо зашифровать файл, чтобы сохранить его, вы также можете использовать учетные данные, такие как ссылка на Kubernetes Кластер из kubeconfig Документы и т. д.
Если он уже настроен kubeconfig файл, вы можете существовать в это время Pipeline Ссылка на этот документ в
//Jenkinsfile (Declarative Pipeline)
pipeline {
agent {
kubernetes {
cloud 'kubernetes'
slaveConnectTimeout 1200
workspaceVolume emptyDirWorkspaceVolume()
yaml '''
kind: Pod
metadata:
name: jenkins-agent
spec:
containers:
- args: [\'$(JENKINS_SECRET)\', \'$(JENKINS_NAME)\']
image: '192.168.10.15/kubernetes/jnlp:alpine'
name: jnlp
imagePullPolicy: IfNotPresent
- command:
- "cat"
image: "192.168.10.15/kubernetes/kubectl:apline"
imagePullPolicy: "IfNotPresent"
name: "kubectl"
tty: true
restartPolicy: Never
'''
}
}
environment {
MY_KUBECONFIG = credentials('kubernetes-cluster')
}
stages {
stage('kubectl') {
steps {
container(name: 'kubectl') {
sh """
kubectl get pod -A --kubeconfig $MY_KUBECONFIG
"""
}
}
}
}
}
- END -