我的jenkinsfile有几个参数,每次我在参数中进行更新(例如删除或添加一个新输入)并将更改提交给我的SCM,我没有看到jenkins中的作业输入屏幕相应更新,我有运行执行,取消它,然后在
中查看我更新的字段properties([
parameters([
string(name: 'a', defaultValue: 'aa', description: '*', ),
string(name: 'b', description: '*', ),
string(name: 'c', description: '*', ),
])
])
任何线索?
答案 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”个相似的作业,动态生成参数等。