当前位置: 首页 > 知识库问答 >
问题:

如何从自定义Jenkins管道调用存储库的Jenkins文件阶段?

齐驰
2023-03-14

我正在尝试创建一个定制的Jenkins管道,它将多个Jenkins作业生成的工件绑定在一起。每个作业都在不同的存储库上运行(基于它们自己的文件)。这些Jenkins文件的阶段完成了创建档案、编译代码等任务。

有人可能会说,我可以使用单个作业中的工件,然后将它们绑定在一起,但问题是这个高级管道将在特定的git标记上签出这些存储库,生成一些文件签名,编译发布应用程序版本,等等。

为了给您一个简单的想法,这是我的一个Jenkins文件的一部分,假设来自组件a存储库:

pipeline {
  agent any
  stages {
    stage('Cleanup library') {
      steps {
        sh 'rm -rf .git .gitignore .gitmodules Jenkinsfile .some_useless_files'
      }
    }
    stage('Pack library') {
      steps {
        sh 'tar -czf my_arch.tar.gz ./*'
      }
    }
    stage('Save artifacts') {
      steps {
        archiveArtifacts 'my_arch.tar.gz'
      }
    }
  }
}

这是主要管道:

node {
    dir('compA') {
        git url: 'git@some.path.com:my_lib/componentA.git'
        sh('git checkout $compA_rv')
        load 'Jenkinsfile'
    }
    // some other stuff
    //...
}

输出:

+ git checkout compA_rv
Note: checking out 'compA_rv'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 5a840d0... Some commit
[Pipeline] load
[Pipeline] { (Jenkinsfile)
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/apk-release@2
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Cleanup library)
[Pipeline] sh
+ rm -rf .git .gitignore .gitmodules Jenkinsfile .some_useless_files
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Pack library)
[Pipeline] sh
+ tar -czf my_arch.tar.gz ./my_arch.tar.gz
tar: ./my_arch.tar.gz: File shrank by 448 bytes; padding with zeros
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Save artifacts)
Stage "Save artifacts" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // load
[Pipeline] }
[Pipeline] // dir
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE

这个管道似乎加载了Jenkins文件并在另一个目录中执行它,该目录运行在/var/Jenkins_home/workspace/apk中的Jenkins上-release@2,因此它无法凭空创建存档。

由于我是詹金斯管道公司的新手,您对如何解决这个问题有什么建议吗?

最好的问候

共有1个答案

张逸清
2023-03-14

我认为您可以完全切换到管道并使用自定义工作区

pipeline {
  agent {
    node {
      label 'my-defined-label'
      customWorkspace '/some/other/path'
    }
  }
  stages {
    stage('Example Build') {
      steps {
        sh 'mvn -B clean verify'
      }
    }
  }
}
 类似资料:
  • 我有一个定制的Nexus,用于与项目相关的实用程序jar。我有一个詹金斯来做这些罐子。 我想在项目中使用gradle和Jenkins文件来定义管道。作为最后一个阶段,我希望构建工作将工件部署到我的Nexus。 由于我不希望Nexus的凭据出现在我的源存储库中(因此gradle脚本和Jenkins文件中都不需要),我在Jenkins凭据插件中设置了一个凭据条目,其中包含Nexus的用户和密码。 如何

  • 目前,我们使用JJB编译Jenkins作业(大部分已经是管道),以便配置大约700个作业,但JJB2似乎无法很好地扩展以构建管道,我正在寻找一种方法将其从等式中删除。 我主要希望能够将所有这些管道存储在一个集中的存储库中。 请注意,在我们的用例中,将CI配置(jenkins文件)保存在每个存储库和分支中是不可能的,我们需要将所有管道保存在一个“jenkins jobs.git”repo中。

  • 所以我正在尝试为几个不同的项目制作一个多分支管道。 这些是基本要求: < li >每个客户有三项工作开发、准备和生产 < li >对于每个作业,从每个回购中提取相应的分支,并构建一个bot < li >如果作业正在使用的存储库中发生任何变化,则触发该环境的构建 所以这些要求非常简单。 但是还有第四个要求。我想弄清楚的是,我是否可以有一个回购,它可以保存我所有的Jenkins文件,然后构建另一个回购

  • 我想从管道调用下一个共享库: [链接]https://github.com/docker/jenkins-pipeline-scripts/blob/master/vars/wrappedNode.groovy 我不知道如何调用和填充来自Jenkins 2管道的vars映射和body闭包。 我的共享库名称是“vars/My_shared_library.groovy”,它们的内容是 文件内容为:

  • 问题内容: 我正在尝试创建一个声明性的Jenkins管道脚本,但是简单变量声明存在问题。 这是我的脚本: 但是,我收到此错误: 我正在使用Jenkins 2.7.4和Pipeline 2.4。 问题答案: Jenkins Pipelines的Declarative模型具有受限制的语法子集,该子句允许在块中使用- 有关更多信息,请参见语法指南。您可以通过将步骤包装在一个块中来绕过该限制,但是结果,您

  • 我试图创建一个声明性詹金斯管道脚本,但有简单的变量声明问题。 以下是我的剧本: 然而,我得到了这个错误: 我在詹金斯2.7.4和管道2.4上。