标签: jenkinsfile

如何使用Jenkinsfile(groovy)中的变量执行shell命令的输出?

我在Jenkinsfile(Groovy)上有这样的东西,我想在变量中记录stdout和退出代码,以便稍后使用这些信息.

sh "ls -l"
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做,特别是因为你似乎无法在里面运行任何类型的groovy代码Jenkinsfile

groovy jenkins-workflow jenkins-pipeline jenkinsfile

178
推荐指数
6
解决办法
24万
查看次数

如何为Jenkins管道中的失败阶段实现重试选项?

我有一个具有多个阶段的Jenkins文件,其中一个实际上是另一个工作(部署一个),在某些情况下可能会失败.

我知道我可以使用Jenkinsfile提示,但我真的不知道如何为这个作业实现重试机制.

我希望能够单击失败的舞台并选择重试它. 詹金斯-管道与 - 阶段

groovy jenkins-workflow jenkins-pipeline jenkinsfile

58
推荐指数
3
解决办法
4万
查看次数

如何使用Pipeline引用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

32
推荐指数
3
解决办法
5万
查看次数

如何覆盖"app-pipeline"buildname的一部分?

我们正在将一组作业(涉及相同的代码库)迁移到管道.分成多个工作岗位的主要原因是实现了并行性和细化的回报值.管道/ Jenkinsfile方法似乎很合适.一些插件仍然缺失,但总的来说我们处于良好的轨道上.

我们缺少的一件事就是我们以前的良好命名.在此之前,每个版本都会得到一个名字$jobname $buildnumber ($branch),它给了我们app-spec #42 (new-feature).这导致jenkins"执行者状态" - 侧栏的良好可见性.

通过管道,我们只会得到part of app-pipeline #23,这迫使我们查看构建并确定在任何给定时刻正在运行的内容.

有没有办法覆盖侧边栏中显示的名称?

UPDATE

我主要想要的答案是"并行化管道的哪个部分在该执行器中运行".

jenkins jenkins-workflow jenkins-pipeline jenkinsfile

28
推荐指数
1
解决办法
766
查看次数

如何在管道(jenkinsfile)中使用Jenkins Copy Artifacts插件?

我试图找到一个使用Jenkins管道(工作流)中的Jenkins复制工件插件的示例.

任何人都可以指向使用它的示例Groovy代码吗?

groovy jenkins-workflow jenkinsfile

27
推荐指数
3
解决办法
5万
查看次数

Jenkins:触发上游变更的多分支管道

我目前正在测试Jenkins 2.0的管道方法,看看它是否适用于我正在使用的构建环境.

首先是关于环境本身.它目前由多个SCM存储库组成.每个存储库包含多个分支,用于开发的不同阶段,每个分支都使用多个配置构建.并非所有配置都适用于每个存储库.

目前,每个存储库/分支都设置为不同配置的Matrix项目.每个项目都将它的构建结果公开为工件,并且这些工件在下游项目中使用.

不同的存储库相互依赖,因此在上游作业上的成功构建会触发一些特定的下游作业.目前一切正常,但设置新分支或调整构建过程所需的工作量很多,因为需要手动更改许多不同的项目.

现在我想尝试新的管道.我的想法是创建多分支管道项目,并Jenkinsfile在包含构建指令的存储库中放置一个.

主要问题是使构建相互触发,因为基本上是特定上游分支的构建需要触发下游分支.上游项目不知道下游分支需要触发的信息.每个下游项目从一些上游分支获取工件,理想的解决方案是,如果作为工件源的上游构建完成它的构建,将触发下游构建.

问题是只有下游项目真正知道他们需要什么工件.在大多数情况下,分支名称不太可能匹配,这使得从上游项目触发构建变得非常困难.

目前这是使用ReverseBuildTrigger.但是,一旦它接近管道,这件事就会停止工作.

我真的不知道如何让这个工作.有没有办法得到类似ReverseBuildTrigger工作内部管道脚本?

如果单个分支上游发生更改,也会触发所有分支的整个下游构建,这不是一个选项.这会产生太多相等的构建.

jenkins jenkins-workflow jenkinsfile jenkins-2

25
推荐指数
2
解决办法
2万
查看次数

如何在jenkins管道构建日志中禁用命令输出

我正在使用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)

jenkins jenkins-pipeline jenkinsfile

24
推荐指数
2
解决办法
3万
查看次数

如何在Jenkins的声明性管道中执行简单的if语句

我正在尝试将我的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的最佳方法是什么?

jenkins jenkins-pipeline jenkinsfile

24
推荐指数
3
解决办法
4万
查看次数

在groovy编译器异常的情况下,try/catch/finally掩盖Jenkinsfile问题

我的代码类似于我在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内部而不会重新抛出异常,则不会显示原因.

groovy jenkins-workflow jenkins-pipeline jenkinsfile

23
推荐指数
1
解决办法
4万
查看次数

Jenkinsfile有两个git存储库

我正在使用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文件.

git jenkins jenkins-pipeline jenkinsfile

19
推荐指数
2
解决办法
4万
查看次数