簡體   English   中英

通過Groovy Postbuild優先考慮Jenkins Build

[英]Prioritize Jenkins Build via Groovy Postbuild

我想通過Groovy Postbuild將作業安排在Jenkins的構建隊列的頂部。

例如,對於Build X

如果以前構建隊列如下所示:

  • 通用版本1
  • 通用版本2
  • 通用版本3

現在看起來應該像這樣:

  • X版
  • 通用版本1
  • 通用版本2
  • 通用版本3

到目前為止,我已經能夠使用

def waitingItem = Jenkins.get().getQueue().schedule(job, 0)

if (waitingItem == null) {
    manager.listener.logger.println "Error scheduling ${job}!"
} else {
    manager.listener.logger.println "${job.name} was scheduled!"
}

但現在我也希望waitingItem位於隊列的頂部。

任何幫助深表感謝。

好了,經過無數小時的瀏覽,我能夠提出一個Groovy Postbuild腳本來執行以下操作:完成構建后,它會觸發另一個構建(我們稱其為buildToBeTriggered),並且buildToBeTriggered會自動推送到隊列的前面。

代碼如下:

import hudson.model.AbstractProject
import hudson.model.Queue
import hudson.model.queue.QueueSorter
import jenkins.model.Jenkins

def job = (AbstractProject)Jenkins.get().getItem('gcimpoies-toTrigger')
def isSuccess = manager.getResult() == 'SUCCESS'
def isRelease = manager.getEnvVariable('RELEASE') == 'true'
def secondsToWait = 20

if (isSuccess) {

def waitingItem = Jenkins.get().getQueue().schedule(job, 0)
if (waitingItem == null) {
    manager.listener.logger.println "Error scheduling ${job}!"
} else {
    manager.listener.logger.println "${job.name} was scheduled!"
}
Thread.sleep(secondsToWait * 1000)

//replace the original queue sorter with one that will place our project build first in the queue
QueueSorter originalQueueSorter = Jenkins.get().getQueue().getSorter()

AcceleratedBuildNowSorter acceleratedBuildNowSorter = new AcceleratedBuildNowSorter(job, originalQueueSorter)
Jenkins.get().getQueue().setSorter(acceleratedBuildNowSorter);

// we sort the queue so that our project is next to be built on the list
Jenkins.get().getQueue().getSorter().sortBuildableItems(Jenkins.getInstance().getQueue().getBuildableItems())

}

class AcceleratedBuildNowSorter extends QueueSorter {

private final AbstractProject project
private final QueueSorter originalQueueSorter
private final AcceleratedBuildNowComparator comparator

AcceleratedBuildNowSorter(AbstractProject project, QueueSorter originalQueueSorter) {
    this.project = project
    this.originalQueueSorter = originalQueueSorter
    comparator = new AcceleratedBuildNowComparator(this.project)
}

@Override
void sortBuildableItems(List<Queue.BuildableItem> buildables) {
    if (this.originalQueueSorter != null) {
        this.originalQueueSorter.sortBuildableItems(buildables)
    }
    Collections.sort(buildables, comparator)
}
}

class AcceleratedBuildNowComparator implements Comparator<Queue.BuildableItem> {

private final AbstractProject mostPriorityProject;

AcceleratedBuildNowComparator(AbstractProject mostPriorityProject) {
    this.mostPriorityProject = mostPriorityProject;
}

int compare(Queue.BuildableItem buildableItem0, Queue.BuildableItem buildableItem1) {
    AbstractProject<?, ?> project0 = (AbstractProject<?, ?>) buildableItem0.task
    AbstractProject<?, ?> project1 = (AbstractProject<?, ?>) buildableItem1.task
    if (project0.equals(mostPriorityProject)) {
        return -1
    }
    if (project1.equals(mostPriorityProject)) {
        return 1
    }
    return 0
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM