如何在Jenkins Declarative管道中创建方法?

vin*_*ini 36 groovy jenkins jenkins-groovy jenkins-pipeline jenkins-declarative-pipeline

在jenkins脚本管道中,我们可以创建方法并可以调用它们.

是否有可能在Jenkins声明性管道中?如何?

Ste*_*ing 45

较新版本的声明性管道支持这一点,而这在此之前是不可能的(〜2017年中期).您可以通过groovy脚本声明函数,就像您期望的那样:

pipeline {
    agent any
    stages {
        stage('Test') {
            steps {
                whateverFunction()
            }
        }
    }
}

void whateverFunction() {
    sh 'ls /'
}
Run Code Online (Sandbox Code Playgroud)

  • 我能够让它工作,但是它消除了在 Blue Ocean GUI 编辑器中编辑管道的功能。你知道有办法解决这个问题吗?我直接通过文本编辑器在 Jenkinsfile 中进行大部分编辑,但能够在 UI 中快速删除内容真是太好了。我通过暂时注释掉该函数来解决这个问题。 (2认同)
  • 这真的很酷。但是,这是在哪里记录的?我找不到任何描述这种能力的资源。我只找到有关如何导入外部共享 groovy 库的文档。我只找到了将它们嵌入 Jenkinsfile 本身的 SO 答案,这非常有用。Jenkins 问题跟踪器,提案收到不会修复状态,例如:https://issues.jenkins-ci.org/browse/JENKINS-41396 (2认同)

Muk*_*h M 17

这对我有用。它可以使用 Blue Ocean GUI 进行查看,但是当我使用 Blue Ocean GUI 进行编辑时,它会删除方法“def showMavenVersion(String a)”。

pipeline {
agent any
stages {
    stage('build') {
        agent any
        steps {
            script {
                showMavenVersion('mvn version')
            }
        }
    }
}

}

def showMavenVersion(String a) {
        bat 'mvn -v'
        echo a
}
Run Code Online (Sandbox Code Playgroud)

  • 是否可以将 `stage('build')` 移动到 `showMavenVersion` 方法中? (3认同)

lvt*_*llo 12

您可以创建这样的groovy函数并将其保存在您应该配置为托管库的git中(也可以在jenkins中配置它):

/path/to/repo-shared-library/vars/sayHello.groovy:
Run Code Online (Sandbox Code Playgroud)

内容:

def call(String name = 'human') {
    echo "Hello, ${name}."
}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令在管道中调用此方法:

@Library('name-of-shared-library')_
pipeline {
    agent any
    stages {
        stage('test') {
            steps {
                sayHello 'Joe'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

[Pipeline] echo
Hello, Joe.
Run Code Online (Sandbox Code Playgroud)

您可以重复使用保存在库中的现有函数.


awe*_*ome 7

您还可以使用具有所有功能的单独groovy文件(只是为了保持结构的整洁),可以使用管道将其加载到文件中:

JenkinsFile.groovy

Map modules = [:]
pipeline {
    agent any
    stages {
        stage('test') {
            steps {
                script{
                    modules.first = load "first.groovy"
                    modules.first.test1()
                    modules.first.test2()
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第一节

def test1(){
    //add code for this method
}
def test2(){
    //add code for this method
}
return this
Run Code Online (Sandbox Code Playgroud)