Argo 事件:使用传感器中的数据过滤器来识别 mono-repo 中的 modified/added/removed 路径
Argo Events: Use data filter in sensor to identify modified/added/removed path in mono-repo
我正在为我的 CI/CD 链使用 Argo Events 和 Argo Workflow,它们工作得非常好。但是我在为我的单声道存储库的 GitHub webhook 有效载荷 设置 数据过滤器 时遇到了一些麻烦。
我试图让传感器仅在某个子路径中的文件发生更改时才触发定义的工作流程。载荷包含三个字段 added、removed、modified。此处列出了在此提交中更改的文件 (webhook-events-and-payloads#push)。
我正在搜索的路径是 service/jobs/*
和 service/common*/*
。
我定义的过滤器是:
- path: "[commits.#.modified.#(%\"*service*\")#,commits.#.added.#(%\"*service*\")#,commits.#.removed.#(%\"*service*\")#]"
type: string
value:
- "(\bservice/jobs\b)|(\bservice/common*)"
我在一个很小的 Go 脚本中验证了我的过滤器,因为 Argo Events 使用 gjson 来应用数据过滤器。
package main
import (
"github.com/tidwall/gjson"
"regexp"
)
const json = `{
"commits": [
{
"added": [
],
"removed": [
],
"modified": [
"service/job-manager/README.md"
]
},
{
"added": [
],
"removed": [
"service/joby/something.md"
],
"modified": [
"service/job-manager/something.md"
]
},
{
"added": [
],
"removed": [
"service/joby/something.md"
],
"modified": [
"service/joby/someother.md"
]
}
],
"head_commit": {
"added": [
"service/job-manager/something.md"
],
"removed": [
"service/joby/something.md"
],
"modified": [
"service/job-manager/README.md"
]
}
}`
func main() {
value := gjson.Get(json, "[commits.#.modified.#(%\"*service*\")#,commits.#.added.#(%\"*service*\")#,commits.#.removed.#(%\"*service*\")#]")
println(value.String())
matched, _ := regexp.MatchString(`(\bservice/job-manager\b)|(\bservice/common*)`, value.String())
println(matched) // string is contained?
}
脚本给了我预期的结果。但是对于相同的 webhook 负载,在将数据过滤器添加到传感器时,不会触发工作流。
有人有什么想法吗?
更新:
感谢您的提示,包括。 body.
在路径中。
我最终设置了过滤器:
- path: "[body.commits.#.modified.#()#,body.commits.#.added.#()#,body.commits.#.removed.#()#]"
type: string
value:
- ".*service/jobs.*"
- ".*service/common.*"
- 路径应以
body.
开头
- 值应使用
\
添加转义特殊字符
所以数据过滤器应该是
- path: "[body.commits.#.modified.#(%\"*service*\")#,body.commits.#.added.#(%\"*service*\")#,body.commits.#.removed.#(%\"*service*\")#]"
type: string
value:
- "(\bservice/jobs\b)|(\bservice/common*)"
我正在为我的 CI/CD 链使用 Argo Events 和 Argo Workflow,它们工作得非常好。但是我在为我的单声道存储库的 GitHub webhook 有效载荷 设置 数据过滤器 时遇到了一些麻烦。
我试图让传感器仅在某个子路径中的文件发生更改时才触发定义的工作流程。载荷包含三个字段 added、removed、modified。此处列出了在此提交中更改的文件 (webhook-events-and-payloads#push)。
我正在搜索的路径是 service/jobs/*
和 service/common*/*
。
我定义的过滤器是:
- path: "[commits.#.modified.#(%\"*service*\")#,commits.#.added.#(%\"*service*\")#,commits.#.removed.#(%\"*service*\")#]"
type: string
value:
- "(\bservice/jobs\b)|(\bservice/common*)"
我在一个很小的 Go 脚本中验证了我的过滤器,因为 Argo Events 使用 gjson 来应用数据过滤器。
package main
import (
"github.com/tidwall/gjson"
"regexp"
)
const json = `{
"commits": [
{
"added": [
],
"removed": [
],
"modified": [
"service/job-manager/README.md"
]
},
{
"added": [
],
"removed": [
"service/joby/something.md"
],
"modified": [
"service/job-manager/something.md"
]
},
{
"added": [
],
"removed": [
"service/joby/something.md"
],
"modified": [
"service/joby/someother.md"
]
}
],
"head_commit": {
"added": [
"service/job-manager/something.md"
],
"removed": [
"service/joby/something.md"
],
"modified": [
"service/job-manager/README.md"
]
}
}`
func main() {
value := gjson.Get(json, "[commits.#.modified.#(%\"*service*\")#,commits.#.added.#(%\"*service*\")#,commits.#.removed.#(%\"*service*\")#]")
println(value.String())
matched, _ := regexp.MatchString(`(\bservice/job-manager\b)|(\bservice/common*)`, value.String())
println(matched) // string is contained?
}
脚本给了我预期的结果。但是对于相同的 webhook 负载,在将数据过滤器添加到传感器时,不会触发工作流。
有人有什么想法吗?
更新:
感谢您的提示,包括。 body.
在路径中。
我最终设置了过滤器:
- path: "[body.commits.#.modified.#()#,body.commits.#.added.#()#,body.commits.#.removed.#()#]"
type: string
value:
- ".*service/jobs.*"
- ".*service/common.*"
- 路径应以
body.
开头
- 值应使用
\
添加转义特殊字符
所以数据过滤器应该是
- path: "[body.commits.#.modified.#(%\"*service*\")#,body.commits.#.added.#(%\"*service*\")#,body.commits.#.removed.#(%\"*service*\")#]"
type: string
value:
- "(\bservice/jobs\b)|(\bservice/common*)"