使用Git中的代码运行Jenkins管道

时间:2017-09-18 11:12:38

标签: git jenkins groovy jenkins-plugins jenkins-pipeline

我想在jenkins

中使用git中的以下Pipeline脚本
#!groovy
pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

我设置了Repository URL,在“Additional Behaviors”下添加了“Check out to a sub directory”并在那里写了我的子目录。

在“Script-Path”中我写道:mysubdirectory / Jenkinsfile

当我尝试运行它时,我得到以下错误:

java.io.FileNotFoundException
    at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.java:167)
    at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.java:159)
    at jenkins.plugins.git.GitSCMFileSystem$3.invoke(GitSCMFileSystem.java:162)
    at org.jenkinsci.plugins.gitclient.AbstractGitAPIImpl.withRepository(AbstractGitAPIImpl.java:29)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.withRepository(CliGitAPIImpl.java:71)
    at jenkins.plugins.git.GitSCMFileSystem.invoke(GitSCMFileSystem.java:158)
    at jenkins.plugins.git.GitSCMFile.content(GitSCMFile.java:159)
    at jenkins.scm.api.SCMFile.contentAsString(SCMFile.java:338)
    at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.java:101)
    at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.java:59)
    at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:262)
    at hudson.model.ResourceController.execute(ResourceController.java:97)
    at hudson.model.Executor.run(Executor.java:415)
Finished: FAILURE

我做错了什么?

如何正确运行git中的Jenkins脚本?

6 个答案:

答案 0 :(得分:22)

要从Git repo成功运行Jenkinsfile Jenkinsfile应该在主目录路径中可用,但不在子目录中。 例如:

.
├── .setting
├── project
└── Jenkinsfile

Jenkinsfile不应该在子目录中。

答案 1 :(得分:5)

Jenkins在查找管道脚本时会进行2次检查。使用git,第一个通常是轻量级结账,只能获取Jenkins文件,而不是整个回购,但它是2个单独的结账。第二个结账是运行Jenkinsfile的真实结账。

它执行2次检查的原因是因为它必须首先查看Jenkins文件以查看您要执行的操作并验证语法等。如果您在脚本中跳过SCM签出,以便稍后执行此操作或者不同的是,它需要知道不要进行“真正的”结账。就此而言,理论上你可以从一个仓库中取出你的Jenkins文件,跳过SCM结账,然后拉出一个完全不同的仓库(或分支或标签)并针对它进行构建,但是使用第一个结账时的Jenkins文件。

因此,通过告诉Jenkins查看Jenkinsfile的子目录,您告诉它在原始检出中的某个地方查找实际上不存在的内容,因为您的Jenkins文件实际上位于您的git仓库的根目录中。

当第二个签出完成到子目录中时,您需要在Jenkins文件中考虑这一点,因为Jenkinsfile从工作区的根目录运行。您需要设置目录,即dir(“mysubdirectory”){},以查找构建文件等。

答案 2 :(得分:1)

尝试从Sript路径中省略您的子目录。

当您指定克隆项目的子目录时,Jenkins会搜索该目录中的管道文件。在你的情况下,Jenkins正在" mysubdirectory / mysubdirectory / Jenkinsfile"

中寻找Jenkins文件。

答案 3 :(得分:1)

我遇到了同样的错误。通过在作业配置中禁用Lightweight checkout,错误得以解决!

答案 4 :(得分:0)

我遇到了类似的问题,但在我的情况下,命名不匹配是Git中的分支。在管道设置中,我在repo中以大写形式指定分支名称,分支名称为小写。 (显然不是原始问题的解决方案,但可能对其他一些可怜的灵魂有用!)

答案 5 :(得分:0)

复制管道作业时,我遇到了类似的问题。

已解决: 从复制的管道作业中删除管道scm部分。保存更改。建立一个空的回合。然后再次创建管道scm块。