Jenkins: Ardışık düzen aşamasında değişken tanımlayamaz


106

Açıklamalı bir Jenkins işlem hattı betiği oluşturmaya çalışıyorum, ancak basit değişken bildirimiyle ilgili sorunlar yaşıyorum.

İşte benim senaryom:

pipeline {
   agent none
   stages {
       stage("first") {
           def foo = "foo" // fails with "WorkflowScript: 5: Expected a step @ line 5, column 13."
           sh "echo ${foo}"
       }
   }
}

Ancak şu hatayı alıyorum:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 5: Expected a step @ line 5, column 13.
           def foo = "foo"
           ^

Jenkins 2.7.4 ve Pipeline 2.4'teyim.

Yanıtlar:


101

Jenkins Pipelines için Bildirime dayalı model, stagebloklarda izin verdiği sınırlı bir sözdizimi alt kümesine sahiptir - daha fazla bilgi için sözdizimi kılavuzuna bakın . Adımlarınızı bir script { ... }bloğa sararak bu kısıtlamayı atlayabilirsiniz , ancak sonuç olarak, scriptblok içindeki sözdizimi, parametreler vb . Doğrulamasını kaybedersiniz .


5
Bu değişkeni betik bloğunun dışında kullanmak istersem ne olur?
Jan Steinke

3
değişkeni komut dosyası bloğu dışında kullanmak için bu stackoverflow.com/questions/43879733/…
adresini

56

Sanırım hata belirtilen satırdan değil ilk 3 satırdan geliyor. Bunun yerine şunu deneyin:

node {
   stage("first") {
     def foo = "foo"
     sh "echo ${foo}"
   }
}

Sanırım geçersiz bazı ekstra satırlarınız var ...

DÜZENLE

Bildirime uygun ardışık düzen modeli dokümantasyonundan , environmentdeğişkenlerinizi bildirmek için bir bildirim bloğu kullanmanız gerektiği anlaşılıyor , örneğin:

pipeline {
   environment {
     FOO = "foo"
   }

   agent none
   stages {
       stage("first") {
           sh "echo ${FOO}"
       }
   }
}

1
Bir aşamaya bir ortam bloğu da ekleyebilirsiniz (örneğin, değişkeniniz daha önceki bir adımda yapılan bir şeye bağlıysa).
Tereza Tomcova

34

@ Pom12, @abayer ile katılıyorum. Cevabı tamamlamak için komut dosyası bloğu eklemeniz gerekir

Bunun gibi bir şey dene:

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"
            }
        }
    }
}

4
Bu örneğin, jenkins tarafından erişilebilen "ENVIRONMENT_NAME" tanımlı bir ortam değişkeni olduğunu varsaydığına dikkat edin.
Alberto

1
Komut dosyası bloğu ortam değerlerini değiştirebilir mi?
pitchblack408

Evet, ortam değerini de betik bloğu içinde değiştirebilirsiniz.
NicoPaez

8

Jenkins 2.138.3'te iki farklı boru hattı türü vardır.

Bildirime Dayalı ve Komut Dosyalı ardışık düzenler.

"Bildirime dayalı ardışık düzenler, ardışık düzen DSL'in yeni bir uzantısıdır (temelde yalnızca bir adımlı bir ardışık düzen komut dosyasıdır, bağımsız değişkenler içeren bir ardışık düzen adımıdır (yönergeler olarak adlandırılır), bu yönergeler belirli bir sözdizimini izlemelidir. Bu yeni biçimin amacı şudur: daha katıdır ve bu nedenle ardışık düzenlerde yeni olanlar için daha kolay olmalıdır, grafiksel düzenlemeye ve çok daha fazlasına izin verir. Komut dosyalı ardışık düzenler, gelişmiş gereksinimler için yedektir. "

jenkins pipeline: ajan ve düğüm?

Burada, Bildirime Dayalı Ardışık Düzende ortam ve global değişkenlerin kullanımına bir örnek verilmiştir. Söyleyebileceğim kadarıyla ortam ayarlandıktan sonra statiktir.

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

Yukarıdaki koddan şu hatayı alıyorum: [Ardışık Düzeni] Ardışık Düzeni Başlangıcı [Ardışık Düzeni] readMavenPom [Ardışık Düzeni] Ardışık Düzeni Sonu org.jenkinsci.plugins.workflow.steps.MissingContextVariableException: Gerekli bağlam sınıfı hudson.FilePath eksik Belki çevrelemeyi unuttunuz bunu sağlayan bir adım içeren kod, örneğin: node
mancocapac

Hayır, olduğu gibi çalıştı. Bildirimsel bir ardışık düzen. Ajan, herhangi bir düğümde çalışabileceği anlamına gelir
pitchblack408

@ pitchblack408, haklısınız, boru hattımın tepesinde [ajan yok] vardı. Ne demek istediğinizden emin değilsiniz: ortam ayarlandıktan sonra statik mi? Bir komut dosyası içinde değiştirilebilirler, örneğin {IMAGE = "newVal} komut dosyası
mancocapac

Örnek, IMAGE'ye bakın. İşlem hatları tarafından değiştirilebilen veya değiştirilmesi gereken değişken değildir. Anladığım kadarıyla, ortamın bir parçası olarak tanımlandıktan sonra statik bir değer olarak ele alınacak.
pitchblack408

0

Groovy kodunu yürütmek için bir betik adımı gerektiren bir Bildirime Dayalı Ardışık Düzen kullanıyorsunuz. Bu, gerekli olmadığında Komut Dosyalı Ardışık Düzen ile karşılaştırıldığında çok büyük bir farktır .

Resmi belgeler aşağıdaki diyor:

Komut dosyası adımı, Komut Dosyalı Ardışık Düzeni bloğunu alır ve bunu Bildirime Dayalı Ardışık Düzeninde yürütür.

pipeline {
   agent none
   stages {
       stage("first") {
           script {
               def foo = "foo" 
               sh "echo ${foo}"
           }
       }
   }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.