我的存储库中有以下两条管道
@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"
}@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_EMULATOR和void gradlew(..)这两个文件之间有一些代码重复。
我想将它们移动到它们自己的shared.groovy文件中:
@Field String ANDROID_EMULATOR = "android-emulator"
void gradlew(String tasks) {
sh "./gradlew $tasks --profile"
}并且能够通过一行代码将其导入到我的其他管道中。Gradle允许使用apply('shared.groovy')来实现这一点。
Jenkins似乎只允许共享库(全局的)和load语句(需要作为节点的一部分加载,这不能很好地扩展)。Jenkins在这里是否缺乏对这种基本的代码共享风格的支持?
发布于 2020-10-31 20:11:39
你可以使用管道load,它比使用共享库更简单,特别是当你希望shared.groovy和你的Jenkinsfile在同一个repo中时。
// shared.groovy
def gradlew(String tasks) {
sh "./gradlew $tasks --profile"
}
return this // the return this must be have// pipeline 1
pipeline {
agent { label "android-emulator" }
stages {
stage("build") {
steps {
scripts {
shared = load 'shared.groovy'
shared.gradlew (":build")
}
}
}
}
}// pipeline 2
pipeline {
agent { label "android-emulator" }
stages {
stage("build") {
steps {
scripts {
shared = load 'shared.groovy'
shared.gradlew ("one:build")
}
}
}
}
}发布于 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:
@Library('somelib')
@Field String ANDROID_EMULATOR = "android-emulator"
pipeline {
agent { label "android-emulator" }
stages {
stage("build") {
steps {
gradleBuild ":build"
}
}
}
}管道2:
@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文件:
def call(String tasks) {
sh "./gradlew $tasks --profile"
}https://stackoverflow.com/questions/64614258
复制相似问题