Jenkins - 运行 如果新工作完成,每晚工作时间长吗?
Jenkins - run long job nightly if new work done?
现在,我有两套基准测试,一套短,一套长。每个分支机构签到时的简短 运行 秒。其中设置为 运行 的是一个参数——SHORT 或 LONG。长的总是 运行 每晚在 dev 分支上。如果今天分支构建成功,如何触发其他分支构建和运行长基准?
您可以创建另一个调用带有 LONG 参数的参数化管道的管道,例如:
stage('long benchmark') {
build job: 'your-benchmark-pipeline', parameters: [string(name: 'type', value: 'LONG')]
}
配置此新管道时,您可以勾选 Build Triggers
部分中的 Build after other projects are built
复选框,并选择成功完成后应触发哪些短基准测试(默认行为)。
如果你想 运行 那些只在晚上进行的长时间测试 - 我发现最简单的方法是复制作业并修改它,让它在晚上触发,并在正常作业之后添加额外的检查, IE。您的 post-commit 作业只做短测试,每晚触发的先做短测试,然后(如果没有错误)做长测试。
我发现这比在某些情况下链接作业增加的复杂性更容易处理,例如评估一天中的时间以跳过某些测试。
示例第一个作业在每次提交后 运行s
node() {
stage('Build') {
// Build
}
stage('Short Test') {
// Short Test
}
}
第二个每晚触发的作业
node() {
stage('Build') {
// Build
}
stage('Short Test') {
// Short Test, fail the build here when not successful
}
stage('Long Tests')
// Long Test, runs only when short test successful
}
}
编辑
一个解决方案,在一个工作中就完成了所有工作,但是它增加了很多复杂性,并使一些后续用例更难集成,即集成测试分支的不同通知、构建持续时间的跟踪等。我仍然发现将它分成 2 个工作更易于管理。
必须将以下作业配置为由 post 提交挂钩 和 夜间计时器触发。它 运行 是
的长期测试
- 最后一次构建比设置更早(您不希望它从昨晚开始触发),
- 上次 运行 成功(不想 运行 对损坏的构建进行长时间测试),并且
- 由所述计时器触发(不想在签到时触发)。
def runLongTestMaxDiffMillis = 20000
def lastRunDiff = (currentBuild.getStartTimeInMillis().toInteger() - currentBuild.getPreviousBuild().getStartTimeInMillis().toInteger())
def lastBuildTooOld = (lastRunDiff > runLongTestMaxDiffMillis)
def isTriggeredByTimer = currentBuild.getBuildCauses('hudson.triggers.TimerTrigger$TimerTriggerCause')
def lastBuildSuccessful = (currentBuild.getPreviousBuild().getResult() == 'SUCCESS')
def runLongTest = (!lastBuildTooOld && isTriggeredByTimer && lastBuildSuccessful)
node() {
if (runLongTest) {
println 'Running long test'
} else {
println 'Skipping long test'
}
}
您可以使用 Schedule Build Plugin 来安排在短作业成功时构建长作业。
每个分支上的短作业运行s,当某个分支的构建成功时,它会安排一个带有参数的分支的长作业(在晚上)的构建,所以长作业将 运行 在这个特定的分支上。
现在,我有两套基准测试,一套短,一套长。每个分支机构签到时的简短 运行 秒。其中设置为 运行 的是一个参数——SHORT 或 LONG。长的总是 运行 每晚在 dev 分支上。如果今天分支构建成功,如何触发其他分支构建和运行长基准?
您可以创建另一个调用带有 LONG 参数的参数化管道的管道,例如:
stage('long benchmark') {
build job: 'your-benchmark-pipeline', parameters: [string(name: 'type', value: 'LONG')]
}
配置此新管道时,您可以勾选 Build Triggers
部分中的 Build after other projects are built
复选框,并选择成功完成后应触发哪些短基准测试(默认行为)。
如果你想 运行 那些只在晚上进行的长时间测试 - 我发现最简单的方法是复制作业并修改它,让它在晚上触发,并在正常作业之后添加额外的检查, IE。您的 post-commit 作业只做短测试,每晚触发的先做短测试,然后(如果没有错误)做长测试。
我发现这比在某些情况下链接作业增加的复杂性更容易处理,例如评估一天中的时间以跳过某些测试。
示例第一个作业在每次提交后 运行s
node() {
stage('Build') {
// Build
}
stage('Short Test') {
// Short Test
}
}
第二个每晚触发的作业
node() {
stage('Build') {
// Build
}
stage('Short Test') {
// Short Test, fail the build here when not successful
}
stage('Long Tests')
// Long Test, runs only when short test successful
}
}
编辑
一个解决方案,在一个工作中就完成了所有工作,但是它增加了很多复杂性,并使一些后续用例更难集成,即集成测试分支的不同通知、构建持续时间的跟踪等。我仍然发现将它分成 2 个工作更易于管理。
必须将以下作业配置为由 post 提交挂钩 和 夜间计时器触发。它 运行 是
的长期测试- 最后一次构建比设置更早(您不希望它从昨晚开始触发),
- 上次 运行 成功(不想 运行 对损坏的构建进行长时间测试),并且
- 由所述计时器触发(不想在签到时触发)。
def runLongTestMaxDiffMillis = 20000
def lastRunDiff = (currentBuild.getStartTimeInMillis().toInteger() - currentBuild.getPreviousBuild().getStartTimeInMillis().toInteger())
def lastBuildTooOld = (lastRunDiff > runLongTestMaxDiffMillis)
def isTriggeredByTimer = currentBuild.getBuildCauses('hudson.triggers.TimerTrigger$TimerTriggerCause')
def lastBuildSuccessful = (currentBuild.getPreviousBuild().getResult() == 'SUCCESS')
def runLongTest = (!lastBuildTooOld && isTriggeredByTimer && lastBuildSuccessful)
node() {
if (runLongTest) {
println 'Running long test'
} else {
println 'Skipping long test'
}
}
您可以使用 Schedule Build Plugin 来安排在短作业成功时构建长作业。
每个分支上的短作业运行s,当某个分支的构建成功时,它会安排一个带有参数的分支的长作业(在晚上)的构建,所以长作业将 运行 在这个特定的分支上。