跨多个Docker镜像的Jenkins Pipeline

4
使用Jenkins中的声明式流水线,我如何在多个版本的Docker镜像上运行阶段。我想在Python 2.7、3.5和3.6上执行以下Jenkinsfile。下面是一个构建和测试Python项目的Docker容器的管道文件。
pipeline {
  agent {
    docker {
      image 'python:2.7.14'
    }
  }

  stages {
    stage('Build') {
      steps {
        sh 'pip install pipenv'
        sh 'pipenv install --dev'
      }
    }

    stage('Test') {
      steps {
        sh 'pipenv run pytest --junitxml=TestResults.xml'
      }
    }
  }

  post {
    always {
      junit 'TestResults.xml'
    }
  }
}

什么是确保在Python 3.5和3.6上执行相同步骤的最小代码量?希望如果测试失败,可以明确知道哪个版本出了问题。
或者说对于声明式流水线而言,我的要求是不可能实现的吗?(例如,脚本化流水线可能是最优雅地解决此问题的方法)
相比之下,Travis CI是如何让你指定在不同的Python版本中运行的
1个回答

7

我不得不采用脚本化管道并结合所有阶段。

def pythons = ["2.7.14", "3.5.4", "3.6.2"]

def steps = pythons.collectEntries {
    ["python $it": job(it)]
}

parallel steps

def job(version) {
    return {
        docker.image("python:${version}").inside {
            checkout scm
            sh 'pip install pipenv'
            sh 'pipenv install --dev'
            sh 'pipenv run pytest --junitxml=TestResults.xml'
            junit 'TestResults.xml'
        }
    }
}

生成的管道如下所示。

enter image description here

理想情况下,我们希望能将每个工作分成不同的阶段(设置、构建、测试),但是UI 目前不支持此功能 (仍未支持)。

这方面有任何更新吗?我需要处理多个阶段,仍在寻找一种使用声明性Pipeline来优雅地完成此操作的方法... - tamasgal
不好意思,看起来提到的问题(JENKINS-38442)仍未解决。 - Nick Babcock
1
很不幸,我对这种方法有严重的问题。看起来各个阶段之间并没有隔离...在更复杂的设置(不同的阶段等)中,我会从Git和pip进程中得到随机的锁定文件错误报告。如果我为每个虚拟环境创建一个单独的文件夹,它就会完全失败(pip尝试安装在/usr/local...并因权限错误而崩溃)。非常奇怪!请参见我的gist:https://gist.github.com/tamasgal/e31c59c56a2c6fdb59adf785617f18c7 - tamasgal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接