Jenkins流水线中如何在作业开始前清理工作区

18

在构建开始之前,我需要清空工作区。我尝试在stages中使用cleanDir(),但是在声明性管道中,检出会首先发生,当带有cleadDir的阶段运行时,检出的代码也会被清除,这不是所期望的。如何在声明性管道中在检出之前清空工作区?

6个回答

19

实际上,根据管道插件的最新更改(例如具有JENKINS-43507的GitHub分支源插件2.2.0),我必须修改我的答案。

除了可以配置的不同分支发现行为外,现在还可以定义其他要执行的步骤,包括检出前清理(以及检出后清理):

enter image description here

在管道执行中产生的输出将会是:
Cleaning workspace
  > git rev-parse --verify HEAD # timeout=10
Resetting working tree
 > git reset --hard # timeout=10
 > git clean -fdx # timeout=10

因此,与自己调用git clean非常接近。


我在更新后注意到了这个选项。如果我们有一个多管道作业,可能不需要删除所有分支。在这种情况下,git clean 会更容易一些。 - rashidcmb
我希望能有一种方法来删除这里的.git文件夹。它有点损坏了,而且在git reset hard这里卡住了。 - Martin Kosicky
@MartinKosicky 只需添加一步 sh('rm -rf .git/') - StephenKing
我指的是管道拉取阶段,而不是管道的执行。 - Martin Kosicky

15
stage('Git') {
            steps {
                step([$class: 'WsCleanup'])
                checkout scm
            }
        }

WsCleanup可以解决这个问题。


2
这将从当前目录中删除工作区目录,并可能导致“error retrieving current directory: getcwd: cannot access parent directories: No such file or directory”的错误。最好在分配工作区后的第一阶段的第一步使用sh 'rm -rf *' - scrutari
1
调用 sh 'rm -rf *' 非常危险,因为你可能不在你认为的目录中 - 如果你在 / 目录下,你很可能刚刚删除了你的操作系统。 - NoobSkywalker

8
使用你的版本控制系统(VCS)工具,使用Git运行。
git clean -fdx

这比我看到的所有其他解决方案都简单得多,并且它还在输出中显示了清除的文件。 - Billy Moon
现在你可以使用[$class: 'CleanCheckout']。这将执行git clean操作。 - MKK
我猜这就是我在2017年9月13日6:03发布的那篇文章中提到的管道方式,对吧? - StephenKing

1
在SCM配置的附加行为中添加清除存储库和强制克隆,如下图所示:

enter image description here


这是唯一一个同时删除可能损坏的 .git 文件夹和任何已注册有错误 URL 的子模块等的答案。 - nattgris

0

类似这样的代码应该可以正常工作:

            env.WORKSPACE = pwd()
            sh "rm ${env.WORKSPACE}/* -fr"

1
当从步骤中调用时,这也会删除已检出的代码。 - rashidcmb
这将删除整个工作区,就像您要求的那样。我有一份工作,在检查代码之前就要这样做,所以对我来说有点合理。 - Frankenstein
1
在检查代码之前,您是否会在管道的下一步中检出代码? - rashidcmb

0
一个稍微不同的方法是使用 stash step 先将您的代码存储起来:
stash includes: 'src/**', name: 'source-code'

之后,您可以删除当前工作区中的所有内容。在稍后的阶段,您可以简单地unstash源代码:

unstash 'source-code'

stash/unstash 的另一个优点是可以在多个 Jenkins 节点之间共享文件。


看起来@StephenKing的答案是最简单的方法。一次性就可以运行,已经放入实际项目并检查了影响。 - rashidcmb
同意。git clean是解决这个问题的一个非常好的方法。不过,无论如何,值得分享的是存储/恢复方法,在多个从节点环境下运行时非常方便。 - fishi0x01
@StephenKing 嗯,我的版本控制里很少有大量的代码。如果是这种情况,在Jenkins中检出就会很痛苦。另外,在节点之间共享代码有更有效的选项吗? - fishi0x01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接