【问题标题】:Multi-branch configuration with externally-defined Jenkinsfile使用外部定义的 Jenkinsfile 进行多分支配置
【发布时间】:2020-02-13 04:45:02
【问题描述】:

我有一个开源项目,它位于 GitHub 中,使用由 Jenkins 控制的构建农场构建。

我想使用管道以分支方式构建它,但我不想将 Jenkinsfile 存储在代码中。有没有办法做到这一点?

【问题讨论】:

    标签: jenkins jenkins-pipeline


    【解决方案1】:

    我遇到了和你一样的问题。虽然将构建过程作为代码的一部分的想法很好,但Jenkinsfile 包含的信息不是项目构建本身固有的,而是特定于构建环境实例的信息,可能会发生变化。

    我做到这一点的方法是:

    1. 将核心构建过程封装在单个脚本中(build.pybuild.sh)。这可能会调用特定的构建工具,如 Make、CMake、Ant 等。

    2. 通过Jenkinsfile 告诉 Jenkins 调用在单个全局库中定义的函数

    3. 定义全局 Jenkins 构建函数以使用适当的环境设置调用构建脚本(例如 build.py)。例如,使用自定义工具和设置PATH

    所以对于第 2 步,在您的项目中创建一个 Jenkinsfile,其中只包含该行

    build_PROJECTNAME()
    

    其中PROJECTNAME 基于您的项目名称。

    然后使用Pipeline Shared Groovy Libraries Plugin 并在名为vars/build_PROJECTNAME.groovy 的共享库存储库中创建一个Groovy 脚本,其中包含设置环境和调用项目构建脚本的代码(例如build.py):

    def call() {
        node('linux') {
            stage("checkout") {
                checkout scm
            }
            stage("build") {
                withEnv([
                    "PATH+CMAKE=${tool 'CMake'}/bin",
                    "PATH+PYTHON=${tool 'Python-3'}",
                    "PATH+NINJA=${tool 'Ninja'}",
                ]) {
                    execute 'python build.py'
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      首先,您为什么不希望在您的代码中使用 Jenkinsfile?管道和构建文件一样是代码的一部分。

      除此之外,您可以加载 groovy 文件以作为管道脚本进行评估。您可以使用 from SCM 选项从不同位置执行此操作,然后签出实际代码。但这将迫使您手动处理分支构建。

      另一种选择是拥有一个非常基本的 Jenkinsfile,它只检查外部管道。

      你会得到这样的东西:

      node{
          deleteDir()
      
          git env.flowScm
          def flow = load 'pipeline.groovy'
          stash includes: '**', name: 'flowFiles'
      
          stage 'Checkout'
          checkout scm // short hand for checking out the "from scm repository"
      
          flow.runFlow()
      }
      

      pipeline.groovy 文件包含实际管道的位置如下所示:

      def runFlow() {
          // your pipeline code
      
      } 
      
      // Has to exit with 'return this;' in order to be used as library
      return this;
      

      【讨论】:

      • 我不希望它在开源项目中,因为构建脚本依赖于构建环境:它们包含工具的绝对路径,依赖于特定的操作系统/工具版本等等。它们在存储库中将完全没用。 CI 即代码非常适合专有产品,这些产品肯定会在企业环境中构建。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多