如何在Bash或Groovy中识别在最近的git合并中被修改的文件的路径,或者在Jenkinsfile中有其他方法可以做到这一点?每个合并事件都会触发Jenkins作业。有一个阶段应该只在最近的合并包括一个具有任意名称的新文件时触发,例如:文件夹中的new-file.yaml:
new-file.yaml
foo/env/<name-of-environment>/
或者该文件夹中已经存在的文件是否被修改。
pbpqsu0x1#
要获取任何两次提交之间更改的文件列表,可以使用:
git diff <commit1> <commit2> --name-only
对于合并提交,合并提交的ID将是<commit2>,其父提交的一个提交ID将是<commit1>。大多数情况下,它将是合并提交的第一个父提交。因此,例如,如果合并提交是提交X,则差异将是:
<commit2>
<commit1>
X
git diff X~1 X --name-only
对于新提交出现时特定分支上的触发器,您可以使用HEAD或@(在大多数shell中,包括bash),因此一般语法为:
HEAD
@
git diff @~1 @ --name-only
然后,您可以解析所需文件的输出:
git diff @~1 @ --name-only | grep foo/env/test/
1.如果在没有合并提交的情况下,分支上可能出现多个提交,那么这种检查将无法完美地工作。例如,假设3个新的线性提交可以用快进合并合并;在这种情况下,区分@~1 @只会显示最上面的提交中的更改,而不是所有3个。如果可能的话,您可能需要保存您执行检查的最后一个提交ID,并将其用作commit1。如果你在合并到目标分支时总是使用--no-ff,它总是会强制合并提交,你就不会有这个问题。1.上面我说过"大多数时候它会是合并提交的第一个父分支"。它可能是第二个父分支的情况是,如果有人将目标分支合并到源分支中,然后将源分支快速合并回目标分支。这将翻转合并提交的父提交,通常会引起不满,但我提到它是因为它是一个常见的问题。1.一些工具将默认的Pull Request合并策略设置为总是强制合并提交,以避免第1和第2节中描述的问题。
@~1 @
--no-ff
qpgpyjmq2#
在Jenkins中,你可以使用内置的changeset条件:默认情况下,它接受一个glob作为参数。例如:
changeset
stage('A conditional stage') { when { changeset 'foo/env/test/*' } steps { echo 'There was a change in that directory' } }
2条答案
按热度按时间pbpqsu0x1#
要获取任何两次提交之间更改的文件列表,可以使用:
对于合并提交,合并提交的ID将是
<commit2>
,其父提交的一个提交ID将是<commit1>
。大多数情况下,它将是合并提交的第一个父提交。因此,例如,如果合并提交是提交X
,则差异将是:对于新提交出现时特定分支上的触发器,您可以使用
HEAD
或@
(在大多数shell中,包括bash),因此一般语法为:然后,您可以解析所需文件的输出:
1.如果在没有合并提交的情况下,分支上可能出现多个提交,那么这种检查将无法完美地工作。例如,假设3个新的线性提交可以用快进合并合并;在这种情况下,区分
@~1 @
只会显示最上面的提交中的更改,而不是所有3个。如果可能的话,您可能需要保存您执行检查的最后一个提交ID,并将其用作commit1。如果你在合并到目标分支时总是使用--no-ff
,它总是会强制合并提交,你就不会有这个问题。1.上面我说过"大多数时候它会是合并提交的第一个父分支"。它可能是第二个父分支的情况是,如果有人将目标分支合并到源分支中,然后将源分支快速合并回目标分支。这将翻转合并提交的父提交,通常会引起不满,但我提到它是因为它是一个常见的问题。
1.一些工具将默认的Pull Request合并策略设置为总是强制合并提交,以避免第1和第2节中描述的问题。
qpgpyjmq2#
在Jenkins中,你可以使用内置的
changeset
条件:默认情况下,它接受一个glob作为参数。例如: