Jenkins 使用多分支工作流清理构建

Jenkins 使用多分支工作流清理构建,jenkins,jenkins-workflow,Jenkins,Jenkins Workflow,使用多分支工作流,签出命令如下所示 checkout scm 我找不到办法让詹金斯进行一次干净的结账。所谓“清理”,我的意思是它应该从工作区中删除所有不受版本控制的文件。首先,您不能假设工作流作业有一个与自由式作业相同的工作区。实际上,工作流作业可以使用多个工作区(每个节点或ws块对应一个工作区) 话虽如此,我要提出的是一种黑客行为:在签出之前修改scm对象,以设置CleanCheckout扩展(您必须在那里批准一些调用) 但是我更喜欢Christopher Orr的建议,在签出之后使用she

使用多分支工作流,签出命令如下所示

checkout scm

我找不到办法让詹金斯进行一次干净的结账。所谓“清理”,我的意思是它应该从工作区中删除所有不受版本控制的文件。

首先,您不能假设工作流作业有一个与自由式作业相同的工作区。实际上,工作流作业可以使用多个工作区(每个
节点或
ws
块对应一个工作区)

话虽如此,我要提出的是一种黑客行为:在签出之前修改scm对象,以设置
CleanCheckout
扩展(您必须在那里批准一些调用)


但是我更喜欢Christopher Orr的建议,在
签出之后使用shell步骤(
sh'git clean-fdx'
)。

Jenkins当前包含一个生成groovy管道语法的页面。选择签出步骤,您应该能够添加所有您习惯的附加选项

我生成了以下内容,这些内容应满足您的要求:

checkout poll: false, scm: [$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CleanBeforeCheckout']], submoduleCfg: [], userRemoteConfigs: [[url: 'ssh://repo/location.git']]]

我遇到了同样的问题,这里是我的解决方法。 我为签出创建了一个新的scm对象,并使用CleanBeforeCheckout扩展了扩展。但我保留了其他配置,如分支和UserRemoteConfig

checkout([
    $class: 'GitSCM',
    branches: scm.branches,
    extensions: scm.extensions + [[$class: 'CleanBeforeCheckout']],
    userRemoteConfigs: scm.userRemoteConfigs
])

它仍然不是完美的,因为您必须创建一个新对象:(

我不确定这是否回答了最初的问题(我不知道是否打算在工作区中保留一些文件),但为什么不先删除工作区,这将允许干净的签出:

stage ('Clean') {
    deleteDir()
}

stage ('Checkout') {
    checkout scm 
}

配置源代码时可以添加行为。
签出前清理
签出后清理
清除存储库并强制克隆
。这样就不需要向声明性/脚本化管道添加逻辑。

添加的注释作为只需执行以下操作的答案:

stage('Checkout') {
  checkout scm
  sh 'git clean -fdx'
}

我不知道
checkout
是否可以在multibranch中获取更多参数。我想有一个更优雅的解决方案,但是如果您使用Git,您应该能够在
checkout
步骤后运行
sh'Git clean-fdx'
。谢谢。这两个建议的问题是,它只适用于Gitalents适用于大多数SCM实现。例如,对于subversion,您可以使用
SCM.setWorkspaceUpdater(new UpdateWithCleanUpdater())
在哪里可以找到关于这些内容的文档?(我使用的是Hg。)没有相关文档,它们是低级细节,您必须检查源代码才能获得。对于多分支管道来说,这基本上是不正确的,因为您已经创建了
scm
对象。添加新的
checkout
步骤会将另一个
scm
对象添加到构建中,并且它具有side ef缺陷(如生成页面中重复的变更日志条目)。此答案仅适用于普通管道作业,但不适用于多分支管道作业。这应该是正确的答案。当您只想进行git清理时,删除完整目录并不总是合适的。我们是否直接将其添加到Jenkins文件中?是的,添加到任何管道脚本中。这是2年前的事了,但我认为这仍然有效:)很遗憾,脚本需要获得批准才能访问
SCM
参数。这可能只发生在主分支上,而不是代理上。值得注意的是,您可以在签出后执行
sh'git clean-fdx'
,而不是按照@christopher orr的建议删除所有内容
stage('Checkout') {
  checkout scm
  sh 'git clean -fdx'
}