如何在没有SCM选项情况下配置Jenkins管道项目

qfe3c7zg  于 12个月前  发布在  Jenkins
关注(0)|答案(2)|浏览(158)

我们正在将我们的源代码存储库迁移到Cloud Bucket,Jenkins使用的所有源代码都将像S3一样从Bucket读取/下载。
这也涉及到重写我们从SCM(git)读取的Jenkins管道。Jenkis管道项目配置不允许任何独立的脚本执行(比如weget或使用shell从bucket下载文件)
如果可能,我想执行以下操作:1)将jenkinsfile从S3存储桶下载到工作区2)在管道部分中为SCM选择无3)在脚本路径中为已下载的jenkinsfile提供给予路径
我的问题是,我如何才能使#1成为可能?.图像附件. x1c 0d1x

7ivaypg9

7ivaypg91#

我们有一个类似的情况,我们需要允许执行动态生成的Jenkins管道,这些管道存储在S3中,并且不能使用常规的SCM选项进行检索。
为了解决这个问题,我们将以下方法 Package 在一个函数中:
1.从S3下载相关的Jenkinsfile
1.将文件作为文本加载到变量中
1.使用Groovy Evaluate函数运行管道。
在代码方面,我们有一个名为runPipelineFromS 3的共享库函数,它看起来像这样:

/**
 * Download and run the given Jenkinsfile from S3
 *
 * @param path (Mandatory) the path to the Jenkinsfile within the S3 bucket.
 * @param bucket (optional) the bucket in which to search for the Jenkinsfile. If not given DEFAULT_BUCKET will be used.
 */
def call(String path, String bucket = 'DEFAULT_BUCKET'){
    s3Download bucket: bucket, path: path, file: 'Jenkinsfile'
    def content = readFile file: 'Jenkinsfile'
    evaluate content
}

/**
 * Download and run the given Jenkinsfile from S3
 *
 * @param params A map of key values parameters to be used, supports the following parameters:
 * String path (Mandatory) - the path to the Jenkinsfile within the S3 bucket.
 * String bucket (optional) the bucket in which to search for the JJenkinsfile. If not given DEFAULT_BUCKET will be used.
 */
def call(Map params){
    assert params.path : "The path parameter cannot be empty"
    call(params.path.toString(), params.bucket ? params.bucket.toString() : 'DEFAULT_BUCKET')
}

字符串
那么在流水线本身的用法就很简单了,你只需要选择Pipeline script作为定义,流水线脚本代码就像这样:

library 'my-shared-library'        // Load the shard library
runPipelineFromS3("PATH_TO_FILE")  // downland and run the Jenkinsfile


您还可以使用作业参数使其更通用:

library 'my-shared-library$LIBS_BRANCH'    // Load the shard library from a specific branch
runPipelineFromS3(PATH_TO_FILE, S3_BUCKET)  // downland and run the Jenkinsfile based on job input parameters


x1c 0d1x的数据
可以根据您的需要修改共享库函数以支持其他执行参数,并且库可以全局加载,从而避免需要在每个作业中调用它,并使此解决方案成为每个作业的单行调用。
但基本的想法是使用你自己的逻辑而不是SCM的逻辑,通过你自己的脚本来检索和运行Jenkis文件-最好将功能封装在共享库中,以便将来在所有作业中进行修改-而不需要单独重新配置每个作业。
最后,特别是在全局加载库并使用常量默认存储桶的情况下,对于每个作业,您只需配置Jenkisfile的唯一路径,这与您使用SCM配置块请求的行为类似。

gv8xihay

gv8xihay2#

Jenkis管道项目配置不允许任何独立的脚本执行(例如weget或使用shell从bucket下载文件)
那...我宁愿做两份工作

  • 一个用于下载Jenkis文件
  • 第一个(与第一个共享相同的工作空间):我使用Job Node Stalker Jenkins plugin,有点旧,但它仍然可以工作!
+----------------+               +---------------------+              +-------------------+
| S3 Cloud Bucket | --(Job 1)--> | Jenkins Workspace   | --(Job 2)--> | Jenkins Pipeline  |
| (contains code) |              | (jenkinsfile path)  |              | Execution         |
+-----------------+              +---------------------+              +-------------------+

字符串
使用Amazon S3 publisher Jenkins plugin

// For Job 1
node {
    stage('Download Jenkinsfile') {
        s3Download bucket: 'your-bucket', path: 'jenkinsfile', file: 'Jenkinsfile'
    }
}


对于作业2,由作业1后构建步骤自动触发:

  • 一个流水线作业(如果“Job Node Stalker”插件处于活动状态,您可以确保作业将重用先前的工作区,其中已经存在Jenkinsfile)
  • 或者是一个自由式的工作(支持“工作节点跟踪器”:我经常使用它)

相关问题