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 行中使用它。该开关正在使用正则表达式匹配。
我正在尝试将 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 行中使用它。该开关正在使用正则表达式匹配。