如何从Jenkinsfile加载第二个Jenkinsfile但继续使用原始工作区-多分支管道

时间:2018-07-10 19:25:04

标签: bash jenkins groovy jenkins-pipeline devops

我需要在构建时从基础项目中加载外部项目。 (我拥有两个代码库。)外部项目包含一个我需要从基础项目的Jenkinsfile执行的Jenkinsfile,以及其他需要运行的脚本。

但是,在项目中克隆后加载外部Jenkinsfile会导致使用新的WORKSPACE(在末尾附加@ 2,3,4等)。这个新的工作空间没有从原始工作空间中克隆外部项目的文件。

到目前为止,我的hacky解决方案是将外部Jenkinsfile中的WORKSPACE重置为原始工作空间。

environment {
    WORKSPACE = path/to/original/workspace
}

但是,这不适用于多分支作业,因为这些工作区的末尾有一组随机生成的字符。

我的想法是将工作空间作为不同的环境变量名称传递,并在第二个作业中将WORKSPACE设置为该名称。但是,withEnv似乎可以使用常规字符串,但不能使用变量。

到目前为止,这基本上是我正在做的事情,这是行不通的:

基本Jenkinsfile:

node {
 cleanWs()
 checkout scm
 checkout([$class: 'GitSCM', branches: [[name: 'branch-name']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'sub-dir']], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'creds', url: 'url']]])
  withEnv (['BASE_WORKSPACE=$WORKSPACE']) {
    load 'sub-dir/Jenkinsfile'
 }
}

克隆到Jenkinsfile中:

pipeline {
 agent any
 environment {
    WORKSPACE = env.BASE_WORKSPACE
 }
 stages {
     stage('Stage 1'){
         steps{
             sh '''
             $WORKSPACE/sub-dir/bash-script.sh
             '''
        }
     }
  }
}

我脑子里还有更多hacky解决方案

  • 从外部Jenkinsfile猜测基本工作区(在工作区名称末尾@减去1)

  • 将基本工作区写入基本Jenkinsfile中的文件,并在第二个Jenkinsfile中读取

  • 使用withEnv尝试不同的语法

但是在我深入研究杂草之前,我想接触这个很棒的社区,看看是否有人对此有想法。

谢谢!

2 个答案:

答案 0 :(得分:2)

  

但是,withEnv似乎可以使用常规字符串,但不能使用变量。

改为使用以下语法来扩展变量:

 withEnv(["BASE_WORKSPACE=${env.WORKSPACE}"]) {

答案 1 :(得分:1)

withEnv (['BASE_WORKSPACE=' + WORKSPACE]) {
     load 'sub-dir/Jenkinsfile'
 }

为我工作,尽管引号是bash,但在Jenkinsfile中其余部分仍然很普通。允许您连接字符串。