Трубопровод Дженкинса: использование глобальной переменной в конвейере - PullRequest
0 голосов
/ 23 января 2019

У меня есть конвейер Jenkins с несколькими этапами, который должен знать, как была запущена сборка (пользователем, таймером и т. Д.), И я бы хотел избежать дублирования следующей строки на каждом этапе:

currentBuild.rawBuild.getCauses()[0].class.getName().contains('TimerTriggerCause')

При использовании этой команды в каждом блоке when она работает, как и ожидалось, но при помещении в блок environment она продолжает давать сбой:

[Pipeline] node
Running on Jenkins in /var/lib/jenkins/jobs/test-pipeline/workspace
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Stage on timer)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.lang.NoSuchMethodError: No such DSL method '$' found among steps [archive, bat, build, catchError...zip] or globals [currentBuild, docker, env, params, pipeline, scm]
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:199)
    at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:122)
    at sun.reflect.GeneratedMethodAccessor513.invoke(Unknown Source)

Сценарий Дженкинса:

pipeline {

  agent {
    label 'master'
  }

  environment {
    DAY = Calendar.getInstance().get(Calendar.DAY_OF_WEEK)
    HOUR = Calendar.getInstance().get(Calendar.HOUR_OF_DAY)
    ONTIMER = currentBuild.rawBuild.getCauses()[0].class.getName().contains('TimerTriggerCause')
  }

  stages {
    stage('Stage on timer') {

      when {
        expression {
              return (${ONTIMER} && (${DAY} != Calendar.SATURDAY && ${DAY} != Calendar.SUNDAY))
        }
      }

      steps {
        echo "on timer..."
      }
    }
  }
}

Две другие переменные DAY и HOUR отлично работают при использовании в блоке when. Есть идеи?

1 Ответ

0 голосов
/ 24 января 2019

После еще нескольких проб и ошибок я получил желаемое поведение.

Условие when при работе с переменными среды использует несколько иной синтаксис. Тогда у него есть собственное ключевое слово environment:

when {
  environment name: 'ONTIMER', value: 'true'
}

В качестве бонуса , используя целочисленное значение в блоке when:

when {
  allOf {
    environment name: 'ONTIMER', value: 'true'
    expression { return Integer.parseInt(env.HOUR) < 11 }
  }
}

Еще лучше , можно использовать ключевое слово triggeredBy и действовать так:

when {
  anyOf {
    expression { return params.RUN }
    allOf {
      triggeredBy "TimerTrigger"
      expression { 
        Integer.parseInt(env.HOUR) < 13 
      }
    }
  }
}

Значения, которые будут использоваться с triggeredBy, включают в себя:

  • TimerTrigger
  • UserId
  • (другие? Как триггер SCM?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...