如何相对于子目录运行詹金斯管道?
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'的命令,但是下面的命令还是没有到子目录,你知道为什么吗?以上是关于如何相对于子目录运行詹金斯管道?的主要内容,如果未能解决你的问题,请参考以下文章