如何使用正则表达式定义大小写开关以检查大小写变量是否包含特定字符串?

How to define case switch to check if the case variable includes specific strings by using regex?

我正在编写 Jenkins 管道作为代码以构建 Android 应用程序。

作业配置为 "GitHub Organization",这意味着 Jenkins 正在扫描给定的存储库,将每个分支添加为作业并在发生 git 提交时启动作业 运行 .

switch(BRANCH_NAME) {
    case "develop":
        BUILDFLAV = "Staging"
        BUILDTYPE = "Debug"
        ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
        break
    case "master":
        BUILDFLAV = "Production"
        BUILDTYPE = "Release"
        ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
        break
    case "release_candidate":
        ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
        break
    case "hotfix":
        ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
        break
    case "jenkins-pipeline":
        BUILDFLAV = "Staging"
        BUILDTYPE = "Debug"
        ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
        break
    case "feature/upload_to_hockeyapp":
        BUILDFLAV = "Staging"
        BUILDTYPE = "Debug"
        ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
        break
    case "feature/notifications":
        BUILDFLAV = "Staging"
        BUILDTYPE = "Debug"
        ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
        break
    default:
        println "Branch name was not set!"
        break
}

有些分支是这样命名的:

hotfix/3.0.1
release/3.2.1

我想为这些分支定义一个 case 选项,例如:

case "^hotfix.*"
   code....
   break

并且:

case "^release\/.*"
    code...
    break

编辑 #1: 这是添加您的部分后的代码:

// Branch selection
def showRelease(BRANCH_NAME, regex) {
    def pattern = "(release|hotfix)\/(\d+\.)?(\d+\.)?(\*|\d+)"
    switch(BRANCH_NAME) {
        case "develop":
            BUILDFLAV = "Staging"
            BUILDTYPE = "Debug"
            ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
            break
        case "master":
            BUILDFLAV = "Production"
            BUILDTYPE = "Release"
            ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
            break
        case "release_candidate":
            ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
            break
        case "hotfix":
            ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
            break
        case "jenkins-pipeline":
            BUILDFLAV = "Staging"
            BUILDTYPE = "Debug"
            ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
            break
        case "feature/notifications":
            BUILDFLAV = "Staging"
            BUILDTYPE = "Debug"
            ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
            break
        case ~/$regex/:
            BUILDFLAV = "Staging"
            BUILDTYPE = "Debug"
            ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
            println BRANCH_NAME

            break
        default:
            println "Branch name was not set!"
            break
    }
}

但是,当我 运行 构建时,BRANCH_NAME 设置不正确并且后续步骤无法 运行 因为它们缺少 BUILDFLAV 和 BUILDTYPE 变量。

编辑#2: 我已经添加了您建议的代码:

case ~/(release|hotfix)\/(\d+\.)?(\d+\.)?(\*|\d+)/:
        BUILDFLAV = "Staging"
        BUILDTYPE = "Debug"
        ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
        println "Branch Name: ${BRANCH_NAME}"
        break

但现在我得到这个错误:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use staticMethod org.codehaus.groovy.runtime.ScriptBytecodeAdapter bitwiseNegate java.lang.Object
    at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectStaticMethod(StaticWhitelist.java:190)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onStaticCall(SandboxInterceptor.java:142)
    at org.kohsuke.groovy.sandbox.impl.Checker.call(Checker.java:180)

但我不太熟悉 Jenkins 中的正则表达式 (groovy),如何实现?

我相信可以通过以下简单的方式来处理 hotfixreleases:

脚本:

def showRelease(val, regex) {
    switch (val) {
        case ~/$regex/:
            println "branch is set: ${val}"
            break       

        default:
            println "Branch name was not set!"
            break
    }
}

def pattern = "(release|hotfix)\/(\d+\.)?(\d+\.)?(\*|\d+)"
showRelease('release/1.0.1', pattern)
showRelease('release/2.2.3', pattern)
showRelease('release.3.x', pattern)
showRelease('hotfix/3.0.2', pattern)

你可能会注意到输出:

branch is set: release/1.0.1
branch is set: release/2.2.3
Branch name was not set!
branch is set: hotfix/3.0.2

编辑: 根据 OP 的评论,添加固定模式片段:

switch(BRANCH_NAME) {
        case ~/(release|hotfix)\/(\d+\.)?(\d+\.)?(\*|\d+)/:
            BUILDFLAV = "Staging"
            BUILDTYPE = "Debug"
            ARTIFACT_NAME = "AutoCAD360-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"
            break
....
}