如何相对于子目录运行詹金斯管道?

Posted

技术标签:

【中文标题】如何相对于子目录运行詹金斯管道?【英文标题】: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 从子目录中执行整个管道?

【问题讨论】:

您想为前端和后端设置两条独立的管道还是一条管道? 是的。目前,我只有后端的管道,但我也会为前端创建一个单独的管道。 【参考方案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'的命令,但是下面的命令还是没有到子目录,你知道为什么吗?

以上是关于如何相对于子目录运行詹金斯管道?的主要内容,如果未能解决你的问题,请参考以下文章

如何在詹金斯管道中创建一个以日期戳作为文件名的目录?

检查詹金斯管道中是不是存在文件

Jenkins管道脚本的开发过程应该如何?

詹金斯管道中的条件步骤/阶段

詹金斯从工件加载文件时出错

为啥我无法在 Windows 10 中运行的詹金斯管道中运行批处理文件?