用于长时间运行模块的 Jenkins 缓存工件

问题描述 投票:0回答:1

我们有一个 Jenkins 构建,可以构建许多 OSGI 模块,然后将工件复制到我们的开发服务器。有一个模块可以为所有表生成 POJO,与构建的其余部分相比,它需要很长的时间。有没有办法创建一个存储此 Jar 的构建(无论是始终还是通过使用标志)?这个模块不经常更新,但是更新的时候所有这些POJO都需要重新生成。

jenkins tomcat build
1个回答
0
投票

有没有办法创建一个存储此 Jar 的构建(无论是始终还是通过使用标志)?

您可以使用缓存机制来存储工件并在后续构建中重用它。
您可以使用专用的工件存储库(如ArtifactoryNexus)或简单的文件系统存储。

+---------------------------------------------+
| Jenkins Build                               |
|                                             |
|  +------------+     +-------------------+   |
|  | Other      |     | Long Running      |   |
|  | Modules    |     | Module (POJO Gen) |   |
|  +------------+     +-------------------+   |
|         |                   |               |
|         | Artifact          | Artifact      |
|         | Copy              | Copy          |
|         +-----------------> | (with caching)|
|                             |               |
+-----------------------------+---------------+

引入一个标志或环境变量(例如,

CACHE_POJO_ARTIFACT
)来控制是否应该构建长时间运行的模块或从缓存中获取。

  • 如果设置了该标志(并且缓存版本可用),则跳过长时间运行的模块的构建过程并使用缓存的工件。
  • 如果未设置该标志,则继续构建并使用新工件更新缓存。
# Pseudo bash script for caching mechanism
CACHE_POJO_ARTIFACT=${CACHE_POJO_ARTIFACT:-false}

if [ "$CACHE_POJO_ARTIFACT" = true ] && [ -f "path/to/cached/artifact.jar" ]; then
    echo "Using cached POJO artifact"
    # Code to fetch and use the cached artifact
else
    echo "Building POJO module"
    # Code to build the POJO module
    # Code to update the cache with the new artifact
fi

配置 Jenkins 作业以接受缓存控制参数 (

CACHE_POJO_ARTIFACT
)。确保 Jenkins 作业具有访问缓存存储所需的权限和配置。

当您需要重建 POJO 模块时(例如,更新后),请在禁用缓存标志的情况下触发构建
对于 POJO 模块未更改的常规构建,启用缓存标志以使用缓存的工件。


作为替代方案,您还可以使用 Jenkins 作业缓存器插件,旨在在 Jenkins 管道运行之间缓存文件。您将避免对外部二进制引用的依赖。

在您的

Jenkinsfile
中,您可以使用
cache
提供的
jobcacher
块来缓存长时间运行的模块的输出:

pipeline {
    agent any
    parameters {
        booleanParam(name: 'USE_CACHE', defaultValue: false, description: 'Use cached POJO artifact if available')
    }
    stages {
        stage('Long Running Module') {
            steps {
                script {
                    if (params.USE_CACHE) {
                        // Use jobcacher to fetch from cache
                        cache(path: 'path/to/pojo/artifacts', id: 'pojo-cache-id') {
                            echo "Cache is missing or outdated, rebuilding POJOs..."
                            // Steps to rebuild POJOs
                        }
                    } else {
                        echo "Rebuilding POJOs without using cache..."
                        // Steps to rebuild POJOs without caching
                    }
                }
            }
        }
        // Other stages
    }
}

您需要定义一个唯一的缓存 ID(示例中的

id: 'pojo-cache-id'
),用于识别和检索正确的缓存。

© www.soinside.com 2019 - 2024. All rights reserved.