SCM的Jenkins管道->始终完成重建

时间:2019-01-08 11:23:33

标签: git jenkins groovy build jenkins-pipeline

对于我们的jenkins构建服务器,我使用了到目前为止仅在jenkins中使用的管道脚本。现在,我将管道脚本移到了git服务器上。

jenkins项目和您的应用程序都可以很好地构建,但是:在将管道转移到git之前,C ++应用程序的构建是“增量式”的,因此仅构建了新的更改。因此,手动触发的构建非常快。

现在有了git中的管道,jenkins / msbuild总是可以完全重建,但是我不明白为什么。完全重建大约需要30分钟。

以下是我对管道的简称代码。

有人有观察到这种行为吗?还是知道为什么msbuild意味着它必须进行完整的重建?

预先感谢, 乔纳斯(Jonas)

import grails.plugin.springsecurity.SpringSecurityService
import grails.test.mixin.TestFor
import org.springframework.security.authentication.AccountExpiredException
import org.springframework.security.authentication.CredentialsExpiredException
import org.springframework.security.authentication.DisabledException
import org.springframework.security.web.WebAttributes
import spock.lang.Specification

@TestFor(YourController)
class YourControllerSpec extends Specification {

def springSecurityService = Mock( SpringSecurityService )

void setup() {
    controller.springSecurityService = springSecurityService
}

void "test authFail"() {
    given:
        session."${WebAttributes.AUTHENTICATION_EXCEPTION}" = new AccountExpiredException( 'This account has expired' )
    when:
        controller.authfail()
    then:
        flash.message == 'springSecurity.errors.login.expired'
    when:
        session."${WebAttributes.AUTHENTICATION_EXCEPTION}" = new CredentialsExpiredException( 'This credentials have expired' )
        controller.authfail()
    then:
        flash.message == 'springSecurity.errors.login.passwordExpired'
    when:
        session."${WebAttributes.AUTHENTICATION_EXCEPTION}" = new DisabledException( 'The account is disabled' )
        controller.authfail()
    then:
        flash.message == 'springSecurity.errors.login.disabled'
    when:
        session."${WebAttributes.AUTHENTICATION_EXCEPTION}" = new UnsupportedOperationException( 'Bad stuff' )
        controller.authfail()
    then:
        flash.message == 'springSecurity.errors.login.fail'
    when:
        controller.authfail()
    then:
        1 * springSecurityService.isAjax( _ ) >> true
        response.json == [error :'springSecurity.errors.login.fail']
}
}

1 个答案:

答案 0 :(得分:0)

这个问题已经存在一年了,但是我想分享我们的调查结果,因为我们偶然发现了相同的问题,并在Jenkins v.235.2上观察了以下内容。

在代理上执行的第一个命令是“来自SCM的管道”,可见的阶段是管道阶段概述中的“声明性SCM签出”。因此,此命令会将包含管道指令的Jenkins文件下载到代理上相应的Jenkins工作区。通过执行此命令并下载Jenkins文件,它会在代理的作业根工作区中创建一个“ .git”文件夹(例如C:\ jenkins \ workspace \ jobA \ .git)。由于您现在获取源代码,以便将软件构建到相同的工作区位置,因此“ .git”文件夹本身将被覆盖/替换。删除“ .git”文件夹的元数据将导致新的干净获取和软件构建。同样,这也会导致Git本身发生一些奇怪的行为。

根据我们的调查,您有两种方法可以解决此问题(也许还有更多选择,但这对我们有所帮助)。

  1. 保留作业根工作区以获取Jenkins文件,并将源代码下载到另一个文件夹中,例如dir('src') { git clone ... }

或可能性两种,我们现在在管道中已经实现。

  1. Jenkins Documentation中提到:

skipDefaultCheckout 默认情况下,在agent指令中跳过从源代码管理中签出代码。例如:options {skipDefaultCheckout()}

此命令将阻止在代理上下载Jenkins文件,而是在Jenkins主文件本身上签出。