Groovy 用于比较字符串的 DSL

Groovy DSL to compare string

我正在尝试将 Job 动态加载到 Jenkins 中,有一个包含 Job Name 和 GHE 的文件 URL:

GHE 文件网址:

options A
https://github.com/I/A/build.groovy

options B
https://github.com/I/B/build.groovy

options C
https://github.com/I/C/build.groovy

使用下面的 bash 脚本我可以创建一个新的 Repo (A,B,C) 目录并在管道 scm 中使用 GHE URL,我如何在 groovy dsl:

while read -r line; do
    case "$line" in
        options*)
            jenkins_dir=$(echo "$line" | cut -d ' ')
            mkdir -p ${jenkins_dir}
            ;;
        http://github*)
            wget -N $line -P ${jenkins_dir}
            ;;
        *)
            echo "$line"
            ;;
    esac
done < jenkins-ghe.urls

Groovy DSL 版本:

def String[] loadJobURL(String basePath) {
    def url = []
    new File('/path/to/file').eachLine { line ->
    switch("$line") {            
         
        case "options*)":
            
        case "http://github*)":
           
}

有一些失败,不太确定语法 wrt groovy dsl,希望 dsl 脚本能够识别这两行。请建议,谢谢!

不完全确定你想在这里完成什么,但在 groovy 中进行解析和处理的一种方法是这样的:

new File('data.txt').readLines().inject(null) { last, line -> 
  switch(line.trim()) {
    case '':
      return last
    case ~/options.*/: 
      def dir = new File(line)
      if (!dir.mkdirs()) throw new RuntimeException("failed to create dir $dir")
      return dir
    case ~/http.*/:
      new File(last, 'data.txt').text = line.toURL().text
      return null
    default: throw new RuntimeException("invalid data at $line")
  }
}

其中,当 运行 针对如下所示的数据文件时:

options A
https://raw.githubusercontent.com/apache/groovy/master/build.gradle

options B
https://raw.githubusercontent.com/apache/groovy/master/benchmark/bench.groovy

options C
https://raw.githubusercontent.com/apache/groovy/master/buildSrc/build.gradle

创建以下目录结构:

─➤ tree
.
├── data.txt
├── options A
│   └── data.txt
├── options B
│   └── data.txt
├── options C
│   └── data.txt
└── solution.groovy

其中 data.txt 文件包含从相应的 url 加载的数据。

我正在使用稍微更高级的 inject construct 来使解析更加健壮,同时保持“功能”(即不恢复到 for 循环等)。如果不这样做,代码最终可能会更容易阅读,但这是我在仔细阅读 groovy collections/iterable/list 方法时能想到的最合适的方法。

Inject 遍历行,一次一行(其中 line 获取表示当前行的字符串),同时将上一次迭代的结果保留在 last 变量中。这很有用,因为我们可以保存在选项行中创建的目录,以便我们可以在 url 行中使用它。该开关正在使用正则表达式匹配。