如何强制jenkins重新加载jenkins文件?

时间:2017-06-07 21:01:40

标签: jenkins jenkins-pipeline

我的jenkinsfile有几个参数,每次我在参数中进行更新(例如删除或添加一个新输入)并将更改提交给我的SCM,我没有看到jenkins中的作业输入屏幕相应更新,我有运行执行,取消它,然后在

中查看我更新的字段
properties([
  parameters([
    string(name: 'a',       defaultValue: 'aa',     description: '*', ),
    string(name: 'b',   description: '*', ),
    string(name: 'c',       description: '*', ),
   ])
])

任何线索?

5 个答案:

答案 0 :(得分:7)

我为解决此问题而做的其中一件 ugliest 事件是创建一个Refresh参数,它基本上会立即退出管道。这样我就可以运行管道来更新属性。

pipeline {
    agent any
    parameters {
        booleanParam(name: 'Refresh',
                    defaultValue: false,
                    description: 'Read Jenkinsfile and exit.')
    }
    stages {
        stage('Read Jenkinsfile') {
            when {
                expression { return parameters.Refresh == true }
            }
            steps {
                echo("Ended pipeline early.")        
            }
        }
        stage('Run Jenkinsfile') {
            when {
                expression { return parameters.Refresh == false }
            }
            stage('Build') {
                // steps
            }
            stage('Test') {
                // steps
            }
            stage('Deploy') {
                // steps
            }
        }
    }
}

确实必须有更好的方法,但我还没有找到它:(

答案 1 :(得分:1)

不幸的是,TomDotTom的答案对我不起作用-我遇到了同样的问题,并且由于以下错误,我的詹金斯夫妇还需要另外一个 stages 来运行“ Run Jenkinsfile”:

未知阶段部分“阶段”。从版本0.5开始,阶段中的步骤必须在“步骤”块中。

我还使用 params 而不是 parameters 作为变量来检查条件(如Jenkins Syntax中所述)。

pipeline {
    agent any
    parameters {
        booleanParam(name: 'Refresh',
                    defaultValue: false,
                    description: 'Read Jenkinsfile and exit.')
    }
    stages {
        stage('Read Jenkinsfile') {
            when {
                expression { return params.Refresh == true }
            }
            steps {
              echo("stop")
            }
        }
        stage('Run Jenkinsfile') {
            when {
                expression { return params.Refresh == false }
            }
            stages {
              stage('Build') {
                  steps {
                    echo("build")
                  }
              }
              stage('Test') {
                  steps {
                    echo("test")
                  }
              }
              stage('Deploy') {
                  steps {
                    echo("deploy")
                  }
              }
            }
        }
    }
}

应用于詹金斯2.233

答案 2 :(得分:0)

需要执行Jenkinsfile才能更新作业属性,因此您需要使用新文件启动构建。

答案 3 :(得分:0)

脚本化管道解决方法 - 可能也可以使其在声明式中工作。

由于您使用的是 SCM,您可以检查自上次构建 (see here) 以来哪些文件发生了更改,然后根据它决定要做什么。 请注意,必须启用作业上的轮询 SCM 才能自动检测 Jenkinsfile 更改。

node('master') {
    checkout scm
    if (checkJenkinsfileChanges()) {
        return // exit the build immediately 
    } 
    echo "build" // build stuff
}

private Boolean checkJenkinsfileChanges() {
    filesChanged = getChangedFilesList()
    jenkinsfileChanged = filesChanged.contains("Jenkinsfile")

    if (jenkinsfileChanged) {
        if (filesChanged.size() == 1) {
            echo "Only Jenkinsfile changed, quitting"
        } else {
            echo "Rescheduling job with updated Jenkinsfile"
            build job: env.JOB_NAME 
        }
    }
    return jenkinsfileChanged
}

// returns a list of changed files
private String[] getChangedFilesList() {
    changedFiles = []
    for (changeLogSet in currentBuild.changeSets) { 
        for (entry in changeLogSet.getItems()) { // for each commit in the detected changes
            for (file in entry.getAffectedFiles()) {
                changedFiles.add(file.getPath()) // add changed file to list
            }
        }
    }
    return changedFiles
}

答案 4 :(得分:0)

我使用 Jenkins Job Builder python 包解决了这个问题。这个包的主要目标是实现Jenkins Job as Code

为了解决您的问题,我可以简单地使用下面的方法并将其保留在带有 Jenkins 管道的 SCM 上,该管道将侦听 jobs.yaml 文件更改的任何更改并为我构建作业,以便每当我触发我的作业时都需要参数会为我准备好。

jobs.yaml

- job:
      name: 'job-name'
      description: 'deploy template'
      concurrent: true
      properties:
        - build-discarder:
            days-to-keep: 7
        - rebuild:
            rebuild-disabled: false
      parameters:
        - choice:
            name: debug
            choices:
              - Y
              - N
            description: 'debug flag'
        - string:
            name: deploy_tag
            description: "tag to deploy, default to latest"
        - choice:
            name: deploy_env
            choices:
              - dev
              - test
              - preprod
              - prod
            description: "Environment"
      project-type: pipeline
      # you can use either DSL or pipeline SCM
      dsl: |
          node() {
             stage('info') {
               print params
             }
          }
      # pipeline-scm:
      #   script-path: Jenkinsfile
      #   scm:
      #     - git:
      #         branches:
      #           - master
      #         url: 'https://repository.url.net/x.git'
      #         credentials-id: 'jenkinsautomation'
      #         skip-tag: true
      #         wipe-workspace: false
      #   lightweight-checkout: true

config.ini

[job_builder]
allow_duplicates = False
keep_descriptions = False
ignore_cache = True
recursive = False
update = all
[jenkins]
query_plugins_info = False
url = http://localhost:8080

加载/更新作业的命令

jenkins-jobs --conf conf.ini -u $JENKINS_USER -p $JENKINS_PASSWORD update jobs.yaml

注意 - 要使用 jenkins-jobs 命令,请确保您需要安装此 jenkins-job-builder python 包。

这个包有很多功能,比如创建(自由风格、管道、多分支)、更新、删除、验证詹金斯作业配置。它支持模板 - 这意味着使用一个通用模板,您可以构建“n”个相似的作业,动态生成参数等。