Как ввести этапы или шаги в конвейер Jenkins - PullRequest
2 голосов
/ 24 октября 2019

Вывод этого python eval выглядит так, как будто это могут быть этапы в конвейере jenkins

 $ python3 -c 'print("\n".join(["stage({val}) {{ do something with {val} }}".format(val=i) for i in range(3)]))'
stage(0) { do something with 0 }
stage(1) { do something with 1 }
stage(2) { do something with 2 }

Возможно ли, чтобы jenkins использовал вывод, подобный этому, для создания шагов или этапов вконвейер, чтобы работающий скрипт на python мог обновлять jenkins? Смысл этого в том, чтобы у конвейера Blue Ocean была точка этапа, созданная внешним сценарием, выполняющим отдельные задания.

Чтобы пояснить пример ... если это сценарий demo.py, который выводит время безотказной работына этапе

#!/bin/env python3.6
import subprocess, time

def uptime():
    return (subprocess.run('uptime', stdout=subprocess.PIPE, encoding='utf8')).stdout.strip()

for i in range(3):
    print("stage({val}) {{\n    echo \"{output}\" \n}}".format(val=i, output=uptime()))
    time.sleep(1)

, где необходимо настроить конвейер Дженкинса

node {
    stage("start demo"){
        sh "/tmp/demo.py"

    }
}

Как и в этом демонстрационном примере, просто выводится текст и не создаются никакие этапы в синем океане

[Pipeline] sh
+ /tmp/demo.py
stage(0) {
    echo "03:17:16 up 182 days, 12:17,  8 users,  load average: 0.00, 0.03, 0.05" 
}
stage(1) {
    echo "03:17:17 up 182 days, 12:17,  8 users,  load average: 0.00, 0.03, 0.05" 
}
stage(2) {
    echo "03:17:18 up 182 days, 12:17,  8 users,  load average: 0.00, 0.03, 0.05" 
}

Опять же, смысл в том, чтобы у трубопровода Blue Ocean была точка сцены с бревном

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Вы можете вычислить выражение и затем вызвать его.

node(''){
 Closure x = evaluate("{it -> evaluate(it)}" )
 x(" stage('test'){ script { echo 'hi'}}")
}
0 голосов
/ 25 октября 2019

Поскольку Jenkins преобразует ваш скрипт Groovy в Java, компилирует его и , а затем выполняет результат, было бы довольно сложно использовать внешнюю программу для генерации большего количества Groovy для выполнения, поскольку для этого дополнительного кода Groovy потребуетсябыть преобразованным. Но сгенерированный код является результатом выполнения, а это означает, что преобразование уже выполнено.

Вместо этого вы можете захотеть программно построить свои этапы в Groovy.


some_array = ["/tmp/demo.py", "sleep 10", "uptime"] 

def getBuilders()
{
    def builders = [:]

    some_array.eachWithIndex { it, index ->
        // name the stage
        def name = 'Stage #' + (index + 1)
        builders[name] = {
            stage (name) {
                def my_label = "jenkins_label" // can choose programmatically if needed
                node(my_label) {
                        try {
                            doSomething(it)
                        }
                        catch (err) { println "Failed to run ${it}"; throw err  }
                        finally {  }
                    }
            }
        }
    };
    return builders
}

def doSomething(something) {
    sh "${something}"
}

И позже вваш главный конвейер

        stage('Do it all') {
            steps {
                script {
                    def builders = getBuilders()
                    parallel builders
                }
            }

Это будет проходить три параллельных этапа, где один будет работать /tmp/demo.py, второй sleep 10 и третий uptime.

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