首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从相同的Git repo中将共享的groovy脚本导入到管道中?

如何从相同的Git repo中将共享的groovy脚本导入到管道中?
EN

Stack Overflow用户
提问于 2020-10-31 02:58:07
回答 2查看 355关注 0票数 0

我的存储库中有以下两条管道

代码语言:javascript
运行
复制
@Field String ANDROID_EMULATOR = "android-emulator"

pipeline {
    agent { label "android-emulator" }
    stages {
        stage("build") {
            steps {
                gradlew (":build")
            }
        }
    }
}

void gradlew(String tasks) {
    sh "./gradlew $tasks --profile"
}
代码语言:javascript
运行
复制
@Field String ANDROID_EMULATOR = "android-emulator"

pipeline {
    agent none
    stages {
        stage("PR checks") {
            parallel {
                stage("build 1") {
                    agent { label ANDROID_EMULATOR }
                    steps {
                        gradlew(":one:build")
                    }
                }
                stage("build 2") {
                    agent { label ANDROID_EMULATOR }
                    steps {
                        gradlew(":two:build")
                    }
                }
            }
        }
    }
}

void gradlew(String tasks) {
    sh "./gradlew $tasks --profile"
}

如您所见,在ANDROID_EMULATORvoid gradlew(..)这两个文件之间有一些代码重复。

我想将它们移动到它们自己的shared.groovy文件中:

代码语言:javascript
运行
复制
@Field String ANDROID_EMULATOR = "android-emulator"

void gradlew(String tasks) {
    sh "./gradlew $tasks --profile"
}

并且能够通过一行代码将其导入到我的其他管道中。Gradle允许使用apply('shared.groovy')来实现这一点。

Jenkins似乎只允许共享库(全局的)和load语句(需要作为节点的一部分加载,这不能很好地扩展)。Jenkins在这里是否缺乏对这种基本的代码共享风格的支持?

EN

回答 2

Stack Overflow用户

发布于 2020-10-31 20:11:39

你可以使用管道load,它比使用共享库更简单,特别是当你希望shared.groovy和你的Jenkinsfile在同一个repo中时。

代码语言:javascript
运行
复制
// shared.groovy

def gradlew(String tasks) {
    sh "./gradlew $tasks --profile"
}

return this // the return this must be have
代码语言:javascript
运行
复制
// pipeline 1

pipeline {
    agent { label "android-emulator" }
    stages {
        stage("build") {
            steps {
                scripts {
                     shared = load 'shared.groovy'
                     shared.gradlew (":build")
                }
                
            }
        }
    }
}
代码语言:javascript
运行
复制
// pipeline 2

pipeline {
    agent { label "android-emulator" }
    stages {
        stage("build") {
            steps {
                scripts {
                     shared = load 'shared.groovy'
                     shared.gradlew ("one:build")
                }
                
            }
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2020-10-31 06:23:05

Jenkins共享库有一个定义良好的文件夹结构https://www.jenkins.io/doc/book/pipeline/shared-libraries/#directory-structure

您可以尝试:

  • 要在存储库的子文件夹中实现此文件夹结构
  • 要使用带有配置文件的Dynamic Retrieval,该配置将签出特定的文件夹

恐怕这太复杂了,甚至不可能

我认为最好的方法是创建全局共享库repo并实现gradleBuild custom step。在这种情况下,您的代码如下所示

管道1:

代码语言:javascript
运行
复制
@Library('somelib')
@Field String ANDROID_EMULATOR = "android-emulator"

pipeline {
   agent { label "android-emulator" }
   stages {
     stage("build") {
        steps {
            gradleBuild ":build"
        }
     }
  }
}

管道2:

代码语言:javascript
运行
复制
@Library('somelib')
@Field String ANDROID_EMULATOR = "android-emulator"

pipeline {
  agent none
  stages {
     stage("PR checks") {
        parallel {
            stage("build 1") {
                agent { label ANDROID_EMULATOR }
                steps {
                    gradlew(":one:build")
                }
            }
            stage("build 2") {
                agent { label ANDROID_EMULATOR }
                steps {
                    gradlew(":two:build")
                }
            }
        }
     }
   }
}

共享库vars/gradeBuild.groovy文件:

代码语言:javascript
运行
复制
def call(String tasks) {
   sh "./gradlew $tasks --profile"
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64614258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档