【问题标题】:Split Jenkins pipeline into environment part and stages part as a template将 Jenkins 管道拆分为环境部分和阶段部分作为模板
【发布时间】:2019-07-17 07:35:47
【问题描述】:

我们使用 Jenkins 服务器通过 Unity 和 Xcode 创建多个 iOS/Android 项目。目前,我们在项目存储库的每个根目录中都有一个 Jenkins 文件,整个配置和构建步骤都在一个文件中:

pipeline {
  agent any

  environment {
    REPOSITORY_URL = 'ssh://git@XYZ.git'
    PROJECT_SUBDIR = ''
    BUILD_FOR_ANDROID = 'true'
    BUILD_FOR_IOS = 'true'
    UNITY_VERSION = '2018.4.0f1'
  }

  // how to load this from a template file? -->
  stages {
    stage('Checkout') {
      steps {
        script {
          if (env.PROJECT_SUBDIR) {
            env.PROJECT_DIR = sh(
              script: "echo ${env.WORKSPACE}/${env.PROJECT_SUBDIR}",
              returnStdout: true
            ).trim()
          } else {
            env.PROJECT_DIR = sh(
              script: "echo ${env.WORKSPACE}",
              returnStdout: true
            ).trim()
          }
        }

        // more stuff ...

      }
    }
  }
  // <--
}

是否可以在构建过程中从另一个文件(例如模板)加载部分“阶段”?这会将依赖于项目的配置部分与常见的“阶段”部分分开,并且我可以在单个或版本化的模板文件中更新所有项目存储库的构建过程?

它如何与环境变量一起工作?它们仍然在相同的上下文中还是我必须通过它们?

【问题讨论】:

标签: xcode unity3d jenkins continuous-integration jenkins-pipeline


【解决方案1】:

这是一个很好的建议。

我使用本页提到的最后一种方法来管理它:

https://jenkins.io/doc/book/pipeline/shared-libraries/#defining-declarative-pipelines

所以我将我的管道复制到我的 groovy 文件中,称为

/vars/run_pipeline_template.groovy

在我的新存储库中。在此之前,我将其称为 pipeline.groovy,这不是我最好的主意,因为这是一个受保护的关键字。我将环境变量的定义留在了以前的 Jenkinsfile 中。 env.VAR_NAME 仍然可以访问它们,而无需将它们转发到库脚本。该库位于其自己的 Git 存储库中,我将此库添加到 Global Pipeline Libraries 部分的 Jenkins 配置中。而且这样也解决了版本问题,因为在Jenkinsfile中导入库模板时可以定义使用哪个branch/tag/hash。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2011-05-30
    • 2018-01-06
    相关资源
    最近更新 更多