如何相对于子目录运行jenkins管道?

时间:2019-02-11 12:42:31

标签: java maven spring-boot jenkins jenkins-pipeline

我有一个git存储库,其中包含2个模块。一个是基于SpringBoot的后端模块,另一个是基于VueJS的前端模块。

app-root
  - backend
  - frontend

我具有声明性样式的Jenkinsfile,可以使用相关的maven命令构建后端模块。我想从后端目录内执行所有这些Maven命令。

一种选择是对所有命令分别使用dir("backend") { ....},这对我来说很难看。

还有其他选项可以指示Jenkins从子目录内部执行整个管道吗?

2 个答案:

答案 0 :(得分:0)

您可以在后端和前端模块中包含jenkinsfile,并在每个管道上指向它们,例如:

enter image description here

,在管道本身上,您只需cd到子模块并执行其命令:

pipeline {
   agent any

   stages {
        stage('build') {
            steps {
                 sh 'cd backend'
                 sh 'mvn clean package'
             }
       }

    //other stages
   }

}

如果您不想cd到子模块,则可以使用sparse checkouts,但是在这种情况下,您必须相应地更改jenkinsfile的路径,因为它将位于根文件夹中。

答案 1 :(得分:0)

最后我进入了“准备项目”阶段,该阶段将子目录的内容放到根目录中。

删除所有根目录内容(阶段“ clean”)也是一个好主意,以确保绝对没有以前版本的剩余物。

node {
    def dockerImage

    stage('clean') {
      sh "rm -rf *"
    }

    stage('checkout') {
        checkout scm
    }

    // need to have only 'backend' subdir content on the root level
    stage('prepare project') {
        // The -a option is an improved recursive option, that preserve all file attributes, and also preserve symlinks.
        // The . at end of the source path is a specific cp syntax that allow to copy all files and folders, included hidden ones.
        sh "cp -a ./backend/. ."
        sh "rm -rf ./backend"
        // List the final content
        sh "ls -la"
    }

    stage('build docker image') {
        dockerImage = docker.build("docker-image-name")
    }

    stage('publish docker image') {
        docker.withRegistry('https://my-private-nexus.com', 'some-jenkins-credentials-id') {
            dockerImage.push 'latest'
        }
    }
}