선언적 Jenkins 파이프 라인 스크립트를 만들려고하지만 간단한 변수 선언에 문제가 있습니다.
내 스크립트는 다음과 같습니다.
pipeline {
agent none
stages {
stage("first") {
def foo = "foo" // fails with "WorkflowScript: 5: Expected a step @ line 5, column 13."
sh "echo ${foo}"
}
}
}
그러나 다음 오류가 발생합니다.
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 5: Expected a step @ line 5, column 13.
def foo = "foo"
^
Jenkins 2.7.4 및 Pipeline 2.4에 있습니다.
답변
Jenkins Pipelines에 대한 선언적 모델에는 stage
블록 에서 허용하는 제한된 구문 하위 집합이 있습니다 . 자세한 내용은 구문 가이드를 참조하세요 . 단계를 script { ... }
블록 으로 래핑하여 이러한 제한을 우회 할 수 있지만 결과적으로 script
블록 내에서 구문, 매개 변수 등의 유효성 검사를 잃게됩니다 .
답변
나는 오류가 지정된 줄에서 오는 것이 아니라 처음 3 줄에서 발생한다고 생각합니다. 대신 이것을 시도하십시오.
node {
stage("first") {
def foo = "foo"
sh "echo ${foo}"
}
}
유효하지 않은 추가 줄이있는 것 같습니다 …
편집하다
declaractive에서 파이프 라인 모델 문서 , 당신이 사용해야 할 것 같다 environment
예를 들어, 귀하의 변수를 선언하는 선언 블록을 :
pipeline {
environment {
FOO = "foo"
}
agent none
stages {
stage("first") {
sh "echo ${FOO}"
}
}
}
답변
@ Pom12, @abayer에 동의합니다. 답변을 완료하려면 스크립트 블록을 추가해야합니다.
다음과 같이 시도하십시오.
pipeline {
agent any
environment {
ENV_NAME = "${env.BRANCH_NAME}"
}
// ----------------
stages {
stage('Build Container') {
steps {
echo 'Building Container..'
script {
if (ENVIRONMENT_NAME == 'development') {
ENV_NAME = 'Development'
} else if (ENVIRONMENT_NAME == 'release') {
ENV_NAME = 'Production'
}
}
echo 'Building Branch: ' + env.BRANCH_NAME
echo 'Build Number: ' + env.BUILD_NUMBER
echo 'Building Environment: ' + ENV_NAME
echo "Running your service with environemnt ${ENV_NAME} now"
}
}
}
}
답변
Jenkins 2.138.3에는 두 가지 유형의 파이프 라인이 있습니다.
선언적 및 스크립팅 된 파이프 라인.
“선언적 파이프 라인은 파이프 라인 DSL의 새로운 확장입니다 (기본적으로 한 단계 만있는 파이프 라인 스크립트, 인수가있는 파이프 라인 단계 (지시문이라고 함)). 이러한 지시문은 특정 구문을 따라야합니다.이 새로운 형식의 요점은 더 엄격하므로 파이프 라인을 처음 접하는 사람들에게 더 쉬워야하며 그래픽 편집 등을 허용해야합니다. 스크립팅 된 파이프 라인은 고급 요구 사항을위한 대안입니다. “
다음은 선언적 파이프 라인에서 환경 및 전역 변수를 사용하는 예입니다. 환경이 설정된 후 정적이라고 말할 수 있습니다.
def browser = 'Unknown'
pipeline {
agent any
environment {
//Use Pipeline Utility Steps plugin to read information from pom.xml into env variables
IMAGE = readMavenPom().getArtifactId()
VERSION = readMavenPom().getVersion()
}
stages {
stage('Example') {
steps {
script {
browser = sh(returnStdout: true, script: 'echo Chrome')
}
}
}
stage('SNAPSHOT') {
when {
expression {
return !env.JOB_NAME.equals("PROD") && !env.VERSION.contains("RELEASE")
}
}
steps {
echo "SNAPSHOT"
echo "${browser}"
}
}
stage('RELEASE') {
when {
expression {
return !env.JOB_NAME.equals("TEST") && !env.VERSION.contains("RELEASE")
}
}
steps {
echo "RELEASE"
echo "${browser}"
}
}
}//end of stages
}//end of pipeline
답변
Groovy 코드를 실행 하려면 스크립트 단계 가 필요한 선언적 파이프 라인 을 사용하고 있습니다. 이것은 필요하지 않은 스크립트 된 파이프 라인에 비해 큰 차이 입니다.
공식 문서는 다음을 말한다 :
스크립트 단계는 스크립팅 된 파이프 라인 블록을 가져 와서 선언적 파이프 라인에서 실행합니다.
pipeline {
agent none
stages {
stage("first") {
script {
def foo = "foo"
sh "echo ${foo}"
}
}
}
}