proposals/archives/events.md
The tracking issue is at #714.
Currently, Jib logs various log messages via injecting a JibLogger interface into the execution steps in the builder package. However, the data is not structured. The user (of Jib Core) needs to parse log messages in order to obtain useful information. The log messages are also catered towards the jib-maven/gradle-plugin execution output.
Emit events with structured information.
An EventHandlers class holds handlers to pass into the execution steps. This is used by ExecutionContext.
class EventHandlers {
// Handles `E` event class to with `eventConsumer`.
<E extends JibEvent> add(JibEventType<E> eventType, Consumer<E> eventConsumer);
// Handles all events.
add(Consumer<JibEvent> eventConsumer);
}
Emitted events will be matched to handlers by their exact type. JibEvents should not inherit from each other. JibEventType defines constants for all the possible event types to add handlers for.
An example usage could look like this:
// In Jib Core
class PushingBlobEvent implements JibEvent {
DescriptorDigest getDigest();
URL getUploadLocation();
}
// Called by user
ExecutionContext executionContext =
ExecutionContext.newContext()
.addEventHandler(JibEventType.PUSHING_BLOB, event -> {
// Do some processing on event, like:
System.out.println(
"Pushing blob " + event.getDigest() + " to " +
event.getUploadLocation());
})
.addEventHandler(allJibEvents -> {
System.out.println("Some event happened");
})
// Some class that has pre-defined handlers that print log messages.
.addEventHandlers(new LoggingEventHandlers(jibLogger));
Jib.from(...)
...
.containerize(
Containerizers.withExecutionContext(executionContext)
.to(RegistryImage.named(targetImage)));