In software engineering, continuous integration and continuous delivery (CI/CD), sometimes referred to as continuous integration and continuous deployment, generally includes techniques to combine continuous integration (CI) and continuous delivery (CD) practices. For example, continuous integration practices include techniques to frequently merge small code updates into a main branch, and continuous delivery practices include techniques where development teams produce software in relatively short cycles with high speed and frequency such that reliable software or updated software can be released at any time using a simple and repeatable deployment process. CI/CD techniques bridge gaps between development and operation activities and software development teams by enforcing automation in building, testing, and deploying software applications.
Some implementations described herein relate to a system for discovering modular application components using continuous integration (CI) and continuous delivery (CD) (CI/CD) and a component marketplace. The system may include one or more memories and one or more processors communicatively coupled to the one or more memories. The one or more processors may be configured to receive, via a CI/CD pipeline, a first request to register code associated with one or more modular application components. The one or more processors may be configured to perform, based on the first request to register the code associated with the one or more modular application components, one or more application program interface (API) calls to obtain information related to the code associated with the one or more modular application components from a release management system. The one or more processors may be configured to publish, to the component marketplace, the information related to the code associated with the one or more modular application components. The one or more processors may be configured to receive, from a developer device, a second request to access the one or more modular application components. The one or more processors may be configured to provide, to the developer device, access to the one or more modular application components.
Some implementations described herein relate to a method for discovering modular application components using CI/CD. The method may include receiving, by a system, via a CI/CD pipeline, a first request to register code associated with one or more modular application components. The method may include performing, by the system and based on the first request to register the code associated with the one or more modular application components, one or more API calls to obtain information related to the code associated with the one or more modular application components from a release management system. The method may include publishing, by the system, to a component marketplace, the information related to the code associated with the one or more modular application components. The method may include receiving, by the system and from a developer device, a second request to access the one or more modular application components. The method may include providing, by the system and to the developer device, access to the one or more modular application components.
Some implementations described herein relate to a non-transitory computer-readable medium that stores a set of instructions. The set of instructions, when executed by one or more processors of a system, may cause the system to receive, via a CI/CD pipeline, a first request to register code associated with one or more modular application components. The set of instructions, when executed by one or more processors of the system, may cause the system to perform, based on the first request to register the code associated with the one or more modular application components, one or more API calls to obtain information related to the code associated with the one or more modular application components from a release management system. The set of instructions, when executed by one or more processors of the system, may cause the system to publish, to a component marketplace, the information related to the code associated with the one or more modular application components. The set of instructions, when executed by one or more processors of the system, may cause the system to receive, from a developer device, a second request to access the one or more modular application components. The set of instructions, when executed by one or more processors of the system, may cause the system to provide, to the developer device, access to the one or more modular application components.
The following detailed description of example implementations refers to the accompanying drawings. The same reference numbers in different drawings may identify the same or similar elements.
A monolithic software architecture is a traditional and unified approach to software development where all application components are interconnected and interdependent, forming a single cohesive unit. In monolithic software architectures, an entire software application (e.g., including a user interface shell and all application components) is tightly coupled, typically with a single codebase and deployed as a single unit. Despite the simplicity that monolithic software architectures offer with respect to development and initial deployment, monolithic software architectures pose various challenges as software projects grow larger, which can adversely impact agility and scalability. For example, modifications or updates to specific functionalities within one or more application components often require that the entire application be redeployed (e.g., an entire user interface shell needs to be redeployed whenever there are changes to any application components), which results in monolithic software architectures lacking flexibility in terms of scalability and/or maintenance. Furthermore, due to dependencies between application components and the user interface shell in a monolithic software architecture, independently updating application components is challenging because changes in one application component might introduce unintended consequences in other application components. In addition, monolithic software architectures are associated with significant operational overhead, as redeploying an entire user interface shell when an application component is updated involves stopping and restarting the application, which increases operation overhead, increases downtime and deployment time, and causes user disruption.
Accordingly, in some implementations, as described herein, a modular software application may be designed using a micro frontend (MFE) architecture to address challenges posed by traditional monolithic software applications. For example, in an MFE architecture pattern, a web application may be designed and developed in a manner that aims to address challenges posed by monolithic frontend systems. For example, in an MFE architecture pattern, a complex web application is typically decomposed into several smaller, self-contained, and loosely coupled frontend modules, with each module responsible for a specific feature or specific functionality. The modules, often referred to as “micro frontends,” are generally developed, tested, and deployed independently, which allows different teams to work on separate parts of the application concurrently. The modularized MFE architecture also fosters better code organization, reusability, and maintainability, and enables efficient scaling and reducing the impact of changes or updates to a specific MFE. For example, by adhering to certain standards, MFE application components can be composed into a target web application at browser runtime.
Accordingly, as described herein, a modular software application may be decomposed into several application components that each operate as an independent unit with a separate codebase, technologies, and/or CI/CD pipeline. Furthermore, because different application components are isolated from one another (e.g., through one or more application program interfaces (APIs), communication protocols, manifests, and/or runtime boundaries), changes or updates to one application component do not impact other application components. In this way, the modular software application may support dynamic loading, where one or more application components can be loaded and/or updated at runtime without requiring a full restart of the modular application system. Furthermore, the ability to dynamically load application components may enable versioning strategies, where different versions of application components (e.g., an initial release of a first application component and an updated release of a second application component) can coexist within the modular software application (e.g., allowing phased updates, systematic release and/or enabling features, and/or rollback mechanisms to earlier versions, among other examples).
Furthermore, some implementations described herein may use a CI/CD pipeline to enable software development teams to discover modular application components (e.g., MFE components) via a component marketplace. For example, software development teams often create similar frontend components independently, which can lead to duplicated effort and inconsistency across applications. Furthermore, traditional front development tends to follow an inefficient development cycle, especially in large-scale applications, which can be slow and cumbersome and hinder rapid deployment and updates to application components. Other challenges that are posed in existing software development systems include a lack of scalability and flexibility (e.g., because updating and scaling monolithic frontend applications is challenging and often requires extensive testing and coordination), an inconsistent user experience (e.g., because different development teams may create divergent user interface components, leading to a disjointed user experience), knowledge silos (e.g., where expertise in frontend development is often confined within specific teams, limiting collaborative opportunities and shared learning), and difficulties with adaptation to new technologies (e.g., because a learning curve to integrate new technologies or frameworks into an existing systems can be steep, slowing progress).
Accordingly, some implementations described herein relate to an automated self-onboarding process that is built into a CI/CD pipeline to automatically register modular application components and/or updates to modular application components in a component marketplace. For example, the modular application components accessible via the component marketplace may each carry out one or more specific capabilities or functions within a modular software application, and may be configured to execute one or more backend APIs independently. In some implementations, the component marketplace may provide one or more interfaces that allow developers to search the modular application components in the component marketplace and request that the owner(s) of a modular application component provide permission to use the modular application component. Accordingly, based on the owner(s) of a modular application component providing permission to use the requested modular application component, other developers can then access the requested modular application component and integrate the requested modular application component into their own modular software application(s). In this way, some implementations described herein may provide an automated and centralized platform to allow developers to share and reuse modular application components.
In some implementations, as described herein, example 100 may be used to enable development teams to release new or updated modular application components via a CI/CD pipeline that automatically registers or otherwise onboards information indicating that the new or updated modular application components are available to the component marketplace. For example, the modular application components may be integrated into one or more modular software applications that are designed using an MFE architecture or another suitable modular architecture pattern. For example, the modular architecture pattern may decompose modular software applications into various independently deployable modular application components that each represent a specific feature, function, or other aspect of the overall modular software application. Furthermore, the modular software application may be configured in accordance with an MFE contract that establishes a well-defined set of interfaces and/or communication protocols between a user interface shell and other application components to reduce tight coupling and ensure interoperability between and among different modular application components. In this way, the modular software application may support decentralized development (e.g., enabling different development teams to work on different modular application components independently, which promotes autonomy and faster development cycles, and/or robust CI/CD pipelines to automate testing, building, and/or deployment processes while reducing operational overhead).
For example, as shown in
As further shown in
As further shown in
For example, in some implementations, the CI/CD pipeline integrated with the release management system may be configured to generate a release event that is published to an update stream topic each time that the source code management system releases a new artifact associated with a modular application component to the release management system. In some implementations, as shown in
Accordingly, when an inbound request to register an updated version of a modular application component is detected by the version update listener of the component registry, the version update listener may invoke the internal component registry API to perform a data read operation to obtain the appropriate details related to the modular application component from the release management system. For example, the internal component registry API may send a request to an API gateway at an interface between the component registry and the release management system, and the release management system may respond to the request with the appropriate details related to the updated application component. As shown by reference number 150, the component registry may then register the modular application component or updated modular application component. For example, in some implementations, the component registry may register the update to the application component by storing the information related to the update to the application components in a local data repository, such as a DynamoDB database, that offers a fast persistent key-value datastore with native support for replication, auto-scaling, encryption at rest, and on-demand backup, among other examples. In some implementations, as described herein, the information that is stored in the local data repository may be stored in a registered application component manifest to enable runtime discovery and loading of the updated application component and/or to enable discovery via the component marketplace. Additionally, or alternatively, in some implementations, the registered MFE component manifest may be stored in a cache memory (e.g., a DynamoDB Accelerator (DAX) cache) that provides a highly available, in-memory cache for the local data repository (e.g., to reduce a response time when information related to modular application components is requested).
As further shown in
Accordingly, as described herein, example 100 relates to techniques that may provide an automated self-onboarding process that is built into or otherwise integrated into a CI/CD pipeline for modular application components associated with a modular software architecture pattern. In particular, as described herein, example 100 relates to techniques that may be used to register modular application components associated with code that developers commit to the source code management system, whereby other developers can then search for the modular application components via the component marketplace. Furthermore, in cases where a developer identifies one or more modular application components that the developer desires to access (e.g., a modular application component that implements certain functionality and/or supports independently executing one or more backend APIs), the developer may submit a request to access the modular application component to the component marketplace. In some implementations, the component marketplace may then route the request to one or more users or development teams that own the modular application component associated with the access request (e.g., based on the registration information maintained in the component registry), and the requesting user may then obtain the modular application component and integrate the modular application component into their modular software application if the owning user(s) or development team(s) provide permission. Accordingly, as described herein, the component marketplace may provide a centralized platform for sharing and reusing modular application components, which may reduce redundant development efforts and ensure consistency in user interface components across different software applications associated with the modular architecture. For example, the component marketplace may provide one or more interfaces that present information related to a catalog of modular application components with detailed documentation, searching capabilities, filtering capabilities, and/or version control.
In this way, some implementations described herein may be used to integrate discovery of modular application components into a CI/CD pipeline associated with ongoing software development projects, which may streamline development processes and allow for faster and more efficient software development and software deployment cycles. Furthermore, some implementations may provide automated testing and deployment tools specific to application components associated with a modular (e.g., MFE) software architecture, integration with version control, and compatibility checks. Additionally, or alternatively, some implementations described herein enable scalability and flexibility, in that individual modular application components can be independently updated based on the modular CI/CD deployment strategy, which also reduces downtime and risks associated with large-scale software updates. Furthermore, in some implementations, the component marketplace may include a user interface consistency toolkit, which may provide tools and guidelines to ensure user interface consistency across modular application components, thereby maintaining a coherent user experience and design language across different software applications and development teams. The component marketplace also provides a collaborative development environment for knowledge sharing and co-development of modular application components to break down knowledge silos and foster a community of practice among frontend developers. In addition, the component marketplace may offer access to educational resources and templates, which may include learning materials, templates, starter kits, and other information that developers can access to learn about new technologies within the modular software architecture and thereby ease a learning curve for adopting new technologies and/or facilitate quicker integration into existing software development projects. In this way, the combination of a centralized component marketplace and the integration of application component discovery into the CI/CD pipeline effectively enhances the efficiency and quality of frontend development in addition to promoting a more collaborative, flexible, and innovative software development environment.
Furthermore, as described herein, some implementation may address various technical challenges to enable the discovery and sharing of modular application components among different developers or developer teams. For example, integrating modular application components and a marketplace into a CI/CD pipeline and legacy systems can be a complex process, which may potentially lead to compatibility and dependency issues. Accordingly, in some implementations, one or more of the source code management system, the release management system, the component registry, and/or the component marketplace may execute one or more adapters or middleware components to facilitate integration, and comprehensive guidelines for integration processes may be provided to the users of the developer devices. Furthermore, in order to maintain performance and reliability across various modular application components, including scenarios where the modular application components are developed using different technologies or frameworks, some implementations described herein may support standardized performance metrics and monitoring tools to consistently track and optimize the performance of the modular application components. In addition, to ensure that the modular software infrastructure scales efficiently, especially in a cloud environment and without incurring excessive costs, some implementations may use cloud-native technologies (e.g., Kubernetes) for container orchestration and auto-scaling features to manage resources effectively. In addition, some implementations described herein may address security vulnerabilities that might arise due to the distributed nature of modular application components and the component marketplace by performing regular vulnerability assessments, following secure coding practices, and integrating security tools into the CI/CD pipeline. Furthermore, some implementations described herein provide a centralized design system and user interface component library to ensure consistency across various modular application components, provide a comprehensive documentation repository and a collaborative platform for knowledge sharing and community support to ensure that developers have access to the necessary information and documentation to effectively use and contribute to the component marketplace and/or provide training programs, workshops, and detailed onboarding guides to facilitate smoother transitions for developers that may be unfamiliar with the modular software architecture.
Furthermore, some implementations described herein may support advanced DevOps practices, where DevOps refers to methodologies or practices to integrate and automate the work of software development and information technology operations to improve and shorten development cycles. For example, in some implementations, the advanced DevOps practices may include automated environment provisioning, where infrastructure as code (IaC) may be implemented to automate the setup of development, testing, and production environments, enhanced monitoring and analytics that integrate monitoring and analytics tools to track the performance and usage of modular application in real-time, enabling proactive optimizations. Additionally, or alternatively, some implementations described herein may integrate artificial intelligence and/or machine learning techniques to enable predictive analytics and predict potential issues or bottlenecks in the frontend development process or in application performance and/or to support automated code review and optimization (e.g., using artificial intelligence or machine learning algorithms to automated code reviews and provide optimization suggestions). Additionally, or alternatively, some implementations described herein may support progressive web applications, which may be developed using the modular application components that are shared via the component marketplace to provide a native app-like experience, including offline capabilities and improved performance. Additionally, or alternatively, some implementations described herein may support a mobile-first approach to enhance accessibility and user engagement, enhanced security measures such as robust security protocols integrating advanced security protocols and tools to ensure the safety of the modular application components (e.g., in a distributed development environment), regular security audits and continuous security monitoring practices, cross-platform development tools such as a unified development framework that supports cross-platform development and enables modular application components to be seamlessly used across web, mobile, and desktop applications, and improved documentation and onboarding processes (e.g., providing comprehensive and up-to-date documentation for modular application components to facilitate easier integration and use, streamlined onboarding via tutorials and guides for new developers, or the like). In this way, some implementations described herein provide various techniques that can be used to continually refine and advance frontend development strategies, ensuring that the software development strategies remain efficient, scalable, secure, and user-friendly.
As indicated above,
The developer device 210 may include one or more devices capable of receiving, generating, storing, processing, and/or providing information associated with discovering modular application components using CI/CD and the component marketplace 260, as described elsewhere herein. The developer device 210 may include a communication device and/or a computing device. For example, the developer device 210 may include a wireless communication device, a mobile phone, a user equipment, a laptop computer, a tablet computer, a desktop computer, a wearable communication device (e.g., a smart wristwatch, a pair of smart eyeglasses, a head mounted display, or a virtual reality headset), or a similar type of device.
The source code management system 220 may include one or more devices capable of receiving, generating, storing, processing, providing, and/or routing information associated with discovering modular application components using CI/CD and the component marketplace 260, as described elsewhere herein. The source code management system 220 may include a communication device and/or a computing device. For example, the source code management system 220 may include a server, such as an application server, a client server, a web server, a database server, a host server, a proxy server, a virtual server (e.g., executing on computing hardware), or a server or computing hardware used in a cloud computing system.
The release management system 230 may include one or more devices capable of receiving, generating, storing, processing, providing, and/or routing information associated with discovering modular application components using CI/CD and the component marketplace 260, as described elsewhere herein. The release management system 230 may include a communication device and/or a computing device. For example, the release management system 230 may include a server, such as an application server, a client server, a web server, a database server, a host server, a proxy server, a virtual server (e.g., executing on computing hardware), or a server in a cloud computing system. In some implementations, the release management system 230 may include computing hardware used in a cloud computing environment.
The artifact repository 240 may include one or more devices capable of receiving, generating, storing, processing, and/or providing information associated with discovering modular application components using CI/CD and the component marketplace 260, as described elsewhere herein. The artifact repository 240 may include a communication device and/or a computing device. For example, the artifact repository 240 may include a data structure, a database, a data source, a server, a database server, an application server, a client server, a web server, a host server, a proxy server, a virtual server (e.g., executing on computing hardware), a server in a cloud computing system, a device that includes computing hardware used in a cloud computing environment, or a similar type of device.
The component registry 250 may include one or more devices capable of receiving, generating, storing, processing, providing, and/or routing information associated with discovering modular application components using CI/CD and the component marketplace 260, as described elsewhere herein. The component registry 250 may include a communication device and/or a computing device. For example, the component registry 250 may include a server, such as an application server, a client server, a web server, a database server, a host server, a proxy server, a virtual server (e.g., executing on computing hardware), or a server in a cloud computing system. In some implementations, the component registry 250 may include computing hardware used in a cloud computing environment.
The component marketplace 260 may include one or more devices capable of receiving, generating, storing, processing, providing, and/or routing information associated with discovering modular application components using CI/CD, as described elsewhere herein. The component marketplace 260 may include a communication device and/or a computing device. For example, the component marketplace 260 may include a server, such as an application server, a client server, a web server, a database server, a host server, a proxy server, a virtual server (e.g., executing on computing hardware), or a server in a cloud computing system. In some implementations, the component marketplace 260 may include computing hardware used in a cloud computing environment.
The network 270 may include one or more wired and/or wireless networks. For example, the network 270 may include a wireless wide area network (e.g., a cellular network or a public land mobile network), a local area network (e.g., a wired local area network or a wireless local area network (WLAN), such as a Wi-Fi network), a personal area network (e.g., a Bluetooth network), a near-field communication network, a telephone network, a private network, the Internet, and/or a combination of these or other types of networks. The network 270 enables communication among the devices of environment 200.
The number and arrangement of devices and networks shown in
The bus 310 may include one or more components that enable wired and/or wireless communication among the components of the device 300. The bus 310 may couple together two or more components of
The memory 330 may include volatile and/or nonvolatile memory. For example, the memory 330 may include random access memory (RAM), read only memory (ROM), a hard disk drive, and/or another type of memory (e.g., a flash memory, a magnetic memory, and/or an optical memory). The memory 330 may include internal memory (e.g., RAM, ROM, or a hard disk drive) and/or removable memory (e.g., removable via a universal serial bus connection). The memory 330 may be a non-transitory computer-readable medium. The memory 330 may store information, one or more instructions, and/or software (e.g., one or more software applications) related to the operation of the device 300. In some implementations, the memory 330 may include one or more memories that are coupled (e.g., communicatively coupled) to one or more processors (e.g., processor 320), such as via the bus 310. Communicative coupling between a processor 320 and a memory 330 may enable the processor 320 to read and/or process information stored in the memory 330 and/or to store information in the memory 330.
The input component 340 may enable the device 300 to receive input, such as user input and/or sensed input. For example, the input component 340 may include a touch screen, a keyboard, a keypad, a mouse, a button, a microphone, a switch, a sensor, a global positioning system sensor, a global navigation satellite system sensor, an accelerometer, a gyroscope, and/or an actuator. The output component 350 may enable the device 300 to provide output, such as via a display, a speaker, and/or a light-emitting diode. The communication component 360 may enable the device 300 to communicate with other devices via a wired connection and/or a wireless connection. For example, the communication component 360 may include a receiver, a transmitter, a transceiver, a modem, a network interface card, and/or an antenna.
The device 300 may perform one or more operations or processes described herein. For example, a non-transitory computer-readable medium (e.g., memory 330) may store a set of instructions (e.g., one or more instructions or code) for execution by the processor 320. The processor 320 may execute the set of instructions to perform one or more operations or processes described herein. In some implementations, execution of the set of instructions, by one or more processors 320, causes the one or more processors 320 and/or the device 300 to perform one or more operations or processes described herein. In some implementations, hardwired circuitry may be used instead of or in combination with the instructions to perform one or more operations or processes described herein. Additionally, or alternatively, the processor 320 may be configured to perform one or more operations or processes described herein. Thus, implementations described herein are not limited to any specific combination of hardware circuitry and software.
The number and arrangement of components shown in
As shown in
As further shown in
As further shown in
As further shown in
As further shown in
Although
The foregoing disclosure provides illustration and description, but is not intended to be exhaustive or to limit the implementations to the precise forms disclosed. Modifications may be made in light of the above disclosure or may be acquired from practice of the implementations.
As used herein, the term “component” is intended to be broadly construed as hardware, firmware, or a combination of hardware and software. It will be apparent that systems and/or methods described herein may be implemented in different forms of hardware, firmware, and/or a combination of hardware and software. The hardware and/or software code described herein for implementing aspects of the disclosure should not be construed as limiting the scope of the disclosure. Thus, the operation and behavior of the systems and/or methods are described herein without reference to specific software code—it being understood that software and hardware can be used to implement the systems and/or methods based on the description herein.
As used herein, satisfying a threshold may, depending on the context, refer to a value being greater than the threshold, greater than or equal to the threshold, less than the threshold, less than or equal to the threshold, equal to the threshold, not equal to the threshold, or the like.
Although particular combinations of features are recited in the claims and/or disclosed in the specification, these combinations are not intended to limit the disclosure of various implementations. In fact, many of these features may be combined in ways not specifically recited in the claims and/or disclosed in the specification. Although each dependent claim listed below may directly depend on only one claim, the disclosure of various implementations includes each dependent claim in combination with every other claim in the claim set. As used herein, a phrase referring to “at least one of” a list of items refers to any combination and permutation of those items, including single members. As an example, “at least one of: a, b, or c” is intended to cover a, b, c, a-b, a-c, b-c, and a-b-c, as well as any combination with multiple of the same item. As used herein, the term “and/or” used to connect items in a list refers to any combination and any permutation of those items, including single members (e.g., an individual item in the list). As an example, “a, b, and/or c” is intended to cover a, b, c, a-b, a-c, b-c, and a-b-c.
When “a processor” or “one or more processors” (or another device or component, such as “a controller” or “one or more controllers”) is described or claimed (within a single claim or across multiple claims) as performing multiple operations or being configured to perform multiple operations, this language is intended to broadly cover a variety of processor architectures and environments. For example, unless explicitly claimed otherwise (e.g., via the use of “first processor” and “second processor” or other language that differentiates processors in the claims), this language is intended to cover a single processor performing or being configured to perform all of the operations, a group of processors collectively performing or being configured to perform all of the operations, a first processor performing or being configured to perform a first operation and a second processor performing or being configured to perform a second operation, or any combination of processors performing or being configured to perform the operations. For example, when a claim has the form “one or more processors configured to: perform X; perform Y; and perform Z,” that claim should be interpreted to mean “one or more processors configured to perform X; one or more (possibly different) processors configured to perform Y; and one or more (also possibly different) processors configured to perform Z.”
No element, act, or instruction used herein should be construed as critical or essential unless explicitly described as such. Also, as used herein, the articles “a” and “an” are intended to include one or more items, and may be used interchangeably with “one or more.” Further, as used herein, the article “the” is intended to include one or more items referenced in connection with the article “the” and may be used interchangeably with “the one or more.” Furthermore, as used herein, the term “set” is intended to include one or more items (e.g., related items, unrelated items, or a combination of related and unrelated items), and may be used interchangeably with “one or more.” Where only one item is intended, the phrase “only one” or similar language is used. Also, as used herein, the terms “has,” “have,” “having,” or the like are intended to be open-ended terms. Further, the phrase “based on” is intended to mean “based, at least in part, on” unless explicitly stated otherwise. Also, as used herein, the term “or” is intended to be inclusive when used in a series and may be used interchangeably with “and/or,” unless explicitly stated otherwise (e.g., if used in combination with “either” or “only one of”).