且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

我可以将 groovy 脚本从相对目录导入 Jenkinsfile 吗?

更新时间:2023-12-05 17:54:22

加载共享 groovy 代码的***支持方式是通过

然后使用它,例如,像这样:

管道{代理{标签码头工人"}阶段{阶段('构建'){脚步 {脚本 {@Library('simplest-jenkins-shared-library')def bar = new org.foo.Bar()bar.awesomePrintingFunction()}}}}}

此构建的控制台日志输出当然包括:

你好世界

还有很多其他方法可以编写共享库(例如使用类)和使用它们(例如定义 vars,以便您可以以非常巧妙的方式在 Jenkinsfiles 中使用它们).您甚至可以将非 groovy 文件加载为资源.查看共享库文档,了解这些扩展用例.

I've got a project structured like this:

/
/ Jenkinsfile 
/ build_tools /
              / pipeline.groovy # Functions which define the pipeline
              / reporting.groovy # Other misc build reporting stuff
              / dostuff.sh # A shell script used by the pipeline
              / domorestuff.sh # Another pipeline supporting shell-script

Is it possible to import the groovy files in /build_tools so that I can use functions inside those 2 files in my Jenkinsfile?

Ideally, I'd like to have a Jenkins file that looks something like this (pseudocode):

from build_tools.pipeline import build_pipeline
build_pipeline(project_name="my project", reporting_id=12345)

The bit I'm stuck on is how you write a working equivalent of that pretend import statement on line #1 of my pseudocode.

PS. Why I'm doing this: The build_tools folder is actually a git submodule shared by many projects. I'm trying to give each project access to a common set of build tooling to stop each project maintainer from reinventing this wheel.

The best-supported way to load shared groovy code is through shared libraries.

If you have a shared library like this:

simplest-jenkins-shared-library master % cat src/org/foo/Bar.groovy
package org.foo;

def awesomePrintingFunction() {
  println "hello world"
}

Shove it into source control, configure it in your jenkins job or even globally (this is one of the only things you do through the Jenkins UI when using pipeline), like in this screenshot:

and then use it, for example, like this:

pipeline {
  agent { label 'docker' }
  stages {
    stage('build') {
      steps {
        script {
          @Library('simplest-jenkins-shared-library')
          def bar = new org.foo.Bar()
          bar.awesomePrintingFunction()
        }
      }
    }
  }
}

Output from the console log for this build would of course include:

hello world

There are lots of other ways to write shared libraries (like using classes) and to use them (like defining vars so you can use them in Jenkinsfiles in super-slick ways). You can even load non-groovy files as resources. Check out the shared library docs for these extended use-cases.