我正在将现有的构建管道重建为詹金斯声明性管道(多分支管道),并且在处理构建传播时遇到问题。
打包并存储所有相关文件后,管道应等待用户输入触发部署。
如果我只是添加一个输入步骤,则当前构建节点被阻止。由于该执行程序非常繁重,因此我想将此步骤转移到更轻巧的机器上。
最初,我以脚本管道的形式完成了工作,并创建了两个不同的node('label')
块。有没有办法让我对声明式语法做类似的事情?
node('spine') {
stage('builder') {
sh 'mvn clean compile'
stash name: 'artifact', includes: 'target/*.war'
}
}
node('lightweight') {
stage('wait') {
timeout(time:5, unit:'DAYS') {
input message:'Approve deployment?'
}
}
// add deployment stages
}
我已经尝试了几件事:
在顶层配置代理,并在传播步骤中添加其他代理配置,但是由于顶层定义的构建节点未停止,因此我有两个执行程序受阻。
agent none
在顶层进行设置并按步骤配置代理。则git checkout在第一个节点上不存在。
编辑1
我根据您的建议重新配置了管道,目前看起来像这样:
pipeline {
agent none
tools {
maven 'M3'
}
stages {
stage('Build') {
agent { label 'spine' }
steps {
checkout scm // needed, otherwise the workspace on the first step is empty
sh "mvn clean compile"
}
}
stage('Test') {
agent { label 'spine' }
steps {
sh "mvn verify" // fails because the workspace is empty aggain
junit '**/target/surefire-reports/TEST-*.xml'
}
}
}
}
该构建将失败,因为工作空间不会在同一执行程序上运行,因此不会在步骤之间继续执行。
编辑2
显然,有时这些步骤是在同一执行程序上运行的,有时则不是。(我们根据需要在mesos /
dcos集群上生成构建从属,因此在中间构建时更改执行程序将是一个问题)
我希望jenkins仅与当前执行程序一起运行,只要代理定义中的标签不变即可。
请参阅最佳实践7:请勿:在节点块内使用输入。在声明性管道中,通过agent
指令完成节点选择。
此处的文档描述了如何定义none
管线,然后使用阶段级agent
指令在所需节点上运行阶段。我也尝试了相反的方法(在某个节点上定义一个全局代理,然后none
在输入的阶段级上定义),但这不起作用。如果管道分配了一个从站,则不能在一个或多个特定阶段释放该从站。
这是我们管道的结构:
pipeline {
agent none
stages {
stage('Build') {
agent { label 'yona' }
steps {
...
}
}
stage('Decide tag on Docker Hub') {
agent none
steps {
script {
env.TAG_ON_DOCKER_HUB = input message: 'User input required',
parameters: [choice(name: 'Tag on Docker Hub', choices: 'no\nyes', description: 'Choose "yes" if you want to deploy this build')]
}
}
}
stage('Tag on Docker Hub') {
agent { label 'yona' }
when {
environment name: 'TAG_ON_DOCKER_HUB', value: 'yes'
}
steps {
...
}
}
}
}
通常,构建阶段在标记为“ yona”的构建从属服务器上执行,但是输入阶段在主服务器上运行。
null 所以我面临一个问题,如果打开,等待输入,如何停止它?我尝试过将它放在线程中并或使用作为标志,但它并没有停止
我想暂停在JavaFX应用程序线程上执行方法并等待用户与UI交互。不要冻结UI很重要。 例子: 我应该如何实现< code>pause()和< code>resume()方法?< br >事件处理程序的执行应在< code>pause()处等待;调用,直到用户按下< code>resume按钮并且调用< code>resume方法。
我正在使用声明性语法的Jenkins Pipeline,目前有以下阶段: 准备 构建(两组平行的步骤) 测试(也是两组平行的步骤) 询问是否/在何处部署 部署 对于步骤1、2、3和5,我需要和代理(一个执行者),因为他们在工作区上做实际工作。对于步骤4,我不需要一个,并且我不希望在等待用户输入时阻止可用的执行器。对于经典的脚本语法,这似乎被称为“flyweight”或“lightweight”执行
问题内容: 我的Jenkins 2.19.4使用管道:声明式代理程序API 1.0.1。如果您无法定义变量来分配读取的属性,那么如何使用readProperties? 例如,要捕获SVN版本号,我目前以脚本样式使用以下代码捕获它: 然后我可以使用: 由于以声明式定义svnProp是不合法的,因此如何使用readProperties? 问题答案: 您可以使用标记内的步骤来运行任意管道代码。 所以符合
问题内容: 我正在将Jenkins Pipeline与声明性语法一起使用,目前处于以下阶段: 准备 构建(两组并行的步骤) 测试(也是两组平行的步骤) 询问是否/在哪里部署 部署 对于步骤1、2、3和5,我需要和代理(执行者),因为它们在工作区上进行实际工作。对于步骤4,我不需要一个,并且我不想在等待用户输入时阻止我可用的执行程序。对于经典的脚本化语法,这似乎被称为“轻量级”执行器或“轻量级”执行
问题内容: 我正在尝试制作一个暂停用户输入的简单命令。我认为在Bash脚本中它将很有用。 这是我的代码: 它甚至不会暂停供用户输入。 我之前尝试过使用getch()(ncurses)。发生的是,屏幕变黑了,当我按下一个键时,它又回到了原来的屏幕上,我看到了: 这是我想要的。但是我想要的只是DOS / Windows 中的命令(我使用Linux)。 问题答案: 从GNU C库手册: 函数:char