тупик при запуске двух трубопроводов параллельно в дженкинсе - PullRequest
0 голосов
/ 24 мая 2018

В настоящее время у меня есть следующая проблема.Я написал Jenkinsfile для создания своего репозитория в конвейере.Каждый репозиторий имеет свой собственный конвейер в многоотраслевом конвейере.Всякий раз, когда я нажимаю на репозиторий, конвейер начинает работать.

Для здания у меня есть один агент с двумя узлами.Когда работает многоотраслевой конвейер, многоотраслевой конвейер использует один узел для выполнения одного конвейера, а второй узел используется текущим выполняющимся конвейером для запуска одного задания.

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

Я попытался установить "disableConcurrentBuilds ()", но это блокирует только конвейер с тем же именем.Конвейеры с разными именами в многоотраслевом конвейере могут работать одновременно.

Вторая попытка - установить плагин Build Blocker с этим кодом в Jenkinsfile.

properties([
    [$class: 'BuildBlockerProperty',
     blockLevel: 'GLOBAL',
     blockingJobs: '*pipeline_Test*',
     scanQueueFor: 'ALL',
     useBuildBlocker: true],
   disableConcurrentBuilds()
   ])

Но тогда я получаю это сообщение об ошибке.

WorkflowScript: 30: недопустимый тип параметра "свойства".Допустимые типы параметров: [buildDiscarder, catchError, checkoutToSubdirectory, disableConcurrentBuilds, disableResume, durabilityHint, блокировка, newContainerPerStage, overrideIndexTriggers, повторная попытка, сценарий, skipDefaultCheckout, skipStagesAtagesUnt, строка с именем, строка со значением, столбец ожидания, столбец с ключами, время ожидания, со столбцом, со значением1015 *

Как установить свойство BuildBlocker в файле Jenkins для всего конвейера?Есть ли другой способ заблокировать все другие конвейеры, пока он работает?

Спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Самый простой способ обойти это - просто увеличить число исполнителей на одного, гарантируя, что у вас всегда будет на одного исполнителя больше, чем вы выполняете родительские задания.

Таким образом, всегда будет либо один свободный исполнитель, либо одинвыполнение дочерней работы, которая завершит и освободит исполнителя.

Вы можете установить исполнителей в Manage Jenkins > Nodes > (node name) > Configure > # of executors

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

0 голосов
/ 21 мая 2019

Боролась с той же проблемой.

Вы не передали свой Jenkinsfile, но если вашему конвейеру требуется 1 узел-исполнитель для запуска конвейера и еще один дополнительный для выполнения задания, вероятно, вы установили агент наУровень конвейера, а также на уровне этапа, как

pipeline {
  agent any

  stage('Build') {
    agent {
      label 'my label'
    }

    steps {
      ...
    }
  }

  post {
    always {
      ...
    }
  }
}

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

Если для вашего конвейера требуются определенные настройки агента (метки, образы докеров, ...) на уровне этапа рекомендуется установить agent none на уровне конвейера:

pipeline {
  agent none

  stage('Build') {
    agent {
      label 'my label'
    }

    steps {
      ...
    }
  }
}

Таким образом, необходим только 1 узел-исполнитель, что предотвращает тупик.

Если вы мне нравитесьесли вам нужен шаг post, вы можете запустить его как

pipeline {
  agent none

  stage('Build') {
    agent {
      label 'my other label'
    }

    steps {
      ...
    }
  }

  post {
    always {
      node('label') {
        ...
      }
    }
  }
}

, чтобы предоставить ему узел.Метка обязательна, не нашел способа запустить ее ни на одном узле.Добавление блока node{} позволяет блоку post работать с установленным agent none на уровне конвейера.

Это сработало для меня и могло бы стать решением для OP.В OP было предоставлено недостаточно информации для определения конкретной конфигурации конвейера.

0 голосов
/ 24 мая 2018

Используйте Lock для блокировки сцены или шага.Это предотвратит параллельное построение для каждой ветви в многоотраслевых конвейерах.

stage("Do stuff") {
  lock("my_lock") {

    // do stuff

  } // resource is unlocked.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...