Git Product home page Git Product logo

buildnotifications's People

Contributors

berndnk avatar dependabot-preview[bot] avatar dependabot[bot] avatar thesylence avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

buildnotifications's Issues

Handle passwords in configuration

Passwords are stored in plain text.

I propose to use the DPAPI to encrypt sensible configuration data with the user's/machine's credentials.

ShareFeature: Persist build ids / projects within IDistributedNotification

By doing this (title), users could share links with each other to highlight certain builds.
See the current implementation of IDistributedNotificationReceiver.

Right now the URIScheme is used to start BN to highlight certain INotifications. This is achieved by serializing IDistributedNotifications, which contain a GUID referencing the old INotification.

This works so long as the original INotification is present within the same BuildNotification instance as which is handling the IDistributedNotification.

However if the tool could identify loaded builds solely with the IDistributedNotification alone, a different instance (e.g. from a different user), could serialize and send this notification and any instance (with the same configured projects/configuration) could highlight these builds.

Update system

BuildNotifications should update itself automatically with the newest Release from GitHub.
This should happen in the background, so the new version gets automatically downloaded and installed as soon as BuildNotifications is closed.

Plugin API considerations

Before declaring the API as 1.0 some decisions have to be made:

  • How many concurrent versions of the API should be supported?
    • More than one would require to host plugins in separate processes.
  • How to make sure there are as few breaking changes in the future as possible?
    • Provide abstract classes instead of interfaces so future functions can have default implementations?
    • Create new interfaces when adding new functionality? (i.e. IPlugin1, IPlugin2, ... IPluginN)

DummyBuildServer start/stop improvements

Fix Process not exiting when server is started and nothing did connect yet.
Make Server auto-restart after BuildNotifications.exe has connected and terminated

Proper starting/stopping of updates

  • While the user edits connections/projects the pipeline should not try to update itself.
  • After three failed updates, the auto-update should stop
  • There has to be a button to start updating again or the updates start automatically again after a timeout

Notification Feature

For an update in builds the main feature is to notify users. For this, a couple of smart filters shall be implemented:

Truncate names:
ref/origin/Feature/Team1/Something
ref/origin/Feature/Team1/Anything
ref/origin/Feature/Team1/Idk

becomes:
ref/origin/Feature/Team1/- Something, Anything, Idk

Do this for branches.

Try to group by definition

then by branch.

If either has only one group, display that. E.g.

Definition / Branch
A / 123
B / 123

Display: "123 failed"

Or for
A / 123
A / 456

Display: "A failed"

Possible settings:

  • Truncate Definition names
  • Truncate Branch names
  • Always truncate: [string] -> E.g. always remove ref/origin from branch names

Store different GroupingDefinitions within settings

I want to quickly switch between two ore more GroupingDefinitions which I defined previously.

These should be manageable within the settings, however a quick switch combobox (or similar) should be in the title bar.

Refine sorting

Remove StatusAscending as it makes no sense. Why show cancelled builds first?
Add DateDescending -> Show newest changes on top

Persist sorting configuration

Windows notifications

For every notification that happens inside the tool, a Windows notifications shall be sent.
When click on them, the corresponding notification within the tool shall be selected and its builds highlighted.

Dynamic options in OptionSchemas

As a plugin I want to be able to react on changes to an option in a schema.

Use case:
The user enters the url of a server they want to connect to. The plugin reacts to this change and reads all BuildDefinitions from the server. Then replaces a text option with a SetOption that contains all available definitions.

Pinning entries

I want to be able to pin an entry. Say, a specific project, branch or definition to always appear on top.

Display username and password field based on authentication type

  • When using Windows authentication none of the fields needs to be filled.
  • When using Account authentication both fields needs to be filled.
  • When using Token authentication only password needs to be filled. Even better would be a third field having the correct header "token" instead of "password"

Inform user about failing updates

Pipeline catches all exceptions and logs those, if some appear.

In this case, the user should be informed within the GUI. This is probably relatively easy to implement, by using a custom LogTarget for explicitly the Pipline logging messages.

Support configuration from multiple sources

I want to have a global default configuration (for example one that is provided via Domain Policy that contains the connection information to my companies build server) and a user configuration.

The configuration must merge these configurations.

Ahead/Behind View

Display how far a Branch is ahead or behind the designated Compare Branch

Test connection Feature

When configuring connections/projects I want an easy way to test, whether the current configuration actually works or not.

Ideally something like IPipeline::Test()

Plugin system for notifications

I want to be able to display the created notifications in a variety of ways.
To accomplish this, a plugin api shall be written.

E.g.

  • A Windows Plugin which displays notifications within the Windows 10 Notifications center
  • A Mail Plugin which sends mails

Published application does not start

Application: BuildNotifications.exe
CoreCLR Version: 4.700.19.42102
.NET Core Version: 3.0.0-preview9-19423-09
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Windows.Markup.XamlParseException: The invocation of the constructor on type 'BuildNotifications.MainWindow' that matches the specified binding constraints threw an exception.
---> System.TypeInitializationException: The type initializer for 'BuildNotifications.Core.Text.StringLocalizer' threw an exception.
---> System.Resources.MissingManifestResourceException: Could not find the resource "BuildNotifications.Core.Text.Texts.resources" among the resources "" embedded in the assembly "BuildNotifications.Core", nor among the resources in any satellite assemblies for the specified culture. Perhaps the resources were embedded with an incorrect name.
at System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String fileName)
at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.GetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at BuildNotifications.Core.Text.StringLocalizer..ctor()
at BuildNotifications.Core.Text.StringLocalizer..cctor()
--- End of inner exception stack trace ---
at BuildNotifications.Core.Text.StringLocalizer.get_Instance()
at BuildNotifications.ViewModel.Utils.TrayIconHandle.CreateContextMenu()
at BuildNotifications.ViewModel.Utils.TrayIconHandle..ctor()
at BuildNotifications.ViewModel.MainViewModel..ctor()
at BuildNotifications.MainWindow..ctor()
--- End of inner exception stack trace ---
at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
at System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc)
at System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties)
at System.Windows.Application.DoStartup()
at System.Windows.Application.<.ctor>b__1_0(Object unused)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.DispatcherOperation.InvokeImpl()
at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
at System.Windows.Threading.DispatcherOperation.Invoke()
at System.Windows.Threading.Dispatcher.ProcessQueue()
at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.Run()
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run()
at BuildNotifications.App.Main()

Verbose logging

The logs should be written to a file.
On top of that, the current build should be enhanced with various logging messages throughout the code to ensure strong debugging capabilities in the future.

Perform full update when resuming after error

Currently only sequential updates are performed after the user resumes the update process, after an error occurred.

  • This, for example results in the following scenario:
  • Configure TFS and Dummy Plugin Projects
  • Don't start Dummy and start BuildNotifications
  • -> TFS loads but an error occurs for the dummy
  • Start Dummy
  • Press resume
  • -> No errors occur but the Dummy wont be displayed

Update License

The notification ToastNotificationsPlugin contains code that is licensed under the MPL and MIT license.

Our LICENSE file needs to indicate that we use this code.

Cleanup and UI improvements

  • Fix margin for loading bar
  • Remove test tab in connection settings
  • Display whole branch/definition name on mouse hover
  • Fix long loading time when display large error messages (trim?)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.