TeamCity загружает пользовательский плагин, но нет доказательств, что код плагина запускается
Я играю с установкой TeamCity и разрабатываю плагин, расширяющий BuildServerAdapter. Когда я его упаковываю и устанавливаю на сервер, teamcity-server.log содержит записи для моего плагина:
- найден при сканировании папки плагинов (.BuildServer\plugins)
- регистрирующий плагин агента из плагина сервера
- загружается в общий загрузчик классов
- загружен
Плагин также указан на странице плагинов в администрировании сервера.
Помимо этого... ничего. Я ввел в различные записи журнала, как с помощью logger, так и с System.out, и я их не вижу. Я даже добавил исключение в конструктор, и я не вижу никаких доказательств этого ни в системных журналах. Когда происходит сборка, снова нет доказательств, что мой код вызывается.
public class CustomBuildServerAdapter extends BuildServerAdapter {
private SBuildServer myBuildServer;
private static final Logger LOG = Logger.getLogger(CustomBuildServerAdapter.class);
private void debug(String msg) { LOG.debug(msg); System.out.println(msg); }
public CustomBuildServerAdapter(SBuildServer aBuildServer) throws Exception {
throw new Exception("constructor is being called, at least we know that...");
//myBuildServer = aBuildServer;
//debug("constructor");
}
public void register() {
debug("registering");
myBuildServer.addListener(this);
debug("registered");
}
public void buildFinished(SRunningBuild build) {
debug("build finished");
postMessage(build.getFullName() + " - " + build.getStatusDescriptor().getText());
debug("message posted");
}
...
Почтовый индекс, который я копирую в .BuildServer\plugins
, имеет следующую структуру:
- MyTeamCityPlugin.zip
- teamcity.plugin.xml
- Сервер
- MyTeamCityPlugin.jar
- Пакеты пакетов, содержащие файлы классов
- META-INF
- встроенный сервер-plugin.xml
- MANIFEST.MF
Глядя на другие плагины, они используют следующую структуру, поэтому я тоже пробовал это.
- MyTeamCityPlugin.zip
- MyTeamCityPlugin
- teamcity.plugin.xml
- MyTeamCityPlugin.jar
- Пакеты пакетов, содержащие файлы классов
- META-INF
- встроенный сервер-plugin.xml
- MANIFEST.MF
My build-server-plugin.xml содержит следующее:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="constructor">
<bean id="myplugin" class="com.blah.blah.blah.CustomBuildServerAdapter" init-method="register"/>
</beans>
Я участвую в этом, так как teamcity-server.log указывает, что он знает о плагине и больше не генерирует исключение, пытающееся загрузить его. К сожалению, не заблуждение - это не то же самое.
Используя сценарии сборки ant из плагина примера, я получаю следующую ошибку, поэтому я вручную упаковываю вещи. Это приводит к, казалось бы, успешной нагрузке, указанной выше.
Не удалось инициализировать контекст spring для плагина MyTeamCityPlugin. Ошибка при создании bean с именем "simpleRunnerRunType": не удалось выполнить экземпляр bean.
Может ли кто-нибудь дать мне удар, который мне нужен, чтобы он работал правильно?
Ответы
Ответ 1
Веб-сайт описывает это как легко (да, если он работает):
1. Shut down TeamCity server.
2. Copy the zip archive with the plugin to <TeamCity Data Directory>/plugins.
3. Start the TeamCity server: the plugin files will be unpacked and processed automatically.
Существует также онлайн-пошаговое руководство по установке плагина TeamCity здесь.
Ответ 2
Вам нужно использовать следующий код:
Loggers.SERVER.info("Your message");
Это приведет к регистрации на teamcity-server.log. Класс Loggers также содержит другие статические поля, такие как AUTH, VCS и т.д. Каждый из них соответствует отдельному файлу журнала (например, teamcity-vcs.log, teamcity-auth.log и т.д.). Чтобы использовать этот код, вам также нужно добавить следующую зависимость в pom.xml (для Maven):
<dependency>
<groupId>com.intellij</groupId>
<artifactId>openapi</artifactId>
<version>7.0.3</version>
<scope>provided</scope>
</dependency>
Это было протестировано с Teamcity 8.1.