grollmus / buildnotifications Goto Github PK
View Code? Open in Web Editor NEWGet a grip on all your CI pipelines. With great build notifications
License: MIT License
Get a grip on all your CI pipelines. With great build notifications
License: MIT License
Specify to exclusively search for branch with "branch:"
Same with definition
Passwords are stored in plain text.
I propose to use the DPAPI to encrypt sensible configuration data with the user's/machine's credentials.
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.
When entering the data of a Azure DevOps Server the password is a plain text field
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.
A projects needs to be able to contain N providers.
Before declaring the API as 1.0 some decisions have to be made:
Fix Process not exiting when server is started and nothing did connect yet.
Make Server auto-restart after BuildNotifications.exe has connected and terminated
When starting the app, the initial selected sortings are not applied
Currently the selected groupingDefinition and/or sorting is not persisted
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:
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.
See title
Remove StatusAscending as it makes no sense. Why show cancelled builds first?
Add DateDescending -> Show newest changes on top
Persist sorting configuration
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.
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.
See mockups
I want to be able to pin an entry. Say, a specific project, branch or definition to always appear on top.
For notifications.
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.
I want to be able to configure which branches and/or BuildDefinitions I want to be notified about.
As a user I want to get a list of available collections, projects and repositories after I entered the URL of the server I want to connect to so I don't have to enter some GUIDs into the connection settings.
When testing a connection I want to use the currently selected connection.
This is a follow up to #10 and requires BerndNK/ReflectSettings#3
See private void HandleExistingDistributedNotificationsOnNextFrame()
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.
When a thing is removed on the server the plugin needs a way to tell the pipeline that an item has been removed.
Display how far a Branch is ahead or behind the designated Compare Branch
When configuring connections/projects I want an easy way to test, whether the current configuration actually works or not.
Ideally something like IPipeline::Test()
Compiler warnings should be treated as errors
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.
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()
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.
Currently only sequential updates are performed after the user resumes the update process, after an error occurred.
BuildTreeViewModelFactory and TreeBuilder could probably be merged into one class
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.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.