我正在尝试使用 DSL 工作插件在 Jenkins 中创建新工作。有没有办法在创建作业时指定视图?
例如,我有一个视图NewJobsView。我想创建一个名为的 DSL 作业dsl-job,它正在创建一个新作业“dsl-created-job1”
像这样的DSL:
job {
name 'dsl-created-job1'
//view 'NewJobsView'
//or view {...} to specify the view
}
Run Code Online (Sandbox Code Playgroud) 使用 Job-DSL,我们可以在 Jenkins 中配置一个 C# 项目。
SonarQube 任务给我们带来了困难。
StepContext.metaClass.sonar = {
-> NodeBuilder nodeBuilder = new NodeBuilder()
stepNodes << nodeBuilder.'hudson.plugins.sonar.SonarRunnerBuilder' {
jdk('(Inherit From Job)')
usePrivateRepository(false)
}
}
Run Code Online (Sandbox Code Playgroud)
如何sonar-project.properties使用 Job-DSL 脚本设置配置文件的路径?

最终剧本
感谢@Bruno César,我添加pathToSonarProjectProperties了参数。
StepContext.metaClass.sonar = { String pathToSonarProjectProperties
-> NodeBuilder nodeBuilder = new NodeBuilder()
stepNodes << nodeBuilder.'hudson.plugins.sonar.SonarRunnerBuilder' {
jdk('(Inherit From Job)')
usePrivateRepository(false)
project(pathToSonarProjectProperties)
}
}
Run Code Online (Sandbox Code Playgroud)
sonar使用相对于项目的根路径调用该函数sonar-project.properties:
sonar("Framework\\xxx\\xxx\\sonar-project.properties")
Run Code Online (Sandbox Code Playgroud) 在 Jenkins 中,您可以使用 Job DSL 轻松创建列表视图
listView("myView") {
jobs {
regex(".*")
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果您尝试在文件夹中创建列表视图,则会创建文件夹但不会创建视图
folder("someFolder")
listView("someFolder/myView") {
jobs {
regex(".*")
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
最近,我设法将几个手动创建的作业转换为DSL脚本(内联到临时的“种子”作业中),并且感到惊讶,它是如此的简单。现在,我想摆脱多个种子工作,并尝试更整洁地构建事物。
为此,我创建了一个新的存储jenkins-ci库,并将所有Groovy DSL脚本提交给它。然后,我创建了一个job-generatorJenkins作业,该作业从存储jenkins-ci库中提取,并且只有一个Process Job DSLs步骤。此步骤已选中“在文件系统上查找”框,“ DSL脚本”字段设置为jobs/*.groovy。有了全局推送通知后,此操作或多或少地达到了预期的效果:如果我对存储库进行了更改jenkins-ci,该job-generator作业将自动运行并重新生成所有作业,真棒!
我对该解决方案不满意的是,它的参考位置很差:该作业的DSL脚本位于与代码完全独立的存储库中。我倒是真的很喜欢,是保持工作DSL脚本中的每个单独的代码库,在一个jenkins子文件夹,有一个单一的种子作业过程中他们所有。这样,就可以在代码旁边同时检查对CI设置的更改。对我来说,这就像是一个理想的设置。
不幸的是,我对如何实现这一目标尚无明确的想法。如果我能找到一种方法来使种子作业监视多个存储库,从而使对它们中任何一个的提交都将触发它,也许我可以在“ 处理作业DSL”步骤之前注入另一个构建步骤,并(以某种方式)编写脚本来胜利,但是...我不确定如何甚至得到这一点。(我当然不想只生成DSL脚本就对生成器作业中的每个仓库进行完整的克隆!)
我怀疑我不是第一个希望他们可以将Job DSL脚本与代码放在一起的人,尽管也许我高估了它的好处。感谢您提供有关该主题的任何建议!
我正在创建一个 jenkins 管道作业来使用 jenkins 作业 DSL 插件播种作业。如何获取 DSL 文件中的工作区路径?jenkins 管道代码如下:
#!groovy
node{
stage("build jobs"){
ws{
git poll: true, credentialsId: 'xxx', url: 'ssh://git@aaaaa.cc.xxx.com:/xxx/xxx.git'
checkout scm
jobDsl(removedJobAction: 'DISABLE', removedViewAction: 'DELETE', targets: 'jobs/*.groovy', unstableOnDeprecation: true)
}
}
}
Run Code Online (Sandbox Code Playgroud)
失败的 DSL 代码是:
hudson.FilePath workspace = hudson.model.Executor.currentExecutor().getCurrentWorkspace()
Run Code Online (Sandbox Code Playgroud)
随着错误:
Processing DSL script pipeline.groovy
java.lang.NullPointerException: Cannot invoke method getCurrentWorkspace() on null object
at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:35)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
at pipeline.run(pipeline.groovy:1)
at pipeline$run.call(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
在作业 DSL 步骤中无法访问在管道区域中创建的变量
我有非常相似的管道作业,唯一的区别是参数。目标是通过在 DSL 脚本中传递参数来创建这些作业,而无需任何代码重复。
我关注了这篇文章。因此,如果您在执行本文中提到的步骤后运行下面的 DSL 脚本,我的脚本就可以运行。
TL;DR 在那篇文章中添加了一个共享库,并且让 Jenkinsfile 使用该共享库。
我有一个非常相似的方法。不同之处在于我想通过 DSL 创建构建作业,并通过 DSL 上的设置更改 Jenkinsfile 的默认参数。
问题是如何传递/覆盖 Jenkinsfile 中的参数。
// BTW I'll run this code below in a loop. Open for any suggesstion
pipelineJob('AwesomeBild') {
description("A pipeline created by dsl")
definition {
cpsScm {
scm {
git {
remote { url('https://github.com/jalogut/jenkinsfile-shared-library-sample.git') }
branches('master')
// how can I pass params to the file
scriptPath('Jenkinsfile')
extensions { }
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
参数效果良好。这是 DSL 文件的最新版本。
pipelineJob('AwesomeBild') { …Run Code Online (Sandbox Code Playgroud) 我试图利用退出代码在job-> publishers-> postBuildScripts-> steps-> shell->高级选项中设置构建不稳定,以根据情况将构建不稳定。我有下面的脚本。
...
postBuildScripts {
onlyIfBuildSucceeds(false)
steps {
shell('echo "Before exit 1"\n' +
'if [ ! condition ]; then\n' +
'echo failed-condition\n' +
'exit 1\n' +
'fi'
)
}
}
...
Run Code Online (Sandbox Code Playgroud)
使用以上脚本exit 1,构建失败。但我想让它不稳定,我不要想用markBuildUnstable(true)。我只想根据某些退出代码将构建标记为不稳定。我可以将退出代码手动设置为1,如下所示
此后,将构建标记为不稳定。
我正在寻找脚本来通过脚本而不是手动设置此字段,因为我有很多工作。
有人可以在建议方面帮助我吗?
我见过这个问题,它朝着类似的方向发展,但并不完全。问题在于标签没有正确推送。
我目前正在使用 Jenkins 构建我的 python 项目setuptools_scm,它基本上用于git describe获取(或多或少)合理的版本号,即使不在标签上。管道是使用 JobDSL 中的种子作业定义的,如下所示(缩写为了解要点):
import BuildProjects
BuildProjects.build_projects.each { def bproject ->
multibranchPipelineJob("tool/${bproject}") {
branchSources {
branchSource {
source {
git {
id('tool_${bproject}')
remote("${BuildProjects.scmBaseLocation}/${bproject}.git")
credentialsId(BuildProjects.scmUser)
traits {
gitBranchDiscovery()
gitTagDiscovery()
cloneOptionTrait {
extension {
shallow(false)
noTags(false)
reference('grmblwrx')
timeout(1)
}
}
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
一些配置值取自BuildProjects.
运行 jenkins 时,我看到它获取标签:
> git fetch --tags --progress -- ssh://git@git.my-company.net/tools.git +refs/heads/*:refs/remotes/origin/* # timeout=1
Run Code Online (Sandbox Code Playgroud)
事实上,当我使用 Jenkinsfile 输出标签时,我可以看到标签
sh "git tag"
Run Code Online (Sandbox Code Playgroud)
堵塞。但是使用
sh …Run Code Online (Sandbox Code Playgroud) Jenkinsfile 中的以下代码片段使用了什么 Groovy 语言构造、语法或控制结构?
stage('Stage 1') {
steps {
// One or more steps
}
}
Run Code Online (Sandbox Code Playgroud)
即,就纯 Groovy 语言而言,Jenkinsfile 中的块是什么?
什么是“步骤”?或者stage?是调用函数吗?或定义?或者带有匿名(lambda)参数的函数调用?
这个问题本质上是另一个问题:
问题2:
Jenkinsfile 是 groovy 语言的代码片段吗?
换句话说, 1. Jenkinsfile 是否遵循纯 Groovy 的所有语法和控制结构?(也许通过隐式库 import-ed 或 #include d 在开始时默默地),
与 DSL 相反: 2. Jenkinsfile 几乎是一个 Groovy 源文件,增加了新的 Jenkins 特定结构,而这些结构最初并非在 Groovy 中,例如使用预处理的 Jenkins。
以上两者哪一个成立?
有关的:
我使用 Gradle 6.9,这是我的 build.gradle 文件:
plugins {
id "groovy"
id "java"
}
group "com.matthiasdenu"
version "1.0-SNAPSHOT"
repositories {
mavenCentral()
maven {
url 'https://repo.jenkins-ci.org/releases/'
}
}
ext {
jobDslVersion = "1.77"
jenkinsVersion = "2.252"
}
sourceSets {
jobs {
groovy {
srcDirs "jobs"
compileClasspath += main.compileClasspath
}
compileClasspath += sourceSets.main.output
runtimeClasspath += sourceSets.main.output
}
}
dependencies {
compile("org.jenkins-ci.main:jenkins-war:${jenkinsVersion}"){
// https://github.com/sheehan/job-dsl-gradle-example/issues/87
exclude group: "org.jenkins-ci.ui", module: "bootstrap"
}
}
test {
useJUnitPlatform()
}
Run Code Online (Sandbox Code Playgroud)
这是我收到的错误消息:
Execution failed for task ':compileTestGroovy'.
> Could not resolve …Run Code Online (Sandbox Code Playgroud)