Как я изобрел свой Jenkins Emailer
Велкам! Второй пост не задержался. Как и обещал, расскажу о том, как мне удалось, казалось бы, из невозможного сделать возможное (изобрести свой велосипед). Применив хитрость с Jenkins API, как было показано в предыдущем посте, я не только добыл нужную мне информацию из недр этого чУдного инструмента, но и заставил ее приносить пользу проекту. Итак, по порядку. Если Jenkins предоставляет возможность получать данные в формате JSON - значит мы можем легко и просто обрабатывать эти данные. Я буду приводить в пример некоторые куски кода, которые являются ключевыми. Так вот! Вернемся к нашим баранам. Имея URL к JSON файлу, скачать его можно так (осторожно: Java code detected :)) :
public static String callURL(URL url) {
StringBuilder sb = new StringBuilder();
URLConnection urlConn = null;
InputStreamReader in = null;
try {
urlConn = url.openConnection();
if (urlConn != null)
urlConn.setReadTimeout(60 * 1000);
if (urlConn != null && urlConn.getInputStream() != null) {
in = new InputStreamReader(urlConn.getInputStream(),
Charset.defaultCharset());
BufferedReader bufferedReader = new BufferedReader(in);
if (bufferedReader != null) {
int cp;
while ((cp = bufferedReader.read()) != -1) {
sb.append((char) cp);
}
bufferedReader.close();
}
}
in.close();
} catch (Exception e) {
LOG.error("Exception while calling URL:"
+ url.toString());
}
return sb.toString();
}
Метод принимает адрес (URL), а возвращает непосредственно содержание JSON файла в строковом представлении. Далее нам нужно дессериализовать JSON в объект JobObject. Это очень просто сделать с помощью библиотеки Google GSON.
public static Object jsonToObject(String json, Class c) {
Gson gson = new Gson();
Object obj = gson.fromJson(json, c);
return obj;
}
В данном случае был создал класс JobObject, в котором я сохранял интересующую меня информацию:
public class JobObject {
private long duration;
private long estimatedDuration;
private String fullDisplayName;
private int number;
private String result;
private long timestamp;
private String url;
private String builtOn;
private String RUNNING_STATUS = "RUNNING";
private BuildInfo buildInfo;
private ArrayList actions;
// Getters and setters
public String getStatus() {
if (result == null) {
return RUNNING_STATUS;
}
return result;
}
public boolean finished() {
return !getStatus().equals(RUNNING_STATUS);
}
}
Таким образом, имея набор JsonObject, я написал еще пару классов хелперов и обработчиков, с помощью которых отбирал для себя только те JobObject, которые имели статус finished:
public static List getFinishedJobs(List jobs) {
List finishedJobs = new ArrayList();
for (JobObject job : jobs) {
if (job.finished()) {
finishedJobs.add(job);
}
}
return finishedJobs;
}
Имея на руках все козыри, я преобразовал (переопределил метод toString) JobObject в тесктовое представление.
Job 4.9.1.1_Tests #91 is FINISHED.
Job Status - SUCCESS.
Build info: PRE-RELEASE BUILD 12dev.0228.zip
You can find detailed information by the following link:
http://host:port/job/4.9.1.1_Branch_Tests/91/
Failed: 24 Total: 480
В итоге: использовав Apache Commons Email, я отправляю данные на почтовые ящики, тем самым оповещая всех о результатах наших тестов. Хотите и вам одно сброшу ;)