In the installation there seems to be a file missing: BuildFailing.gif
See the log below:
[2012-03-12 11:38:15,862] WARN – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: Could not send email to xyz@xyz.com See DEBUG output and/or STDOUT for Stacktrace
org.springframework.mail.MailSendException; nested exception details (1) are:
Failed message 1:
javax.mail.MessagingException: IOException while sending message;
nested exception is:
java.io.FileNotFoundException: c:\TeamCity\webapps\ROOT\plugins\tcPrettyEmailer\img\BuildFailing.gif (Das System kann die angegebene Datei nicht finden)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:930)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:403)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:342)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:338)
at prettyemailer.teamcity.PrettyEmailNotificator.doNotifications(PrettyEmailNotificator.java:231)
at prettyemailer.teamcity.PrettyEmailNotificator.notifyBuildFailing(PrettyEmailNotificator.java:131)
at jetbrains.buildServer.notification.impl.UserRulesAwareNotificationListener$NotificatorEventAdapter.buildFailing(UserRulesAwareNotificationListener.java:105)
at jetbrains.buildServer.notification.impl.UserRulesAwareNotificationListener.buildFailing(UserRulesAwareNotificationListener.java:14)
at jetbrains.buildServer.notification.NotificationProcessor$10.call(NotificationProcessor.java)
at jetbrains.buildServer.notification.NotificationProcessor$16.run(NotificationProcessor.java:7)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Hi, it seems not to be a problem with the installer. Apparently the file is missing in the jar file. After updating to TC 4.0.2, we had to create a file named like this again, otherwise the build failing messages would not be sent. All other notifications work (failed, successful, …), but not failing (maybe it’s not activated in your environment?). Thanks for the great plugin!
Hi Frank. Are you really using tc 4.0.2? We used to use that version but are happily running on 6.5.x now. Maybe that image doesn’t exist in tc4? Let me know if you would like further help.
Sorry, wrong version. Of course I upgrated to 7.0.2 from 7.0.1 were I had to do the same (copy and renamed BuildFailed.gif to BuildFailing.gif). As I said the problem only occurs with the Notification rule “Notify when the first error occurs”, otherwise failing messages won’t be generated. The following
images are in the webapps\ROOT\plugins\tcPrettyEmailer\img Folder:
BuildFailed.gif, BuildStarted.gif, BuildSuccessful.gif, cancelled.gif, fixed.gif, personal.gif, star.gif. A file named BuildFailing.gif is missing.
It should be possible. If you want to include the build status image then you would add something like <img src='cid:buildState000'> to the template. Have a look at header.vm for an example.
If you want to add a different image, you would need to attach that image to the email message. That would require some extra code in PrettyEmailMimeMessageHelper. Have a look near the bottom at the existing code that does the image attachments via calls to addInline().
When adding attachments to an email,using the Spring mail handler they are stored with a “key”. This key is then referred to in the HTML if one wants to reference the attachment for display in the HTML. buildState000 is simply the name of the key I used when attaching the file, and can be seen in the source code at line 60.
Ok, thanks for the info. I downloaded the src from sourceforge and made changes. How do I get the number of errors from getCompileErrors(). Looks like I cannot use getCompileErrors() in scalar context as getCompileErrors() > 0
Is tcPrettyEmail compatible with Teamcity 8? I’m trying to get it to work in our test environment and it’s silently failing; I get the default emails instead.
Hi Mark. It’s working for me in TC8. There is an extra notifier called Pretty Email in the Notifications tab of My Settings & Tools. It is addition to the standard email notifier. This is where you configure which builds this notifier watches.
I’m sorry, I see it now… thanks! I was expecting it to take over for the Email Notifier. You may want to add a note clarifying how it works to the documentation at http://sourceforge.net/apps/trac/tcplugins/wiki/TcPrettyEmail . Thanks again for your prompt answer!
We’re attempting to use this plugin with Teamcity 8, but are running into a strange error with the pluging starting up – it’s getting a FileNotFoundException when trying to initialize the Velocity template system:
2013-10-07 23:37:31,984] DEBUG – jetbrains.buildServer.SERVER – Unable to configure AvalonLogSystem : java.io.FileNotFoundException: /velocity.log (Permission denied)
java.lang.Exception: Unable to configure AvalonLogSystem : java.io.FileNotFoundException: /velocity.log (Permission denied)
at org.apache.velocity.runtime.log.AvalonLogSystem.init(AvalonLogSystem.java:92)
at org.apache.velocity.runtime.log.LogManager.createLogSystem(LogManager.java:127)
at org.apache.velocity.runtime.RuntimeInstance.initializeLogger(RuntimeInstance.java:553)
at org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:226)
at org.apache.velocity.app.VelocityEngine.init(VelocityEngine.java:80)
at prettyemailer.teamcity.PrettyEmailNotificator.initVelocity(PrettyEmailNotificator.java:103)
at prettyemailer.teamcity.PrettyEmailNotificator.register(PrettyEmailNotificator.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1544)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at jetbrains.buildServer.plugins.spring.SpringPluginLoader.pluginClassesLoaded(SpringPluginLoader.java:72)
at sun.reflect.GeneratedMethodAccessor49.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at jetbrains.buildServer.util.EventDispatcher.dispatch(EventDispatcher.java:115)
at jetbrains.buildServer.util.EventDispatcher$2.invoke(EventDispatcher.java:67)
at com.sun.proxy.$Proxy7.pluginClassesLoaded(Unknown Source)
at jetbrains.buildServer.plugins.PluginManagerImpl$2.visitPlugin(PluginManagerImpl.java:122)
at jetbrains.buildServer.plugins.PluginsCollection.foreachLoadedPlugins(PluginsCollection.java:107)
at jetbrains.buildServer.plugins.PluginManagerImpl.firePluginClassesLoaded(PluginManagerImpl.java:120)
at jetbrains.buildServer.plugins.PluginManagerImpl.loadPlugins(PluginManagerImpl.java:80)
at jetbrains.buildServer.web.plugins.PluginManagerConfigurator.initializePlugins(PluginManagerConfigurator.java:9)
at jetbrains.buildServer.web.impl.BuildServerConfigurator.loadConfiguration(BuildServerConfigurator.java:98)
at jetbrains.buildServer.maintenance.TeamCityDispatcherServlet$WebApplicationCreatorAndDestroyer.createApplication(TeamCityDispatcherServlet.java:15)
at jetbrains.buildServer.maintenance.StartupProcessor.doApplicationStarting(StartupProcessor.java:73)
at jetbrains.buildServer.maintenance.StartupProcessor.processConcreteStage(StartupProcessor.java:490)
at jetbrains.buildServer.maintenance.StartupProcessor.processConcreteStageSafe(StartupProcessor.java:479)
at jetbrains.buildServer.maintenance.StartupProcessor.processTeamCityLifecycle(StartupProcessor.java:435)
at jetbrains.buildServer.maintenance.StartupProcessor.access$000(StartupProcessor.java:85)
at jetbrains.buildServer.maintenance.StartupProcessor$1.run(StartupProcessor.java:1)
at java.lang.Thread.run(Thread.java:724)
Do you have any idea where that /velocity.log path would be attempting to read or write from? We have everything running under a single user, teamcity, with the core server installed in /opt/teamcity/8.0.4 and the data directory set to /mnt/teamcity/build. Our pretty-email configuration block in main-config.xml just sets the smtp configuration for now.
Interesting. I’ll give that a try – we’re starting this from an upstart script so I’m not sure where it’s going to path things from – I suppose the /velocity.log bit actually means the root of the filesystem. Thanks for your help, and for the plugin, it’s been a great help over the years!
ok. Thanks for the update. I’ll look at some way of asking TeamCity for its log dir and try to create it in there.
Aliaksei said:
October 30, 2013 at 14:24
Hi Netwolf,
Thanks a lot for your tcPrettyEmail plugin! Though now I have to ask for some help: we have a strange issue with notification not working for “assigned” investigations in TC8.
In TC7 everything was smooth, we switched most of notification rules to tcPrettyEmail. After the recent upgrade to TC8.0.4 all looked fine, all usual notifications were sent out as before.
However recently we noticed that one rule has no effect: “System wide events – Investigation assigned to me”. It works when switched on in standard TC-way, but not in tcPrettyEmail.
So far I don’t see anything special in logs for this matter. Could you please point out the debug direction?
Hi Aliaksei. Perhaps something has changed in tc8. I thought I had tested some early builds of tc8 but I’m not running 8.0.4 yet. Also I had all my computers stolen from my house so am not getting an opportunity to work on this project at the moment.
I really like the plugin, it’s a big improvement on the default email, but I was wondering if it would be possible for the default pretty template to have some Git information. At the very least, it seems like the branch name that got built should be displayed somewhere. The default email has the branch name and the Git commit.
If not for the default template, is it something I would be able to add in my own template? I haven’t looked too much into it yet, but am I going to have access to the Git information?
We were excited to have found PrettyEmail. It seems like it produce more meaningful emails than the standard email that comes with TeamCity. We have installed the plug and configured the main-config.xml. When we attempt to run a build, we don’t get the emails. After we dug around in the teamcity-server log we found the following error:
WARN – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: Could not assemble the BuildStarted prettyemail for bt6 See DEBUG output and/or STDOUT for Stacktrace
Any idea what we have done incorrectly?
We are running TeamCity version: 8.0.5 (build 27692), data format version 628
Could you enable debug logging in TeamCity and post the stack trace for the error? There is information on the TeamCity documentation site about how to do that. It’s a change to the log4j config file.
For some reason the plugin can’t find the template files. Some users have this issue and I’m not sure why. I’d suggest downloading the extra zip file containing the templates and unzipping it somewhere. Then update the main-config.xml to set the template location.
I suspect that would require some enhancements to the plugin.
I wonder if that would be best served by some sort of extra plugin architecture, or at least a standard interface that renderers implement.
The email messages are built using velocity. There might be a standard way to extend velocity to load them. I’ll have a look into it. I’m in the process of moving to github. That at least gives me a way to track these sorts of requests.
No. Sorry I didn’t get very far with that. It’s a quite specific use case which seems like it should have a more generic solution but that’s about as far as I got with it.
Daniel said:
June 10, 2014 at 09:48
The teamcity-server.log says ‘Could not assemble the BuildSuccessful prettyemail for bt4 See DEBUG output and/or STDOUT for Stacktrace’. I’m using TeamCity 8.1.2. Where can i find the Debug output?
The default log level in TeamCity is info. To enable debug logging you need to edit the log4j.xml file. There is an article on the TeamCity documentation site about how to enable debug logging.
I tried the fix for Digitalje, copy the templates and change the template path. It seems to work for that, but Debug output says an authentication error. I wonder why teamcity can send the normal build mails with the same settings. Thanks for your help! I’ll reply if i get it to work 😉
Daniel said:
June 10, 2014 at 10:36
I can’t fix the authentication error. The Debug output says:
[2014-06-10 12:28:22,814] WARN – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: Could not send email to xxx (xxx@xxx.xx) See DEBUG output and/or STDOUT for Stacktrace
[2014-06-10 12:28:22,814] DEBUG – jetbrains.buildServer.SERVER – Authentication failed; nested exception is javax.mail.AuthenticationFailedException: No authentication mechansims supported by both server and client
org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: No authentication mechansims supported by both server and client
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:392)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:336)
at prettyemailer.teamcity.PrettyEmailNotificator.doNotifications(PrettyEmailNotificator.java:189)
at prettyemailer.teamcity.PrettyEmailNotificator.notifyBuildSuccessful(PrettyEmailNotificator.java:228)
at jetbrains.buildServer.notification.impl.UserRulesAwareNotificationListener$NotificatorEventAdapter.buildSuccessful(UserRulesAwareNotificationListener.java:235)
at jetbrains.buildServer.notification.impl.UserRulesAwareNotificationListener.buildSuccessful(UserRulesAwareNotificationListener.java:55)
at jetbrains.buildServer.notification.NotificationProcessor$2.call(NotificationProcessor.java)
at jetbrains.buildServer.notification.NotificationProcessor$18.run(NotificationProcessor.java:5)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: javax.mail.AuthenticationFailedException: No authentication mechansims supported by both server and client
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:765)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:685)
at javax.mail.Service.connect(Service.java:345)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:389)
… 11 more
The server don’t need username and password, so i removed all the optional attributes from the main-config.xml. There are only the host, port and from-address attributes in the smtp tag. But it’s still the same exception.
Can you tell me which mail server are you using? Also, you might need to restart TeamCity after removing entries from the pretty email config. I’m not sure how well tested config changes are since it doesn’t happen often.
Daniel said:
June 12, 2014 at 07:32
Hi netwolfuk!
I use an exchange email server in the same domain and i fixed my problem using an email account with username and password. I guess the plugin has a problem with emailservers without username and password. A restart did not work.
Thank you for your fast reply and thank you for this great plugin.
Is it possible to add further informations to the email-BuildSuccessful template like the code coverage percentage from dotCover report?
That’s great. Thanks for letting me know it worked with a certain type of exchange email account. I’ll email you about the specifics so I can add it to the documentation.
Your request for coverage is similar to another recent request. I’ve been thinking about a generic solution and think that having a way to include an HTML file into the email is probably the way forward. I imagine that the plugin could look in the artifacts from TeamCity for an email-include directory and build that into the body on the pretty email message. There would need to be some smarts to also include any images inside html but I think it should be possible. It would be an exercise for the user to figure out how to generate applicable HTML to include in the email.
I just downloaded the tcPrettyEmail plugin but I can’t figure out how to configure it? The links to the documentation for it go to the web hooks wiki at source forge. The documentation doesn’t seem to exist anymore. Is there somewhere else I can find out how to use the plugin?
Sorry if this is a basic question (I’m very new to TC), but where do I put the XML you have in the example configuration files? It says in the configuration for the email notifier to edit the files in /config/_notifications/, but I don’t see that directory on the file system.
Also will this plugin override the TC email notifier or do I need to disable it?
Thanks for you help, I’m looking forward to getting this up and running.
@netwolfuk – First, thank you very much for the excellent plugin. Your e-mail notifications are MUCH nicer than the built-in ones.
I recently submitted an issue on GitHub; I wasn’t sure if you prefer reporting issues here on the blog or on GitHub, so I did both. The details can be found here: https://github.com/tcplugins/tcPrettyEmail/issues/2 but there seems to be a NullPointerException inside the tcPretty plugin.
Any help provided would be much appreciated; thanks so much!!
Hi thanks for reporting it. Github is preferred. I should update this page to reflect that. I had not noticed that the specific case was failing to send an email.
October 5, 2011 at 21:16
[…] you find a bug or have feature request, please post a comment below or on the tcPrettyEmail bugs page […]
April 4, 2012 at 10:09
In the installation there seems to be a file missing: BuildFailing.gif
See the log below:
[2012-03-12 11:38:15,862] WARN – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: Could not send email to xyz@xyz.com See DEBUG output and/or STDOUT for Stacktrace
org.springframework.mail.MailSendException; nested exception details (1) are:
Failed message 1:
javax.mail.MessagingException: IOException while sending message;
nested exception is:
java.io.FileNotFoundException: c:\TeamCity\webapps\ROOT\plugins\tcPrettyEmailer\img\BuildFailing.gif (Das System kann die angegebene Datei nicht finden)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:930)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:403)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:342)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:338)
at prettyemailer.teamcity.PrettyEmailNotificator.doNotifications(PrettyEmailNotificator.java:231)
at prettyemailer.teamcity.PrettyEmailNotificator.notifyBuildFailing(PrettyEmailNotificator.java:131)
at jetbrains.buildServer.notification.impl.UserRulesAwareNotificationListener$NotificatorEventAdapter.buildFailing(UserRulesAwareNotificationListener.java:105)
at jetbrains.buildServer.notification.impl.UserRulesAwareNotificationListener.buildFailing(UserRulesAwareNotificationListener.java:14)
at jetbrains.buildServer.notification.NotificationProcessor$10.call(NotificationProcessor.java)
at jetbrains.buildServer.notification.NotificationProcessor$16.run(NotificationProcessor.java:7)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
April 6, 2012 at 22:34
Hi Frank. It appears that teamcity is not finding all the resources. You could try manually setting the path by following the instructions at https://netwolfuk.wordpress.com/2011/10/05/tcprettyemail-update-for-teamcity-6-5-x/#comment-26611
April 11, 2012 at 06:13
Hi, it seems not to be a problem with the installer. Apparently the file is missing in the jar file. After updating to TC 4.0.2, we had to create a file named like this again, otherwise the build failing messages would not be sent. All other notifications work (failed, successful, …), but not failing (maybe it’s not activated in your environment?). Thanks for the great plugin!
April 11, 2012 at 10:44
Hi Frank. Are you really using tc 4.0.2? We used to use that version but are happily running on 6.5.x now. Maybe that image doesn’t exist in tc4? Let me know if you would like further help.
April 11, 2012 at 11:05
Sorry, wrong version. Of course I upgrated to 7.0.2 from 7.0.1 were I had to do the same (copy and renamed BuildFailed.gif to BuildFailing.gif). As I said the problem only occurs with the Notification rule “Notify when the first error occurs”, otherwise failing messages won’t be generated. The following
images are in the webapps\ROOT\plugins\tcPrettyEmailer\img Folder:
BuildFailed.gif, BuildStarted.gif, BuildSuccessful.gif, cancelled.gif, fixed.gif, personal.gif, star.gif. A file named BuildFailing.gif is missing.
April 12, 2012 at 01:25
Ah. Thanks for taking the time to explain it. I’ll have a look at that when my laptop is back from being repaired.
April 17, 2012 at 11:04
Hi Frank. I’ve released a new version which should now contain the two missing gif files (just copies of the BuildFailed.gif).
You can get it from the download page.
April 17, 2012 at 11:30
Thanks a lot!
June 6, 2012 at 21:56
How I attach (or use) my own image for failed build ? Can I put
BuildFailed.gif somewhere on the server ?
June 6, 2012 at 23:10
Hi Jas.
It’s simple to change the images and/or templates for tcPrettyEmail. Here is how to update the BuildFailed.gif
June 7, 2012 at 16:41
I would like to embed an image in the footer.vm of the templates. Is it possible by ?
June 7, 2012 at 23:26
It should be possible. If you want to include the build status image then you would add something like
<img src='cid:buildState000'>
to the template. Have a look at header.vm for an example.If you want to add a different image, you would need to attach that image to the email message. That would require some extra code in PrettyEmailMimeMessageHelper. Have a look near the bottom at the existing code that does the image attachments via calls to addInline().
June 8, 2012 at 01:47
I don’t see the source for PrettyEmailMimeMessageHelper. What the location of the source file
June 8, 2012 at 02:11
The source file is linked in the previous comment. Here is the full URL: http://tcplugins.svn.sourceforge.net/viewvc/tcplugins/tcPrettyEmail/trunk/src/main/java/prettyemailer/teamcity/PrettyEmailMimeMessageHelper.java?revision=134&view=markup
June 8, 2012 at 01:47
Also, what buildState000 means ? How it know what file to use for the image ?
June 8, 2012 at 02:14
When adding attachments to an email,using the Spring mail handler they are stored with a “key”. This key is then referred to in the HTML if one wants to reference the attachment for display in the HTML. buildState000 is simply the name of the key I used when attaching the file, and can be seen in the source code at line 60.
June 8, 2012 at 19:02
Ok, thanks for the info. I downloaded the src from sourceforge and made changes. How do I get the number of errors from getCompileErrors(). Looks like I cannot use getCompileErrors() in scalar context as getCompileErrors() > 0
July 9, 2013 at 18:24
Is tcPrettyEmail compatible with Teamcity 8? I’m trying to get it to work in our test environment and it’s silently failing; I get the default emails instead.
July 9, 2013 at 19:23
Hi Mark. It’s working for me in TC8. There is an extra notifier called Pretty Email in the Notifications tab of My Settings & Tools. It is addition to the standard email notifier. This is where you configure which builds this notifier watches.
July 9, 2013 at 20:55
I’m sorry, I see it now… thanks! I was expecting it to take over for the Email Notifier. You may want to add a note clarifying how it works to the documentation at http://sourceforge.net/apps/trac/tcplugins/wiki/TcPrettyEmail . Thanks again for your prompt answer!
July 9, 2013 at 21:45
Good point. I’ll add that. Thanks.
July 11, 2013 at 09:57
Done.
October 8, 2013 at 00:10
Hi there,
We’re attempting to use this plugin with Teamcity 8, but are running into a strange error with the pluging starting up – it’s getting a FileNotFoundException when trying to initialize the Velocity template system:
2013-10-07 23:37:31,984] DEBUG – jetbrains.buildServer.SERVER – Unable to configure AvalonLogSystem : java.io.FileNotFoundException: /velocity.log (Permission denied)
java.lang.Exception: Unable to configure AvalonLogSystem : java.io.FileNotFoundException: /velocity.log (Permission denied)
at org.apache.velocity.runtime.log.AvalonLogSystem.init(AvalonLogSystem.java:92)
at org.apache.velocity.runtime.log.LogManager.createLogSystem(LogManager.java:127)
at org.apache.velocity.runtime.RuntimeInstance.initializeLogger(RuntimeInstance.java:553)
at org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:226)
at org.apache.velocity.app.VelocityEngine.init(VelocityEngine.java:80)
at prettyemailer.teamcity.PrettyEmailNotificator.initVelocity(PrettyEmailNotificator.java:103)
at prettyemailer.teamcity.PrettyEmailNotificator.register(PrettyEmailNotificator.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1544)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at jetbrains.buildServer.plugins.spring.SpringPluginLoader.pluginClassesLoaded(SpringPluginLoader.java:72)
at sun.reflect.GeneratedMethodAccessor49.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at jetbrains.buildServer.util.EventDispatcher.dispatch(EventDispatcher.java:115)
at jetbrains.buildServer.util.EventDispatcher$2.invoke(EventDispatcher.java:67)
at com.sun.proxy.$Proxy7.pluginClassesLoaded(Unknown Source)
at jetbrains.buildServer.plugins.PluginManagerImpl$2.visitPlugin(PluginManagerImpl.java:122)
at jetbrains.buildServer.plugins.PluginsCollection.foreachLoadedPlugins(PluginsCollection.java:107)
at jetbrains.buildServer.plugins.PluginManagerImpl.firePluginClassesLoaded(PluginManagerImpl.java:120)
at jetbrains.buildServer.plugins.PluginManagerImpl.loadPlugins(PluginManagerImpl.java:80)
at jetbrains.buildServer.web.plugins.PluginManagerConfigurator.initializePlugins(PluginManagerConfigurator.java:9)
at jetbrains.buildServer.web.impl.BuildServerConfigurator.loadConfiguration(BuildServerConfigurator.java:98)
at jetbrains.buildServer.maintenance.TeamCityDispatcherServlet$WebApplicationCreatorAndDestroyer.createApplication(TeamCityDispatcherServlet.java:15)
at jetbrains.buildServer.maintenance.StartupProcessor.doApplicationStarting(StartupProcessor.java:73)
at jetbrains.buildServer.maintenance.StartupProcessor.processConcreteStage(StartupProcessor.java:490)
at jetbrains.buildServer.maintenance.StartupProcessor.processConcreteStageSafe(StartupProcessor.java:479)
at jetbrains.buildServer.maintenance.StartupProcessor.processTeamCityLifecycle(StartupProcessor.java:435)
at jetbrains.buildServer.maintenance.StartupProcessor.access$000(StartupProcessor.java:85)
at jetbrains.buildServer.maintenance.StartupProcessor$1.run(StartupProcessor.java:1)
at java.lang.Thread.run(Thread.java:724)
Do you have any idea where that /velocity.log path would be attempting to read or write from? We have everything running under a single user, teamcity, with the core server installed in /opt/teamcity/8.0.4 and the data directory set to /mnt/teamcity/build. Our pretty-email configuration block in main-config.xml just sets the smtp configuration for now.
Thanks for any pointers you can give us!
October 8, 2013 at 00:36
Hi Chris. Have you run the plugin before? Is it failing after upgrading tc or prettyemail or is this a fresh install?
October 8, 2013 at 04:08
I have indeed run the plugin before, though it’s been a year and a half or so since I set it up last time – this is a new install though.
October 8, 2013 at 02:54
I think the velocity log is created in the current directory relative to where you are when you start TeamCity. I suggest the following.
cd /opt/teamcity/8.0.4 && touch velocity.log && ./bin/teamcity-server.sh start
October 8, 2013 at 04:13
Interesting. I’ll give that a try – we’re starting this from an upstart script so I’m not sure where it’s going to path things from – I suppose the /velocity.log bit actually means the root of the filesystem. Thanks for your help, and for the plugin, it’s been a great help over the years!
October 8, 2013 at 05:00
Great. Let me know how you get on. Thanks for your complimentary feedback too. It’s really nice to know people appreciate one’s work.
October 8, 2013 at 14:20
I added velocity.log to the root of our filesystem, and that did the trick.
October 8, 2013 at 18:51
ok. Thanks for the update. I’ll look at some way of asking TeamCity for its log dir and try to create it in there.
October 30, 2013 at 14:24
Hi Netwolf,
Thanks a lot for your tcPrettyEmail plugin! Though now I have to ask for some help: we have a strange issue with notification not working for “assigned” investigations in TC8.
In TC7 everything was smooth, we switched most of notification rules to tcPrettyEmail. After the recent upgrade to TC8.0.4 all looked fine, all usual notifications were sent out as before.
However recently we noticed that one rule has no effect: “System wide events – Investigation assigned to me”. It works when switched on in standard TC-way, but not in tcPrettyEmail.
So far I don’t see anything special in logs for this matter. Could you please point out the debug direction?
November 8, 2013 at 17:58
Hi Aliaksei. Perhaps something has changed in tc8. I thought I had tested some early builds of tc8 but I’m not running 8.0.4 yet. Also I had all my computers stolen from my house so am not getting an opportunity to work on this project at the moment.
December 10, 2013 at 19:45
Hello,
I really like the plugin, it’s a big improvement on the default email, but I was wondering if it would be possible for the default pretty template to have some Git information. At the very least, it seems like the branch name that got built should be displayed somewhere. The default email has the branch name and the Git commit.
If not for the default template, is it something I would be able to add in my own template? I haven’t looked too much into it yet, but am I going to have access to the Git information?
Thanks!
January 15, 2014 at 13:24
Hello,
We were excited to have found PrettyEmail. It seems like it produce more meaningful emails than the standard email that comes with TeamCity. We have installed the plug and configured the main-config.xml. When we attempt to run a build, we don’t get the emails. After we dug around in the teamcity-server log we found the following error:
WARN – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: Could not assemble the BuildStarted prettyemail for bt6 See DEBUG output and/or STDOUT for Stacktrace
Any idea what we have done incorrectly?
We are running TeamCity version: 8.0.5 (build 27692), data format version 628
Any help would be greatly appreciated.
Thanks,
digitalje
January 15, 2014 at 13:51
Could you enable debug logging in TeamCity and post the stack trace for the error? There is information on the TeamCity documentation site about how to do that. It’s a change to the log4j config file.
January 15, 2014 at 15:26
Thank you for the quick response! Here is the output: [2014-01-15 10:12:30,563] DEBUG – jetbrains.buildServer.SERVER – PrettyEmailNotificator:doNotifications(BuildStarted) called for build bt6 [2014-01-15 10:12:30,589] WARN – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: Could not assemble the BuildStarted prettyemail for bt6 See DEBUG output and/or STDOUT for Stacktrace [2014-01-15 10:12:30,589] DEBUG – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: Attempting to send email using the following configuration [2014-01-15 10:12:30,589] DEBUG – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: from-address: **********@gmail.com [2014-01-15 10:12:30,589] DEBUG – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: from-name : CI Server [2014-01-15 10:12:30,589] DEBUG – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: host : smtp.gmail.com [2014-01-15 10:12:30,589] DEBUG – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: port : 587 [2014-01-15 10:12:30,589] DEBUG – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: username : ************ [2014-01-15 10:12:30,589] DEBUG – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: starttls-enabled: true [2014-01-15 10:12:30,589] DEBUG – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: password : HIDDEN [2014-01-15 10:12:30,589] DEBUG – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: template-path : /opt/TeamCity/tcPrettyEmail/templates/ [2014-01-15 10:12:30,589] DEBUG – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: attachment-path: /opt/TeamCity/tcPrettyEmail/img/ [2014-01-15 10:12:30,589] DEBUG – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: attach-images : true [2014-01-15 10:12:30,601] DEBUG – jetbrains.buildServer.SERVER – Unable to find resource ’email-BuildStarted.vm’ org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource ’email-BuildStarted.vm’ at org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:458) at org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:341) at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:831) at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:813) at org.apache.velocity.app.VelocityEngine.getTemplate(VelocityEngine.java:470) at prettyemailer.teamcity.PrettyEmailMimeMessageHelper.generateEmail(PrettyEmailMimeMessageHelper.java:45) at prettyemailer.teamcity.PrettyEmailNotificator.doNotifications(PrettyEmailNotificator.java:173) at prettyemailer.teamcity.PrettyEmailNotificator.notifyBuildStarted(PrettyEmailNotificator.java:223) at jetbrains.buildServer.notification.impl.UserRulesAwareNotificationListener$NotificatorEventAdapter.buildStarted(UserRulesAwareNotificationListener.java:166) at jetbrains.buildServer.notification.impl.UserRulesAwareNotificationListener.buildStarted(UserRulesAwareNotificationListener.java:19) at jetbrains.buildServer.notification.NotificationProcessor$1.call(NotificationProcessor.java:2) at jetbrains.buildServer.notification.NotificationProcessor$18.run(NotificationProcessor.java:1) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) [2014-01-15 10:12:32,575] DEBUG – ains.buildServer.util.WatchDog – Flush Queue start: 0 msec [2014-01-15 10:12:32,577] DEBUG – ains.buildServer.util.WatchDog – Flush Queue done: 2 msec [2014-01-15 10:12:33,110] DEBUG – buildLog.MessagesStateProvider – Flow started: -857168297, parent flow: -642892918 [2014-01-15 10:12:33,110] DEBUG – buildLog.MessagesStateProvider – Flow: -857168297 not found, creating it in flow: FlowMessagesState{myFlowId=-642892918, myParentState=null, myChildStates=[]}
January 15, 2014 at 18:05
For some reason the plugin can’t find the template files. Some users have this issue and I’m not sure why. I’d suggest downloading the extra zip file containing the templates and unzipping it somewhere. Then update the main-config.xml to set the template location.
http://sourceforge.net/projects/tcplugins/files/tcPrettyEmail_plugin/templates/
January 16, 2014 at 13:12
THANK YOU! Once I copied the templates it worked. It looks great. Thank you again for this great plugin.
January 16, 2014 at 14:30
Fantastic. I’m glad that fixed it.
May 15, 2014 at 13:50
Hello,
I just started using PrettyEmail and it works great.
I want to know if there is a way to add info on Code Inspection and Duplicate Finder results to the email that is sent out?
thanks
May 16, 2014 at 09:09
I suspect that would require some enhancements to the plugin.
I wonder if that would be best served by some sort of extra plugin architecture, or at least a standard interface that renderers implement.
The email messages are built using velocity. There might be a standard way to extend velocity to load them. I’ll have a look into it. I’m in the process of moving to github. That at least gives me a way to track these sorts of requests.
May 16, 2014 at 14:49
Thanks Netwolfuk! For code inspection/Analysis I’m using NDepend.
Thanks.
May 16, 2014 at 15:04
Thanks. That is good to know so I can see what output to expect.
March 31, 2016 at 13:07
Hello,
Please was anything done on this?
March 31, 2016 at 18:23
No. Sorry I didn’t get very far with that. It’s a quite specific use case which seems like it should have a more generic solution but that’s about as far as I got with it.
June 10, 2014 at 09:48
The teamcity-server.log says ‘Could not assemble the BuildSuccessful prettyemail for bt4 See DEBUG output and/or STDOUT for Stacktrace’. I’m using TeamCity 8.1.2. Where can i find the Debug output?
June 10, 2014 at 09:55
The default log level in TeamCity is info. To enable debug logging you need to edit the log4j.xml file. There is an article on the TeamCity documentation site about how to enable debug logging.
June 10, 2014 at 09:59
It appears that some settings for logging can now be changed in the ui. Try this link. http://confluence.jetbrains.com/display/TCD8/TeamCity+Server+Logs
June 10, 2014 at 10:19
I tried the fix for Digitalje, copy the templates and change the template path. It seems to work for that, but Debug output says an authentication error. I wonder why teamcity can send the normal build mails with the same settings. Thanks for your help! I’ll reply if i get it to work 😉
June 10, 2014 at 10:36
I can’t fix the authentication error. The Debug output says:
[2014-06-10 12:28:22,814] WARN – jetbrains.buildServer.SERVER – PrettyEmailNotificator :: Could not send email to xxx (xxx@xxx.xx) See DEBUG output and/or STDOUT for Stacktrace
[2014-06-10 12:28:22,814] DEBUG – jetbrains.buildServer.SERVER – Authentication failed; nested exception is javax.mail.AuthenticationFailedException: No authentication mechansims supported by both server and client
org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: No authentication mechansims supported by both server and client
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:392)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:336)
at prettyemailer.teamcity.PrettyEmailNotificator.doNotifications(PrettyEmailNotificator.java:189)
at prettyemailer.teamcity.PrettyEmailNotificator.notifyBuildSuccessful(PrettyEmailNotificator.java:228)
at jetbrains.buildServer.notification.impl.UserRulesAwareNotificationListener$NotificatorEventAdapter.buildSuccessful(UserRulesAwareNotificationListener.java:235)
at jetbrains.buildServer.notification.impl.UserRulesAwareNotificationListener.buildSuccessful(UserRulesAwareNotificationListener.java:55)
at jetbrains.buildServer.notification.NotificationProcessor$2.call(NotificationProcessor.java)
at jetbrains.buildServer.notification.NotificationProcessor$18.run(NotificationProcessor.java:5)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: javax.mail.AuthenticationFailedException: No authentication mechansims supported by both server and client
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:765)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:685)
at javax.mail.Service.connect(Service.java:345)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:389)
… 11 more
The server don’t need username and password, so i removed all the optional attributes from the main-config.xml. There are only the host, port and from-address attributes in the smtp tag. But it’s still the same exception.
June 10, 2014 at 10:53
Can you tell me which mail server are you using? Also, you might need to restart TeamCity after removing entries from the pretty email config. I’m not sure how well tested config changes are since it doesn’t happen often.
June 12, 2014 at 07:32
Hi netwolfuk!
I use an exchange email server in the same domain and i fixed my problem using an email account with username and password. I guess the plugin has a problem with emailservers without username and password. A restart did not work.
Thank you for your fast reply and thank you for this great plugin.
Is it possible to add further informations to the email-BuildSuccessful template like the code coverage percentage from dotCover report?
June 12, 2014 at 07:43
That’s great. Thanks for letting me know it worked with a certain type of exchange email account. I’ll email you about the specifics so I can add it to the documentation.
Your request for coverage is similar to another recent request. I’ve been thinking about a generic solution and think that having a way to include an HTML file into the email is probably the way forward. I imagine that the plugin could look in the artifacts from TeamCity for an email-include directory and build that into the body on the pretty email message. There would need to be some smarts to also include any images inside html but I think it should be possible. It would be an exercise for the user to figure out how to generate applicable HTML to include in the email.
July 31, 2014 at 20:30
I just downloaded the tcPrettyEmail plugin but I can’t figure out how to configure it? The links to the documentation for it go to the web hooks wiki at source forge. The documentation doesn’t seem to exist anymore. Is there somewhere else I can find out how to use the plugin?
Thanks!
July 31, 2014 at 20:40
Yes. The wiki has gone away. Until I get to rewrite the documentation you can have a look at the example configuration files here: https://github.com/tcplugins/tcPrettyEmail/tree/master/src/test/resources
July 31, 2014 at 20:54
Sorry if this is a basic question (I’m very new to TC), but where do I put the XML you have in the example configuration files? It says in the configuration for the email notifier to edit the files in /config/_notifications/, but I don’t see that directory on the file system.
Also will this plugin override the TC email notifier or do I need to disable it?
Thanks for you help, I’m looking forward to getting this up and running.
August 1, 2014 at 00:36
I’m not in front if a computer but from memory I think that you need to add the XML to your main-config.xml.
It will appear as another notifier in each user’s notification panel in TeamCity.
You can run it in addition to the existing notifiers.
August 5, 2014 at 10:36
I’ve re-written some docs here: https://github.com/tcplugins/tcPrettyEmail/wiki
Please let me know if you need further assistance.
March 31, 2016 at 14:25
@netwolfuk – First, thank you very much for the excellent plugin. Your e-mail notifications are MUCH nicer than the built-in ones.
I recently submitted an issue on GitHub; I wasn’t sure if you prefer reporting issues here on the blog or on GitHub, so I did both. The details can be found here: https://github.com/tcplugins/tcPrettyEmail/issues/2 but there seems to be a NullPointerException inside the tcPretty plugin.
Any help provided would be much appreciated; thanks so much!!
March 31, 2016 at 18:20
Hi thanks for reporting it. Github is preferred. I should update this page to reflect that. I had not noticed that the specific case was failing to send an email.
May 15, 2016 at 11:19
[…] tcPrettyEmail Bugs and Feature Requests […]