我在Jenkinsfile(Groovy)上有这样的东西,我想在变量中记录stdout和退出代码,以便稍后使用这些信息.
sh "ls -l"
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做,特别是因为你似乎无法在里面运行任何类型的groovy代码Jenkinsfile
?
我有一个具有多个阶段的Jenkins文件,其中一个实际上是另一个工作(部署一个),在某些情况下可能会失败.
我知道我可以使用Jenkinsfile提示,但我真的不知道如何为这个作业实现重试机制.
我有一个groovy文件,我想从Jenkinsfile运行.
即. load script.groovy
但是,如果它存储在与Jenkinsfile相同的目录中,我不确定如何引用该文件.我从git加载Jenkinsfile.我发现它创建了一个名为的文件夹workspace@script
.它不会将其放在工作空间目录中.我可以对文件夹进行硬编码,但我不确定这个规则,再次检查代码似乎有点多余.
java.io.FileNotFoundException: /opt/jenkins_home/jobs/my_job/workspace/script.groovy (No such file or directory)
Run Code Online (Sandbox Code Playgroud)
默认情况下,它从工作空间加载,而不是 workspace@script
我正在尝试将BuildFlow脚本转换为Pipeline(工作流)脚本.但我发现,它并不像复制和粘贴那么容易.
Jenkinsfile
node {
//get parameters from Job
def builds = builds.tokenize(",")
def ip_address_node = ip_address_node.trim()
def port_node = port_node.trim()
def branch = branch.trim()
def workspace = pwd()
stage 'Checking out code from esb repository'
git branch: branch, url: 'ssh://git@giturl/integration_bus.git'
load '../workspace@script/esb_deploybar_pipeline/deploy_esb.groovy'
}
Run Code Online (Sandbox Code Playgroud)
deploy_esb.groovy(这是来自旧的buildflow,试图在管道中运行)
import groovy.transform.ToString
import groovy.transform.EqualsAndHashCode
@EqualsAndHashCode
@ToString
class BarDeploy {
String barFile
String app
String integrationServer
}
//parse csv
def csvItemsApps …
Run Code Online (Sandbox Code Playgroud) groovy jenkins jenkins-workflow jenkins-pipeline jenkinsfile
我们正在将一组作业(涉及相同的代码库)迁移到管道.分成多个工作岗位的主要原因是实现了并行性和细化的回报值.管道/ Jenkinsfile方法似乎很合适.一些插件仍然缺失,但总的来说我们处于良好的轨道上.
我们缺少的一件事就是我们以前的良好命名.在此之前,每个版本都会得到一个名字$jobname $buildnumber ($branch)
,它给了我们app-spec #42 (new-feature)
.这导致jenkins"执行者状态" - 侧栏的良好可见性.
通过管道,我们只会得到part of app-pipeline #23
,这迫使我们查看构建并确定在任何给定时刻正在运行的内容.
有没有办法覆盖侧边栏中显示的名称?
UPDATE
我主要想要的答案是"并行化管道的哪个部分在该执行器中运行".
我试图找到一个使用Jenkins管道(工作流)中的Jenkins复制工件插件的示例.
任何人都可以指向使用它的示例Groovy代码吗?
我目前正在测试Jenkins 2.0的管道方法,看看它是否适用于我正在使用的构建环境.
首先是关于环境本身.它目前由多个SCM存储库组成.每个存储库包含多个分支,用于开发的不同阶段,每个分支都使用多个配置构建.并非所有配置都适用于每个存储库.
目前,每个存储库/分支都设置为不同配置的Matrix项目.每个项目都将它的构建结果公开为工件,并且这些工件在下游项目中使用.
不同的存储库相互依赖,因此在上游作业上的成功构建会触发一些特定的下游作业.目前一切正常,但设置新分支或调整构建过程所需的工作量很多,因为需要手动更改许多不同的项目.
现在我想尝试新的管道.我的想法是创建多分支管道项目,并Jenkinsfile
在包含构建指令的存储库中放置一个.
主要问题是使构建相互触发,因为基本上是特定上游分支的构建需要触发下游分支.上游项目不知道下游分支需要触发的信息.每个下游项目从一些上游分支获取工件,理想的解决方案是,如果作为工件源的上游构建完成它的构建,将触发下游构建.
问题是只有下游项目真正知道他们需要什么工件.在大多数情况下,分支名称不太可能匹配,这使得从上游项目触发构建变得非常困难.
目前这是使用ReverseBuildTrigger
.但是,一旦它接近管道,这件事就会停止工作.
我真的不知道如何让这个工作.有没有办法得到类似ReverseBuildTrigger
工作内部管道脚本?
如果单个分支上游发生更改,也会触发所有分支的整个下游构建,这不是一个选项.这会产生太多相等的构建.
我正在使用Jenkinsfile来编写管道脚本.
有没有办法在构建日志中禁用已执行的shell命令的打印?
这里只是jenkins管道的一个简单示例:
node{
stage ("Example") {
sh('echo shellscript.sh arg1 arg2')
sh('echo shellscript.sh arg3 arg4')
}
}
Run Code Online (Sandbox Code Playgroud)
在控制台日志中生成以下输出:
[Pipeline] node
Running on master in /var/lib/jenkins/workspace/testpipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] sh
[testpipeline] Running shell script
+ echo shellscript.sh arg1 arg2
shellscript.sh arg1 arg2
[Pipeline] sh
[testpipeline] Running shell script
+ echo shellscript.sh arg3 arg4
shellscript.sh arg3 arg4
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Run Code Online (Sandbox Code Playgroud)
基本上我想禁用命令本身的打印.
+ echo shellscript.sh …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的Scripted管道转换为声明性管道.想知道如何在steps {}
块内部执行简单的if语句.
stage ('Deploy to Docker') {
steps {
parallel (
"instance1" : {
environment {
containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
}
steps {
if (containerId.isEmpty()) {
docker.image('some/image').run("--name ${fullDockerImageName}")
}
}
}
)
}
}
Run Code Online (Sandbox Code Playgroud)
这会导致以下异常:
WorkflowScript: 201: Expected a step @ line 201, column 29.
if (containerId.isEmpty()) {
Run Code Online (Sandbox Code Playgroud)
既然我不允许if(..)
在一个steps {}
块内做一个简单的内容,任何关于如何做到这一点的想法?
when {}
因为在一个简单的阶段中发生了更多的步骤(如果它存在则启动已停止的容器等),这似乎没有意义,因为在一个简单的阶段中会发生更多的步骤.
做一个简单的if的最佳方法是什么?
我的代码类似于我在Jenkinsfile中的代码:
node {
checkout scm
// do some stuff
try {
// do some maven magic
} catch (error) {
stage "Cleanup after fail"
emailext attachLog: true, body: "Build failed (see ${env.BUILD_URL}): ${error}", subject: "[JENKINS] ${env.JOB_NAME} failed", to: 'someone@example.com'
throw error
} finally {
step $class: 'JUnitResultArchiver', testResults: '**/TEST-*.xml'
}
}
Run Code Online (Sandbox Code Playgroud)
如果上面的代码因为一些与jenkins-pipeline相关的错误而try { }
失败(例如使用未经批准的静态方法),则脚本会无声地失败.当我删除try/catch/finally时,我可以看到错误.难道我做错了什么?不应该重新抛出error
使管道错误出现在日志中?
编辑:当我使用尚未分配的变量时,我已设法将问题固定为groovy语法.示例:
echo foo
如果foo
未在任何地方声明/分配Jenkins将失败构建,并且如果它在try/catch/finally内部而不会重新抛出异常,则不会显示原因.
我正在使用Jenkins管道插件和Jenkinsfile.
在一个名为vms.git的存储库中,我有Jenkinsfile和它构建的应用程序.
我有另一个名为deploy.git的存储库,它包含我想用来在vms.git中部署应用程序的脚本.
目前我的Jenkinsfile看起来像这样
node {
stage 'build'
checkout scm
Run Code Online (Sandbox Code Playgroud)
我在作业配置中定义了vms.git repo.
所以我想要检查两个存储库,然后使用vms.git中的Jenkinsfile来定义构建的其余部分.我想在其他管道中重用deploy.git脚本,所以我不想在其中放置Jenkins文件.