Chcę być w stanie wybrać, czy etap rurociągu zostanie wykonany z agentem dockerfile w zależności od obecności Dockerfile w repozytorium. Jeśli nie ma Dockerfile, etap powinien być uruchomiony lokalnie.

Spróbowałem czegoś takiego

pipeline {
    stage('AwesomeStage') {
        when {
            beforeAgent true
            expression { return fileExists("Dockerfile") }
        }
        agent { dockerfile }
        steps {
           // long list of awesome steps that should be run either on Docker either locally, depending on the presence of a Dockerfile
        }
    }

}

Ale wynikiem jest to, że cała stage jest pomijana, gdy nie ma Dockerfile.

Czy można zrobić coś takiego jak następujący blok?

//...
if (fileExists("Dockerfile")) {
    agent {dockerfile}
}
else {
    agent none
}
//...
0
Bruno Alexandre Rosa 31 grudzień 2019, 17:29

1 odpowiedź

Najlepsza odpowiedź

Wymyśliłem to rozwiązanie, które opiera się na definiowaniu funkcji, aby uniknąć powtórzenia i określa dwa różne etapy zgodnie z rodzajem środka.

Jeśli ktoś ma bardziej eleganckie rozwiązanie, daj mi znać.

def awesomeScript() {
// long list of awesome steps that should be run either on Docker either locally, depending on the presence of a Dockerfile
}
pipeline {
    stage('AwesomeStageDockerfile') {
        when {
            beforeAgent true
            expression { return fileExists("Dockerfile") }
        }
        agent { dockerfile }
        steps {
           awesomeScript()
        }
    }
    stage('AwesomeStageLocal') {
        when {
            beforeAgent true
            expression { return !fileExists("Dockerfile") }
        }
        agent none
        steps {
           awesomeScript()
        }
    }

}
1
Bruno Alexandre Rosa 31 grudzień 2019, 15:14