【问题标题】:How to run jenkins pipeline relative to a sub-directory?如何相对于子目录运行詹金斯管道?
【发布时间】:2019-07-04 23:10:45
【问题描述】:

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

app-root
  - backend
  - frontend

我有一个声明式的 Jenkinsfile 来使用相关的 maven 命令构建我的后端模块。我想从 backend 目录中执行所有这些 maven 命令。

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

是否有任何其他选项可以指示 Jenkins 从子目录中执行整个管道?

【问题讨论】:

  • 您想为前端和后端设置两条独立的管道还是一条管道?
  • 是的。目前,我只有后端的管道,但我也会为前端创建一个单独的管道。

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


【解决方案1】:

我最终进入了一个“准备项目”阶段,将子目录内容放入根目录。

删除所有根内容(阶段“清理”)可能也是一个好主意,以绝对确保没有以前构建的剩余内容。

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'
        }
    }
}

【讨论】:

    【解决方案2】:

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

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

    pipeline {
       agent any
    
       stages {
            stage('build') {
                steps {
                     sh 'cd backend'
                     sh 'mvn clean package'
                 }
           }
    
        //other stages
       }
    
    }
    

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

    【讨论】:

    • 这是我提到的问题。每个命令都必须使用 dir("backend") 或 "cd module"。我正在考虑是否有任何配置,以便整个管道从目录内运行。
    • 不是每个命令都需要,只是第一次。还要明确你的问题,你只提到“dir 很丑”,而没有说真正的问题是什么。如果 cd 是问题,那么稀疏结帐是要走的路。
    • 我相信每个阶段都会在根文件夹的上下文中运行。因此,对于不同阶段的所有步骤,我们需要 cd 进入目录。
    • 是的,你是对的,所以如果dir 对你来说是个问题,我认为你将不得不使用稀疏结帐或分离 git 存储库。
    • 我和你一样使用类似sh 'cd backend'的命令,但是下面的命令还是没有到子目录,你知道为什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2019-01-09
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多