Представление Jenkins в сборке, охватывающее несколько исполнений плагинов (разработка плагинов)

В настоящее время я разрабатываю подключаемый модуль Jenkins, совместимый с Pipeline. Плагин выполняет тесты в другой программе, сохраняет результаты тестов как артефакты и создает представление отчета в сборке.

Моя проблема в том, что если я запускаю плагин несколько раз (скажем, на разных этапах конвейера), он будет создавать новое представление отчета для каждого выполнения. Все эти представления содержат одно и то же содержимое (последние результаты выполнения), поскольку Jenkins сохраняет только один набор переменных для всех страниц. Эти переменные перезаписываются каждый раз при запуске плагина.

Мое представление — это базовое действие, как описано в расширенном руководстве по подключаемому модулю Jenkins.

public class xxxAction implements RunAction2

который вызывается из моего xxxBuilder.java

@Override
public void perform(Run<?, ?> run, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {
...
run.addAction(new xxxAction())
...
}

Как я могу проверить/получить доступ к моему уже существующему представлению или загрузить значения переменных, которые Дженкинс сохранил из последнего выполнения моего плагина, без создания нового представления. Моя цель — иметь одно представление отчета в сборке, где я могу отображать данные всех исполнений моего плагина в этой сборке.


person Dragonchild    schedule 02.03.2020    source источник


Ответы (1)


После того, как мне очень повезло, когда я просеивал фрагменты кода на codota, мне удалось заменить свое представление (и, следовательно, пересчитать содержимое) при каждом выполнении, сохраняя при этом данные в нем через окончательный пользовательский объект. Я добавляю и заменяю действие следующим образом (есть и функции замены):

if (run.getActions(PROVEtechAction.class).isEmpty()) {
    run.addAction(new PROVEtechAction());
} else {
    run.removeAction(run.getAction(PROVEtechAction.class));
    run.addAction(new PROVEtechAction());
}

Мой объект для хранения моих данных выглядит так:

public final class ResultObjects {

private static ArrayList<ResultObjects> TestResultList = new ArrayList<>();

public static ArrayList<ResultObjects> getTestResultList() {
    final ArrayList<ResultObjects> res = new ArrayList<>(TestResultList);
    return res;
}

public String someData;

...

public ResultObjects() {
    TestResultList.add(this);
    this.someData = null;
    ...
}
}

Это в основном просто статический список, в который я добавляю свои результаты.

person Dragonchild    schedule 02.03.2020