Jenkins在不同的步骤中使用结果工件 - 存储和取消暂存

时间:2018-01-03 09:25:52

标签: jenkins jenkins-pipeline

我有一个Jenkinsfile声明性管道,它有两个步骤:

  1. 在docker容器中构建RPM文件
  2. 使用RPM构建docker镜像并运行它
  3. 第一步是在docker容器内部构建,因为它需要一个特定的应用程序来构建RPM。

    第二步是直接在Jenkins奴隶上运行,可以是其他奴隶而不是第一步的奴隶。

    为了使用第一步产生的RPM,我目前正在使用stashunstash步骤。如果我不使用它们,第二步就无法访问RPM文件。

    RPM文件大约是215MB,超过了建议的100MB限制,所以我想知道是否有更好的解决方案?

    pipeline {
        agent any
    
        options {
            timestamps()
        }
    
        stages {
    
            stage('Gradle: build') {
                agent {
                    docker {
                        image 'some-internal-image'
                    }
                }
    
                steps {
                    sh """
                        chmod +x gradlew
                        ./gradlew buildRpm
                    """
                }
    
                post {
                    success {
                        stash name: 'rpm', includes: 'Server/target/myapp.rpm'
                    }
                }
            }
    
            stage('Gradle: build docker image') {
                steps {
                    unstash 'rpm'
                    sh """
                        chmod +x gradlew
                        ./gradlew buildDockerImage
                    """
                }
            }
    
        }
    }
    

2 个答案:

答案 0 :(得分:0)

你可以使用docker的multi-stage build,但我不知道使用Jenkins管道的一个很好的实现。

我们还要存储数百兆字节,以便将其分发给构建代理。我已经尝试将工件上传到S3并从那里再次下载它们,现在可以看到性能有所提高(只是它从Jenkins Master那里获得了负载)。

所以我非常自以为是的建议:一旦遇到性能/负载问题,请保持原样并进行优化。

答案 1 :(得分:0)

您可以使用Artifactory或任何其他二进制存储库管理器..

来自Artifactory的网页:

  

作为第一个也是唯一的通用Artifact Repository Manager   市场上,JFrog Artifactory完全支持创建的软件包   任何语言或技术。

     

...

     

... Artifactory提供端到端,自动化和防弹   用于跟踪从开发到生产的工件的解决方案。