Подробное объяснение завершения эпического уровня конвейера Jenkins
Подробное объяснение завершения эпического уровня конвейера Jenkins

1. Что такое сборочная линия?

В Jenkins есть два типа конвейеров: декларативный конвейер и скриптовый конвейер. Скриптовый конвейер — это скрипт конвейера, используемый старой версией Jenkins. В новой версии Jenkins рекомендуется использовать декларативный конвейер. В документации описан только конвейер объявлений.

1.1 Декларативный конвейер

В декларативном синтаксисе конвейера процесс конвейера определяется в Pipeline{}, а блок Pipeline определяет всю работу, выполненную во всем конвейере, например:

Описание параметра

  • agent Any: Выполнять сборочную версию на любом доступном прокси. линеили это на любом этапе, то есть выполнение сборочное. линия процесса из позиции, также может быть назначена конкретному из узла
  • stage:определениесборочная линияиз процесса выполнения (Эквивалентно стадии), как показано нижеиз Build、Test、Deploy,Но это имя определяется в соответствии с реальной ситуацией.,Не фиксированное имя
  • шаги: Выполнение конкретного этапа.
Язык кода:javascript
копировать
//Jenkinsfile (Declarative Pipeline)
pipeline {
  agent any
    stages {
      stage('Build') {
        steps {
          echo 'Build'
        }
      }
      stage('Test') {
        steps {
          echo 'Test'
        }
      }
      stage('Deploy') {
        steps {
          echo 'Deploy'
      }
    }
  }
}

1.2 Скриптовый конвейер

В синтаксисе скриптового конвейера существует один или несколько блоков Node, которые выполняют основную работу на протяжении всего конвейера.

Описание параметра:

  • узел: существует, выполняет сборочную версию на любом доступном прокси линиялиитизлюбой этап,Вы также можете указать его для конкретного узла
  • stage:идекларативныйиззначениепоследовательный,определениесборочная этап линейз. Этап кусоксуществовать Сценарийсборочная синтаксис строки середина необязателен, однако существует сборная скриптовая сборка. понял в середине очереди stage блок, явно может существовать Jenkins UI интерфейссерединапоказыватькаждый stage из Подмножество задач.
Язык кода:javascript
копировать
//Jenkinsfile (Scripted Pipeline)
node {
  stage('Build') {
    echo 'Build'
  }
  stage('Test') {
    echo 'Test'
  }
  stage('Deploy') {
    echo 'Deploy'
  }
}

2. Декларативный конвейер

Декларативные конвейеры должны содержаться в блоке Pipeline, например в формате блока Pipeline.

Язык кода:javascript
копировать
pipeline {
  /* insert Declarative Pipeline here */
}

Основные операторы и выражения, допустимые в декларативном конвейере, подчиняются тем же правилам, что и синтаксис Groovy, со следующими исключениями.

  • сборочная линия Верхний слой должен быть блок, то есть pipeline{}
  • В качестве разделителя не требуется точка с запятой, но каждый оператор должен находиться на отдельной строке.
  • Блоки могут быть изготовлены только из Sections、Directives、Steps или assignment statements композиция
  • Операторы ссылки на свойство рассматриваются как вызовы методов без параметров, например, input будет рассматриваться как input().

2.1 Sections

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

1.Agent

Агент представляет собой место, где выполняются шаги и команды во всем конвейере или на определенном этапе. Эта часть должна быть определена на верхнем уровне блока конвейера и может быть определена снова на этапе, но уровень этапа не является обязательным.

any

Выполнение конвейера на любом доступном агенте, синтаксис конфигурации

Язык кода:javascript
копировать
pipeline {
  agent any
}
none

Указывает, что сценарий конвейера не имеет глобальной конфигурации агента. Если агент верхнего уровня настроен как «Нет», каждый раздел этапа должен содержать свой собственный агент. Синтаксис конфигурации

Язык кода:javascript
копировать
pipeline {
  agent none
  stages {
    stage('Stage For Build'){
      agent any
    }
  }
}
label

Выберите конкретный узел в виде метки узла для выполнения команды Pipeline, например: агент { label 'my-defined-label' }. Нодам необходимо заранее настроить метки.

Язык кода:javascript
копировать
pipeline {
  agent none
    stages {
      stage('Stage For Build'){
        agent { label 'role-master' }
        steps {
          echo "role-master"
        }
      }
    }
}
node

Аналогично настройке метки, за исключением того, что вы можете добавить некоторые дополнительные конфигурации, такие как customWorkspace (установить рабочий каталог по умолчанию).

Язык кода:javascript
копировать
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

Конвейеры или этапы выполнения выполняются с использованием контейнеров, созданных из файлов Dockerfile, включенных в исходный код. В это время соответствующий агент записывается следующим образом:

Язык кода:javascript
копировать
agent {
   dockerfile {
     filename 'Dockerfile.build'  //имя файла dockerfile
     dir 'build'                  //Выполняем образ сборки и рабочий каталог
     label 'role-master'          //Выполнение узла изузла, выбор метки
     additionalBuildArgs '--build-arg version=1.0.2' //Параметры сборки
   }
}
docker

Аналогично dockerfile, вы можете напрямую использовать поле docker для указания внешнего образа, что может сэкономить время создания. Например, используйте образ maven для упаковки, и вы можете одновременно указать аргументы.

Язык кода:javascript
копировать
agent{
  docker{
    image '192.168.10.15/kubernetes/alpine:latest'   //Зеркальный адрес
    label 'role-master' //Выполнение из узла, выбор метки
    args '-v /tmp:/tmp'      //Начало зеркалирования параметров
  }
}
kubernetes

Необходимо развернуть плагины, связанные с Kubernetes, официальная документация:

https://github.com/jenkinsci/kubernetes-plugin/

Jenkins Также поддерживается использование Kubernetes создавать Ведомый, также известный как динамический Slave。Конфигурация Примерследующее

Язык кода:javascript
копировать
workspaceVolume persistentVolumeClaimWorkspaceVolume(claimName: "jenkins-agent", mountPath: "/", readOnly: "false")
  • nfsWorkspaceVolume: смонтировать каталог сервера nfs
Язык кода:javascript
копировать
workspaceVolume nfsWorkspaceVolume(serverAddress: "192.168.10.254", serverPath: "/nfs", readOnly: "false")
  • DynamicPVC: динамически применять pvc и удалять его после выполнения задачи.
Язык кода:javascript
копировать
workspaceVolume dynamicPVC(storageClassName: "nfs-client", requestsSize: "1Gi", accessModes: "ReadWriteMany")
  • пустойDirWorkspaceVolume: временный каталог, который будет удален при удалении модуля после выполнения задачи. Его основная функция — совместно использовать рабочий каталог jenkins с несколькими контейнерами задач.
Язык кода:javascript
копировать
workspaceVolume emptyDirWorkspaceVolume()
  • hostPathWorkspaceVolume: монтировать node Локальный каталог узла, обратите внимание на проблемы с разрешениями при монтировании локального каталога, вы можете сначала установить его. 777 разрешения, в противном случае по умолчанию kubelet Создайте каталог для разрешений 755 По умолчанию другие пользователи не имеют прав на запись и выполнение сборочной линия сообщит об ошибке.
Язык кода:javascript
копировать
workspaceVolume hostPathWorkspaceVolume(hostPath: "/opt/workspace", readOnly: false)

Пример

Язык кода:javascript
копировать
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
'''
  }
}

2.Пример конфигурации агента

пример Кубернетеса
Язык кода:javascript
копировать
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
          """
        }
      }
    }
  }
}
Пример докера
Язык кода:javascript
копировать
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'
      }
    }
  }
}

3.Post

  1. Post Обычно используется в сборке. После окончания линии дальнейшей обработки, например, уведомления об ошибке ожидания.Post Возможен таргетинг на сборочную продукцию Различные результаты обрабатываются по-разному, точно так же, как обработка ошибок в программах разработки, таких как Python Язык из try catch。
  2. Post может определить существование Pipeline или stage середина, на данный момент поддерживает следующие условия
  3. всегда: неважно Pipeline или stage из Независимо от статуса завершения, вам разрешено запустить post середина Определение команды;
  4. изменено: только текущий Pipeline или stage Статус изCompletion отличается от предыдущего в течение времени выполнения, что позволяет существовать post Частично выполнить шаг;
  5. исправлено: когда на этот раз Pipeline или stage Успешно, а последняя сборка завершилась неудачно или нестабильно. Разрешите запуск. post середина Определение команды;
  6. регресс: когда на этот раз Pipeline или stage изStatus для неудачного, нестабильного или прекращенного, а также последняя сборка из Статус дляSuccessчас, позволяет запустить post середина Определение команды;
  7. отказ: только ток Pipeline или stage из статуса Complete для отказа (сбоя), допускается только существование post Частично пробежать шаг, обычно на этот раз существуют Web Интерфейс середина отображается красным цветом
  8. успех: текущий статус успеха (успех),выполнить пост-этап,в целомсуществовать Web Интерфейс середина отображается синим цветом или Зеленый
  9. нестабильный: Текущее состояние нестабильно (нестабильно).,выполнить пост-этап, обычно из-за сбоя теста или кода Вызванные нарушениями и т.п., существуют Web Интерфейс середина отображается желтым цветом
  10. прервано: Текущее состояние прекращено (прервано),Выполнить этот пост шаг,в целом Зависит от Всборочная линия срабатывает при ручном завершении, когда существует Web Интерфейс середина отображается серым цветом;
  11. неудачно: текущий статус не success когда, выполнить это post шаг;
  12. уборка: что угодно pipeline или stage из Независимо от статуса завершения, вам разрешено запустить post середина определение из директивы. и always изразницасуществовать В,cleanup Будут казнены после других казней.
Пример

Обычно часть сообщения размещается в нижней части конвейера. Например, в этом примере, независимо от статуса завершения этапа, будет выводиться сообщение «Я снова скажу привет!».

Язык кода:javascript
копировать
//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。

Язык кода:javascript
копировать
//Jenkinsfile (Declarative Pipeline)
pipeline {
  agent any
  stages {
    stage('Example1') {
      steps {
        sh 'ip a'
      }
      post {
        failure {
          echo 'I will always say Hello again!'
        }
      }
    }
  }
}

4.sepes

Раздел «Шаги» представляет собой один или несколько шагов, выполняемых в данной инструкции этапа, например выполнение команды оболочки, определенной в шагах.

Язык кода:javascript
копировать
//Jenkinsfile (Declarative Pipeline)
pipeline {
  agent any
  stages {
    stage('Example') {
      steps {
        echo 'Hello World'
      }
    }
  }
}

Или используйте поле sh для выполнения нескольких инструкций.

Язык кода:javascript
копировать
//Jenkinsfile (Declarative Pipeline)
pipeline {
  agent any
  stages {
    stage('Example') {
      steps {
        sh """
           echo 'Hello World1'
           echo 'Hello World2'
        """
      }
    }
  }
}

2.2 Directives

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

1.Environment

Environment В основном используется Всуществоватьсборочная средняя линияконфигурацияиссумпеременная среды,в соответствии с Конфигурацияизрешение о местоположениипеременные сфера применения. Да определение в конвейеределатьдляглобальные переменные,ХОРОШОКонфигурациясуществовать stage серединакак следует stage переменные среды. Эта директива поддерживает специальный метод credentials(),Этот метод доступен Всуществовать Jenkins Доступ к предопределенным учетным данным через идентификатор в среде. Для типа Secret Text изсертификат,credentials()Это может быть Secret Текстовое содержимое присваивается переменным среды. Для учетных данных стандартной учетной записи и типа пароля указанная переменная среды равна username и пароль, а также определит две дополнительные изпеременные среды,соответственнодляMYVARNAME_USRиMYVARNAME_PSW

Базовое использование переменных
Язык кода:javascript
копировать
//Пример
pipeline {
  agent any
  environment {   //Глобальные переменные вступят в силу везде, где есть стадиясередина.
    NAME= 'zhangzhuo'
  }
  stages {
    stage('env1') {
      environment { //Определение переменной существующих стадий вступит в силу только на текущем этапе, а на других стадиях не вступит в силу.
        HARBOR = 'https://192.168.10.15'
      }
      steps {
        sh "env"
      }
    }
    stage('env2') {
      steps {
        sh "env"
      }
    }
  }
}
Используйте переменную для ссылки на учетные данные секрета.
Язык кода:javascript
копировать
//используется здесьk8sизkubeconfig файл Пример
pipeline {
  agent any
  environment {
    KUBECONFIG = credentials('kubernetes-cluster')
  }
  stages {
    stage('env') {
      steps {
        sh "env"  //По умолчанию содержимое выходной переменной будет зашифровано
      }
    }
  }
}
Используйте тип ссылки на переменную, который представляет собой стандартные учетные данные учетной записи и типа пароля.

используется здесь HARBOR Переменные для демонстрации, по умолчанию автоматически создается пароль учетной записи типа credential. 3 переменные

Язык кода:javascript
копировать
//используется здесьk8sизkubeconfig файл Пример
pipeline {
  agent any
  environment {
    HARBOR = credentials('harbor-account')
  }
  stages {
    stage('env') {
      steps {
        sh "env"
      }
    }
  }
}

2.Options

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

определено в конвейере
Язык кода:javascript
копировать
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 Это написано следующим образом

Язык кода:javascript
копировать
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"
      }
    }
  }
}

3.Parameters

Параметры предоставляют список параметров, которые пользователь должен предоставить при запуске конвейера. Значения этих определяемых пользователем параметров могут быть предоставлены шагам конвейера через объект params. Может быть определен только на верхнем уровне конвейера.

В настоящее время поддерживаются следующие типы параметров:

Параметры плагина

  • тег изображения: зеркало тег, необходимо установить Image Tag Parameter плагинназадиспользовать
  • gitParameter: получить git Требуется склад-филиал Git Parameter плагинназадиспользовать

Пример

Язык кода:javascript
копировать
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, он должен иметь это значение
      }
    }
  }
}

4.Triggers

существовать Pipeline Может использоваться в triggers Чтобы автоматически запускать задачи выполнения конвейера, вы можете использовать Webhook、Cron、 pollSCM и upstream Запустите конвейер другими способами.

Cron

Сборка по времени, если определенная сборка линия Изготовление занимает много времени или определенная сборочная линии необходимо регулярно выполнять сборку в течение определенного периода времени, вы можете использовать cron Настройте триггер, например, запускайте его каждые четыре часа с понедельника по пятницу.

Примечание: Ч не означает HOURS значит, но Hash Аббревиатура из. Главная для решенной множественной сборки линиясуществовать При одновременной работе в системе создается давление нагрузки.

Язык кода:javascript
копировать
pipeline {
  agent any
  triggers {
    cron('H */4 * * 1-5')   //Каждый четвертый час с понедельника по пятницу, когдаодин раз    cron('H/12 * * * *')   //Выполнять каждые 12 минут
    cron('H * * * *')   //Каждый 1 час выполнено, когдаодин раз  }
  stages {
    stage('Example') {
      steps {
        echo 'Hello World'
      }
    }
  }
}
Upstream

Вышестоящий может решить, запускать ли конвейер, на основе результатов выполнения вышестоящего задания. Например, конвейер запускается при успешном выполнении задания 1 или задания 2.

В настоящее время поддерживаются следующие состояния: SUCCESS, UNSTABLE, FAILURE, NOT_BUILT, ABORTED и т. д.

Язык кода:javascript
копировать
pipeline {
  agent any
  triggers {
    upstream(upstreamProjects: 'env', threshold: hudson.model.Result.SUCCESS)  //Создаем эту сборку, когда сборка env завершится успешно линия
  }
  stages {
    stage('Example') {
      steps {
        echo 'Hello World'
      }
    }
  }
}

5.Input

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

Настройка ввода поддерживает следующие параметры.

Если вам нужно настроить сообщение с подсказкой «Хотите продолжить», а кнопку подтверждения — «Продолжить?», укажите PERSON параметр переменной и может использоваться только вошедшим в систему пользователем как alice и bob поданный input сборочная линия

Язык кода:javascript
копировать
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."
      }
    }
  }
}

6.when

When директива позволяетсборочная линия Решите, должно ли действие выполняться исходя из заданных условий stage,when Директива должна содержать как минимум условие. если when Содержит несколько условий, все подусловия должны быть возвращены. True,stage может быть выполнено.

When также можно комбинировать с синтаксисом not, allOf и AnyOf для достижения более гибкого сопоставления условий.

В настоящее время наиболее часто используемые встроенные условия следующие:

Пример:при разветвлениидля main выполнено, когда Example Deploy шаг

Язык кода:javascript
копировать
pipeline {
  agent any
  stages {
    stage('Example Build') {
      steps {
        echo 'Hello World'
      }
    }
    stage('Example Deploy') {
      when {
        branch 'main' //несколько ветвейсборочная линия, ветка для будет выполнена.
      }
      steps {
        echo 'Deploying'
      }
    }
  }
}

Вы также можете настроить несколько условий одновременно. Например, если ветвь является производственной и значение переменной DEPLOY_TO является основным, будет выполнен пример развертывания.

Язык кода:javascript
копировать
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

Язык кода:javascript
копировать
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

Язык кода:javascript
копировать
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

В настоящее время предпосылками для поддержки из являются следующие:

  • до Агент: если beforeAgent для правда, оно будет оценено первым when состояние。существовать when состояниедля true войдет в stage
  • перед Ввод: если beforeInput для правда, оно будет оценено первым when состояние。существовать when состояниедля true только когда input этап;
  • до Параметры: если beforeInput для правда,оно будет оценено первым when состояние。существовать when состояниедля true только когда options этап;

beforeOptions имеет приоритет выше, чем beforeInput, и выше, чем beforeAgent.

Пример

Язык кода:javascript
копировать
pipeline {
  agent none
  stages {
    stage('Example Build') {
      steps {
        echo 'Hello World'
      }
    }
    stage('Example Deploy') {
      when {
        beforeAgent true
        branch 'main'
      }
      steps {
        echo 'Deploying'
      }
    }
  }
}

2.3 Parallel

существоватьдекларативныйсборочная среднюю линию можно использовать Parallel полей очень удобно реализовать параллельное построение, например ветки A、B、 C Выполнить параллельную обработку

Язык кода:javascript
копировать
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"
              }
            }
          }
        }
      }
    }
  }
}

3. Использование Jenkinsfile

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

создаватьодин Jenkinsfile и размещение его в репозитории кода дает следующие преимущества

3.1 Переменные среды

1. Статические переменные

Jenkins Многие встроенные переменные могут существовать напрямую. Jenkinsfile серединаиспользовать,Можетпроходить JENKINS_URL/pipeline/syntax/globals#env Получите полный список. В настоящее время чаще используются изпеременные средыследующее

  • BUILD_ID: текущая сборка из удостоверение личности, с Jenkins Версия 1.597+в BUILD_NUMBER точно такой же
  • BUILD_NUMBER:Текущая сборкаиз ID,и BUILD_ID последовательный
  • BUILD_TAG: используется для идентификации номера сборки.,Форматдля:jenkins-{JOB_NAME}-{BUILD_NUMBER}, Продукты могут быть названы, например, продукция из jar Название пакета, изображение из TAG ждать;
  • BUILD_URL: полный URL-адрес этой сборки — адрес: http://buildserver/jenkins/job/MyJobName/17/%EF%BC%9B.
  • JOB_NAME: имя этого проекта сборки.
  • NODE_NAME:Текущая сборкаузелизName;
  • JENKINS_URL:Jenkins Полный URL,нуждатьсясуществовать SystemConfiguration настраивать;
  • РАБОЧАЯ ОБЛАСТЬ: Выполнить сборку из Рабочего каталога.

Пример, если сборка линияимядляprint_env,Сборка 2,каждыйпеременныеизценить。

Язык кода:javascript
копировать
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 Ссылка на встроенную переменную

Язык кода:javascript
копировать
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"
          }
        }
      }
    }
  }
}

2. Динамические переменные

Динамические переменные назначаются динамически на основе результата определенной инструкции. Значение переменной меняется в зависимости от результата выполнения инструкции. Как показано ниже

  • returnStdout: присваивает результат выполнения Заказиз переменной. Например, следующий результат возврата из Заказ: лязг,в это время CC изценитьдля“clang”。
  • returnStatus: присвойте статус выполнения Заказа переменной, например, следующий Статус выполнения Заказа для 1. В это время EXIT_STATUS имеет значение для 1.
Язык кода:javascript
копировать
//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'
      }
    }
  }
}

3.2 Управление учетными данными

Jenkins издекларативныйсборочная линия Грамматика Функция Credentials(), которая поддерживает secret текст (зашифрованный текст), имя пользователя и пароль (имя пользователя и пароль) и secret file (зашифрованный файл) wait Далее давайте рассмотрим некоторые часто используемые методы обработки учетных данных.

1. Зашифрованный текст

Этот пример демонстрирует объединение двух Secret Текстовый ваучер, присвоенный индивидуальным изпеременным приезжай в гости Amazon Web услуга, потребность Предварительно создав эти два документа из Полномочия (совещание практического отделения может иметь демонстрацию), Jenkinsfile Содержимое файла следующее

Язык кода:javascript
копировать
//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"
      }
    }
  }
}

2. Имя пользователя и пароль

Этот пример используется для демонстрации credentials Пароль учетной записи изиспользовать, например использовать доступ к общедоступной учетной записи. Bitbucket、GitLab、 Harbor Предположим, что Конфигурация заполнила форму имени пользователя и пароля. полномочия, полномочия ID для harbor-account

Язык кода:javascript
копировать
//Jenkinsfile (Declarative Pipeline)
pipeline {
  agent any
  environment {
    BITBUCKET_COMMON_CREDS = credentials('harbor-account')
  }
  stages {
    stage('printenv') {
      steps {
        sh "env"
      }
    }
}

Приведенная выше конфигурация будет сгенерирована автоматически. 3 переменные среды

  • BITBUCKET_COMMON_CREDS: содержит имя пользователя и пароль, разделенные двоеточиями, в формате для username:password
  • BITBUCKET_COMMON_CREDS_USR: содержит только имя пользователя из дополнительных переменных.
  • BITBUCKET_COMMON_CREDS_PSW: содержит только пароль и дополнительные переменные.

3. Шифрование файлов

Вам необходимо зашифровать файл, чтобы сохранить его, вы также можете использовать учетные данные, такие как ссылка на Kubernetes Кластер из kubeconfig Документы и т. д.

Если он уже настроен kubeconfig файл, вы можете существовать в это время Pipeline Ссылка на этот документ в

Язык кода:javascript
копировать
//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 -

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.