我正在寻找退出声明性Jenkins管道的最简洁方法,具有成功状态.虽然使用错误步骤退出时出错,但我找不到任何与成功代码一样退出的方法.例如:
stage('Should Continue?') {
when {
expression {skipBuild == true }
}
steps {
echo ("Skiped Build")
setBuildStatus("Build complete", "SUCCESS");
// here how can I abort with sucess code?
// Error Would have been:
// error("Error Message")
}
}
stage('Build') {
steps {
echo "my build..."
}
}
Run Code Online (Sandbox Code Playgroud)
对于带脚本化构建的示例,我可以使用以下代码实现它:
if (shouldSkip == true) {
echo ("'ci skip' spotted in all git commits. Aborting.")
currentBuild.result = 'SUCCESS'
return
}
Run Code Online (Sandbox Code Playgroud)
虽然我知道能够在我的声明性pipieline中添加脚本步骤,但我希望找到一种更清洁的方式.
另一种方法可能是抛出错误并将其捕获到某个地方,但同样又非常混乱.
有更干净的方式吗?
我在多分支工作中使用 Jenkins 脚本化管道。
有一个参数应该只在主干中可用,而不是在多分支作业的任何分支中可用。
目前使用脚本化管道,这很容易做到(在共享库中或直接在 Jenkinsfile 上):
def jobParams = [
booleanParam(defaultValue: false, description: 'param1', name: 'param1')
]
if (whateverCondition) {
jobParams.add(booleanParam(defaultValue: false, description: 'param2', name: 'param2'))
}
properties([
parameters(jobParams)
])
Run Code Online (Sandbox Code Playgroud)
我目前正在尝试迁移到 jenkins 声明式语法,但我没有看到创建仅在某些条件下可用的参数的简单方法(我知道我可以忽略它,但我真的不希望它显示它一点)。
到目前为止,唯一的解决方案是将管道也移动到共享库(自Declarative 1.2起可能)。我不喜欢这个解决方案,因为必须复制整个管道,这对于一行来说似乎有点过于极端。
if (whateverCondition) {
pipeline {
agent any
parameters {
booleanParam(defaultValue: false, description: 'param1', name: 'param1')
booleanParam(defaultValue: false, description: 'param2', name: 'param2')
}
(...)
}
} else {
pipeline {
agent any
parameters {
booleanParam(defaultValue: false, description: 'param1', name: 'param1')
}
(...)
} …Run Code Online (Sandbox Code Playgroud) 我正在开发声明式管道,并希望使用文件参数来读取其内容,但它没有按预期工作
parameters{
file(fileLocation:'list.txt', description:'contains list of projects to be build')
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 12: Invalid parameter "fileLocation", did you mean "description"? @ line 12, column 14.
file(fileLocation:'release-list.txt', description:'contains list of projects to be build')
Run Code Online (Sandbox Code Playgroud)
以下是基本步骤插件提到的另一个选项
readFile: Read file from workspace
Reads a file from a relative path (with root in current directory, usually workspace) and returns its content as a plain string.
file
Relative ( /-separated) path to file within a workspace to read.
Type: String
encoding …Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我试图将 'ls -l /' 结果分配给b全局变量,但是,当我尝试打印其中的内容时,结果是null.
如何设置全局变量?
def b = [:]
pipeline {
agent any
stages {
stage('Build') {
steps {
script{
b = sh 'ls -l /'
println "b:"+b
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是结果:
[Pipeline] // stage
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ ls -l /
total 24
drwxr-xr-x 2 root root 4096 Jan 18 11:49 bin
drwxr-xr-x 2 root root 6 Oct 20 10:40 boot …Run Code Online (Sandbox Code Playgroud) 我正在尝试在声明性 jenkins 管道上的不同kubernetes pod 上并行运行一些端到端测试,但 jenkins 似乎尝试在相同的kubernetes pod 上运行并行阶段。这会导致数据库死锁,因为两个进程都尝试插入/截断/更新/查询相同的表。有没有办法可以为每个并行阶段启动不同的 Pod?
kubernetes 插件配置:
agent {
kubernetes {
label 'my-label'
defaultContainer 'jnlp'
yaml """
apiVersion: v1
kind: Pod
metadata:
name: dind
spec:
containers:
- name: < default container >
image: < image >
securityContext:
privileged: true
fsGroup: 1000
command:
- cat
tty: true
volumeMounts:
- name: jenkins-bundle-gems
mountPath: /usr/local/bundle
- name: <tests-container-name>
image: < image >
securityContext:
privileged: true
fsGroup: 1000
volumeMounts:
- name: jenkins-bundle-gems …Run Code Online (Sandbox Code Playgroud) parallel-testing jenkins jenkins-pipeline jenkins-declarative-pipeline jenkins-kubernetes
我目前正在开发一个通用管道,该管道将通过共享库用于替换现有作业,以便从更集中的位置更轻松地管理所有作业。大多数现有的工作都有这三个阶段:
一些作业if/else在其阶段有一些基于参数或环境变量做事的 s,但总体而言,这些作业在其他方面非常相似。我想到的解决方案是使用闭包来允许在这些阶段执行额外的逻辑代码,但我很难弄清楚如何确保这一点,以便您可以执行的唯一可能的“步骤”是sh和bat。
这是一个过于简化的例子vars/genericPipeline.groovy来说明我在说什么:
def call(body)
{
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
body()
String AGENT_LABEL = config.getOrDefault('label', 'mvn3')
Closure MVN_BUILD = config.getOrDefault('build', {
sh "mvn clean install"
})
Closure MVN_DEPLOY = config.getOrDefault('deploy', { BRANCH_NAME, ARTIFACT_COORDINATES, SERVER_ID, REPO, TMP_REPO ->
def SERVER_URL = REPO
if (BRANCH_NAME != 'master')
{
SERVER_URL = TMP_REPO
}
sh label: "Deploying ${ARTIFACT_COORDINATES}",
script: "mvn deploy" +
" -DskipTests" …Run Code Online (Sandbox Code Playgroud) 您可以在构建作业上使用传播,如下所述:
https://jenkins.io/doc/pipeline/steps/pipeline-build-step/
因此,您可以使用类似的方法来防止失败的步骤导致整个构建失败:
build(job: 'example-job', propagate: false)
Run Code Online (Sandbox Code Playgroud)
有没有办法将其用于舞台或步骤?我知道我可以用 try/catch 包围它,这几乎可以按照我想要的方式工作。它确实会忽略失败的阶段并恢复构建的其余部分,但不会将阶段显示为失败。现在我将所有失败的阶段写入一个变量并在稍后的阶段输出,但这并不理想。
如果我无法抑制阶段/步骤中的传播,是否有办法使用 build() 调用来执行相同的操作?也许如果我将它移动到另一个管道并通过 build() 调用它?
任何帮助表示赞赏。
Jenkins 声明式管道对我们来说太强大了,用户经常会滥用它。我们正在考虑使用固执己见的 YAML 来描述 CI/CD 管道。似乎有两个选择。
我不是詹金斯的专家,所以我希望一些专家可以提供一些指导,也许可以举个例子。
yaml jenkins jenkins-groovy jenkins-pipeline jenkins-declarative-pipeline
我有一个使用 Github webhooks 触发的 Jenkins 声明性管道。
Jenkins 作业可以在拉取请求或合并时触发。
我希望每次都运行 3 个步骤(构建和测试)中的 2 个 - 合并和 PR。
我希望最后一步 Deploy 仅在合并到“开发”分支时触发。
为此,我相信我需要访问触发作业的 github webhook 有效负载(包括其正文和请求标头)。如何从声明性管道访问这些数据?
这是我想要的要点:
pipeline {
agent any
stages {
stage ('Build') {
steps {
sh 'build.sh'
}
}
stage ('Test') {
steps {
sh 'test.sh'
}
}
stage ('Deploy to QA') {
when {
branch 'development'
// AND the github webhook header "X-GitHub-Event" == "pull_request"
// AND the github webhook json payload body.merged == true
}
steps {
sh …Run Code Online (Sandbox Code Playgroud) github webhooks jenkins jenkins-declarative-pipeline github-webhook