DEV Community

Cover image for Understanding Mend Renovate's Pull Request Workflow
Joel Adewole
Joel Adewole

Posted on

Understanding Mend Renovate's Pull Request Workflow

Modern software development leans heavily on collaboration and external dependencies, crucial for functionality like user authentication and database management. With the integration of open-source software, it's estimated that 70-90% of modern applications are built using free and open-source components. This surge in dependencies underscores the importance of efficient dependency management, as applications grow more complex. Efficient management ensures software stability and security, particularly vital as outdated dependencies can compromise an entire application, and new updates may introduce compatibility issues.

Mend Renovate is a free powerful open-source tool that automates dependency updates, enhancing the security and efficiency of software maintenance. This article aims to guide readers through the intricacies of understanding and leveraging Mend Renovate's pull request workflow for optimal software maintenance and bulletproof security.

Understanding Mend Renovate

Software development projects rely on external components like libraries and frameworks, known as dependencies. Outdated dependencies can introduce compatibility issues and security vulnerabilities, which must be resolved.

Mend Renovate integrates seamlessly with version control systems like GitHub, GitLab, and Bitbucket. It scans project code to identify all dependencies and then checks for available updates. The tool automatically creates pull requests (PRs) for these updates, which developers can review and merge based on predefined criteria.

Mend Renovate's advanced features include the "Merge Confidence" score, which provides a data-driven assessment of the safety of updating a dependency. This score is calculated based on crowdsourced data, offering an empirical measure of whether an upgrade is likely to introduce problems into an application.

The tool's flexibility extends to scheduling, allowing developers to set specific times for the tool to run or create PRs, ensuring that updates occur in a controlled and predictable manner. Mend Renovate can be installed as a GitHub App, via CLI tool through an NPM package or Docker image, or even self-hosted.

Workflow automation is a key feature of Mend Renovate. Based on predefined rules, the tool can automate specific actions within the PR workflow, freeing up developer time for more critical tasks.

Setting Up Mend Renovate

Mend Renovate offers a powerful yet flexible solution for automated dependency updates. But how do you integrate it into your development workflow?

Setting up Mend Renovate is a pivotal step in automating the process of dependency management across software projects.

With a variety of setup methods available, developers can choose the approach that best fits their workflow and project requirements. Mend Renovate caters to diverse needs by offering several deployment options:

  1. Mend Renovate App (Recommended): One of the convenient ways to set up Mend Renovate is through the installation of its app from the GitHub Marketplace. This option simplifies the setup process and presents easy-to-use configuration options that are directly accessible from the GitHub interface.
  2. Self-Hosted Instance: Mend Renovate offers the option of self-hosting its server instance for advanced users or those with specific security requirements. This approach grants complete control over the deployment and configuration, but it demands more technical expertise.
  3. Third-Party Hosting: In case Mend Renovate is hosted by a third party, like within your organization, you will receive instructions for installation and configuration. It is advisable to refer to your host documentation for detailed steps.

Step-by-Step Installation (Using Mend Renovate App)

  1. Navigate to the Mend Renovate App on the GitHub Marketplace: https://github.com/apps/renovate.
    Mend Renovate App

  2. Click "Install" or “Configure” if you’ve installed Mend Renovate before and grant necessary permissions. Mend Renovate will require access to your repositories to scan dependencies and create pull requests.

  3. Choose the repositories you want Mend Renovate to manage. You can either select specific repositories or opt for "All repositories" (by default excluding forks or repositories that don't have known package files).

  4. Double-check the selected repositories and click "Install" to finalize the setup and Renovate will begin onboarding.
    Installation

Initial Configuration and Best Practices

Once installed, Mend Renovate automatically generates a configuration file (renovate.json) within your project's root directory. Here are some best practices for initial configuration:

  • Token Permissions: Ensure the Mend Renovate App has appropriate permissions to create pull requests and comment on issues. These permissions can be adjusted within your GitHub settings for the app.

Token Permissions

  • Private Repositories: To manage dependencies in private repositories, you'll need a Personal Access Token (PAT) with sufficient permissions. Generate a PAT from your GitHub account settings and add it to the renovate.json file securely using environment variables.

After granting Mend Renovate permission to your repository, you will be redirected to the https://developer.mend.io site where you have a dashboard for managing your organizations.

Private Repositories

Customizing Mend Renovate Behavior

After installing Mend Renovate in your repository, a new branch(renovate/configure) will be created. This branch adds a JSON file with the default configuration for Mend Renovate to your repository.

Customizing Mend Renovate

The renovate.json file provides developers with the ability to customize Mend Renovate's behavior to meet their specific requirements. This configuration file allows you to define how Mend Renovate functions within your project. You can find out more about the configuration options from the official Mend Renovate documentation.

Activate Mend Renovate

To activate Mend Renovate in your project repository, merge the pull request created by the RenovateBot by clicking the “Merge Pull Request” button.

Activate Mend Renovate

In a case where you want to disable Mend Renovate, simply close the pull request unmerged.

Understanding the Mend Renovate Pull Request Workflow

Mend Renovate provides a streamlined and secure software update process by implementing a robust workflow that ensures all dependencies are up-to-date. For developers looking to maintain and improve their projects, understanding this workflow is crucial.

Mend Renovate streamlines dependency updates by automating the creation and management of pull requests (PRs). To do this, the tool first scans your project's codebase using platform-specific managers such as GitLab CI manager for GitLab to locate dependency declaration files like package.json for npm. Once the dependency files are found, Mend Renovate extracts the dependency information, including names and current versions.

Using data sources such as the npm registry for npm packages, Mend Renovate checks for available updates for each identified dependency. It can group updates based on predefined rules set in the renovate.json configuration file. The versioning module then analyzes the retrieved versions, ensuring compatibility, and choosing the most suitable update based on your configuration. Because Mend Renovate must support a lot of dependency naming and versioning conventions, it has modules for each known convention. You can contribute your modules if you want.

When updates are identified, Mend Renovate creates corresponding PRs that include a branch name (following a clear naming convention), a PR title that clearly states the update proposal, the modified dependency files reflecting the proposed update, and release notes (optional) that incorporate relevant information about the dependency update.

The Mend Renovate pull request workflow comprises several steps, including:

  • Accessing the repository
  • Scan base branches
  • Scanning package files to extract dependencies
  • Looking up registries to check for updates
  • Applying any grouping rules defined
  • Pushing branches and raising Pull Requests

Step 1: Initialization

Initialization

The illustration you sent shows a flowchart outlining the steps for initializing Mend Renovate. Here's a breakdown of the process:

  1. Merge configurations: The first step involves merging configurations. This means that Mend Renovate will combine configurations from multiple sources (if available) to create a single, unified configuration file. Here's the order of precedence, from most important to least important:
    • CLI (Command Line Interface): When executing a command, any configurations provided directly through the command line take the highest precedence over all other settings. These configurations usually consist of specific options or overrides that a user wants to apply for a particular execution, and they can be used to modify the behavior of a command in a variety of ways. By using command line configurations, users have greater control over how their commands execute and can tailor the output to their specific needs.
    • ENV (Environment Variables): Renovate takes into account environment variables which are frequently utilized to configure access tokens or other settings that are environment-dependent, and should not be hardcoded into files.
    • File: Configuration files, like renovate.json or other configuration files within the repository, are then merged. These configuration files contain rules, schedules, and settings that define Renovate's behavior when updating the dependencies. The tool merges these configuration files to create a comprehensive set of instructions for managing dependencies.
    • Default: Renovate implements its default settings to apply built-in configurations. These pre-defined configurations are used as a fallback option by Renovate when no other custom configurations are specified.
  2. Initialize platform: During this step, Mend Renovate establishes communication with the version control platform (VCS) such as GitHub, GitLab, or Bitbucket. It merges configurations to facilitate further actions and initializes the platform. This involves setting up the connection to the version control platform and preparing it for the subsequent steps. It may include authenticating API requests and configuring the necessary access permissions.
  3. Query platform for repositories: Mend Renovate retrieves a list of repositories from the VCS platform to manage, which could involve all or specific organizations based on predefined criteria. Renovate queries the platform for repositories, looking up the list of repositories that it has access to and will potentially run against to check for dependency updates.
  4. Filter repository list: Renovate utilizes filters to narrow down the list of repositories obtained from the platform. These filters are based on the configurations set earlier and can include criteria like only including certain repositories, ignoring others, considering only those with a specific file, etc. This ensures that Renovate works efficiently on relevant repositories, optimizing the process and resources.

By following these steps, Mend Renovate establishes the groundwork for its core functionality: automating dependency updates and managing them through pull requests within your VCS workflow.

Step 2: For Each Repository

For each repository

The illustration depicts the process that Renovate follows to extract dependencies from a repository.

Renovate can proficiently manage multiple repositories that are hosted on diverse platforms, such as GitHub, GitLab, and more. Here are the steps Renovate follow to extract dependencies from a repository:

  1. Initialize repository: During its initialization process, Renovate sets up communication and configuration settings for each repository it intends to manage, on an individual basis. This is done to ensure that each repository is properly integrated with Renovate's automated updates system.
  2. Extract dependencies: Renovate goes through a three-pronged approach to extract dependencies:
    • Extract base branches: Renovate obtains data regarding the base branches of the repository, which are generally the primary development branches where updates to dependencies are made, such as the default or master branch.
    • Check for vulnerabilities: Renovate performs a scan on the identified branches to detect and report any known vulnerabilities in the project's dependencies. This step is considered essential for ensuring the security of the project.
    • Check for Managers: Renovate identifies dependency managers that are specific to different programming languages or ecosystems, such as pip for Python, npm for JavaScript, Maven for Java, or cargo for Rust. The tool uses built-in modules to recognize these managers based on file patterns or conventions used in the repository.
  3. Check each manager: It goes through each manager that is relevant to the repository in question.

    • Manager A, Manager B, ...: The following list showcases various package managers and programming languages that Renovate supports. For instance, one of the package managers could be npm for JavaScript while another could be pip for Python.
    • Match files: Different package managers use specific files to identify the dependencies declared in a project. For instance, npm relies on package.json and package-lock.json, whereas Composer uses composer.json and composer.lock.

    After identifying the dependency manager, Renovate proceeds to search for files linked to that manager. Some common examples of such files are package.json for npm or pom.xml for Maven (Java). These files typically contain declarations of dependencies, which specify the names and versions of external libraries that the project relies on.

  4. Check each file (Manager): Renovate operates within the boundaries of every package manager by scanning through each file that has the potential to include dependency declarations.

    • File 1, File 2, ...: The following files were identified by the managers as possibly containing dependency declarations. For example, File 1 may refer to a requirement.txt file in a Python project.
    • Extract dependency: Renovate extracts the list of dependencies defined within each file. It identifies the relevant dependency files and parses them to extract the necessary dependency information. The extracted information includes the dependency name (e.g., lodash), its current version (e.g., 3.10.1), and potentially other details like version ranges or sources.

Step 3: Look Up Updates

look up updates

The above illustration depicts the procedure that Renovate follows to search for updates of the dependencies found in a repository. The process can be divided into the following steps:

  1. Use data source to fetch versions: Renovate uses a data source to obtain information about available versions for the identified dependency. The data source acts as an intermediary between Renovate and the relevant package repository (such as the npm registry for npm packages). Renovate selects the appropriate data source to query based on the manager and file information.
  2. Use versioning to find the next valid update: Renovate retrieves a list of available versions from the data source and employs a "versioning" module to analyze and filter the versions. This module considers various factors, such as:
    • Dependency naming conventions: Various software ecosystems utilize distinct conventions for naming and organizing versions, such as semantic versioning that uses major, minor, or patch numbers. The versioning module guarantees coherence with the current dependencies and configuration settings.
    • Version ranges (Optional): The dependency declaration file may contain a version range (e.g., ^3.10.0) rather than a specific version. The versioning module uses this range to determine appropriate updates within the specified limits.
    • Blacklisting/Whitelisting (Optional): Renovate configuration files can contain specifications for particular versions or patterns that should be excluded (blacklisted) or included (whitelisted) from update suggestions. The versioning module is designed to filter and retrieve versions based on these specifications.
  3. Look up updates: Renovate applies the versioning rules to determine the appropriate update version based on the criteria mentioned above. This update version can be the latest patch version within the allowed range, a minor version update if configured to allow them, or potentially a major update depending on the configuration.

The lookup process is an important component of Renovate's workflow. It assists in keeping dependencies up-to-date with the latest versions. This is important for incorporating functional improvements and security patches, which are essential for maintaining the overall performance and security of the system.

Step 4: Write Updates

Write updates

The above illustration outlines a simplified flowchart of how Renovate creates pull requests (PRs) to suggest updates for dependencies. The following is a breakdown of each step involved in the process:

  1. For each update: During the renovation process, Renovate examines the list of dependencies that require updates. Every update pertains to a single dependency that needs to be upgraded to a newer version.
  2. Check if a branch is needed: Renovate performs a series of checks to ensure certain conditions are met before creating a new branch for the update.
    • Existing: The process involves checking for the presence of an existing branch related to the update. In case such a branch already exists, it may be utilized instead of creating a new one.
    • Rebase: Renovate evaluates whether the current branch requires rebasing. This may be necessary due to modifications made to the base branch that must be incorporated into the updated branch to maintain its current state.
    • Concurrent Amount: Renovate performs a check against the maximum number of concurrent branches that have been configured. This is done to avoid overloading the repository with a large number of simultaneous updates, which could pose a challenge during the review and merge process.
  3. Create branch (if necessary): After the decision-making process is complete, Renovate will create a new branch if necessary. Typically, the branch name will follow a specific convention that indicates the update required. For example, renovate/lodash-4.x may be used to update lodash to a potential version within the 4.x range.
  4. Apply update: When Renovate applies an update to a dependency on a newly created branch, it changes the version number to the latest one that it previously identified as appropriate for the update. The relevant dependency files, such as package.json, are modified by Renovate within the newly created or reused branch. The identified update version is used to update the dependency version.
  5. Create pull request: Renovate generates a Pull Request (PR) from the branch once the update is complete. This PR comprises the changes made by the update and is then available for review by the development team. The PR includes all the necessary information to inform the team about the changes, such as release notes, the reason for the update, and the implications of the changes. Renovate generates a PR in your version control system (VCS) like GitHub or GitLab.

Step 5: Finalize

Finalize

The illustration provided above presents the conclusive stages of the Mend Renovate process, emphasizing the finalization tasks that follow the update processing. Below is a step-by-step explanation of the finalization:

  1. Check for config migration: This step is a part of the verification process performed by Renovate to check if any configuration changes are required for the project. When Renovate is initially set up or if there are any updates made to the configuration file (renovate.json), certain housekeeping tasks may need to be carried out by Renovate to comply with the latest configuration settings. The following is a more detailed explanation of what this step could entail:
    • Configuration parsing: The renovate.json file is re-read and analyzed by Renovate to understand any changes made to the configuration options.
    • Migration logic (if necessary): Renovate has a feature that allows it to detect any changes made to the configuration format or the addition of new features. In such cases, Renovate may use its pre-set logic to migrate the current configuration to the new format or settings. This ensures that Renovate operates correctly based on the updated configuration.
    • Error handling: Renovate has a mechanism to detect errors or inconsistencies present in the configuration. If such issues arise, Renovate will generate warnings or errors to prevent any incorrect functioning.
  2. Clean stale branches: The final step of the Mend Renovate process involves cleaning up branches that are no longer needed or relevant. These branches could be a result of dependency updates that have since been merged or superseded by other updates. Cleaning them up helps keep the repository organized and manageable, as it avoids clutter from old or unnecessary branches that may create confusion or clutter the project's branch list.

The final step is necessary for Renovate to operate based on the most up-to-date configuration settings. It ensures that Renovate remains in sync with the specific dependency update requirements and workflows defined within the renovate.json file for your project.

Preconditions for Automatic Dependency Updates

Now, you likely have a good understanding of how Mend Renovate Pull Request functions and how it can aid you in automatically updating dependencies. However, to guarantee that the automatic updates contribute positively to the development process, it is important to adhere to a set of well-established preconditions. Here are some crucial preconditions that you should consider:

  1. Clear dependency management strategy:

    • Inventory management: It is imperative to maintain an up-to-date and comprehensive inventory of all dependencies, outlining their specific intended uses. This inventory should not only account for the dependencies but also identify any outdated or redundant dependencies, which should be removed.
    • Version Control: It is highly recommended to use a standardized versioning system, such as semantic versioning, to maintain consistency and provide clarity on the type of updates being made (whether it's a patch, minor, or major update). This makes it easier to identify the nature of the changes, and whether or not they require a manual review, particularly in the case of major updates.

    When updating dependencies, it's important to keep in mind that vulnerabilities aren't the only concern. APIs can change over time, which means that there is a possibility of encountering compatibility issues, license alterations, and even end-of-life scenarios. Therefore, it's crucial to consider these factors while updating dependencies as they can have a significant impact on the overall performance and stability of the system.

  2. Robust testing and CI/CD practices:

    • Automated test suites: It is crucial to create and maintain a comprehensive suite of automated tests that cover various levels of testing such as unit, integration, and system-wide integration tests. These tests should be capable of verifying the correct functioning of the system after any modifications to its dependencies.
    • Staging environments: Using staging environments that closely replicate the production environment to thoroughly test software updates and patches. This practice ensures that any technical issues are promptly identified and resolved before the changes are deployed to the live system, minimizing the risk of downtime or other disruptions to critical business operations.
    • Canary releases: One effective update deployment strategy is the canary release approach, which involves gradually pushing updates to a small, carefully selected group of users. This method enables monitoring and easy rollback in case of any issues, minimizing the impact on the overall system.
  3. Security considerations:

    • Proactive Security Scans: It is crucial to incorporate tools that can proactively scan and identify vulnerabilities in the dependencies you use, preferably before they are merged into your codebase. Such tools can aid in preventing potential security breaches and ensure a robust and secure codebase.
    • Update Policies: Establish unambiguous protocols that outline the process for dealing with security updates, particularly those that pertain to critical or high-risk vulnerabilities. These procedures should be designed to ensure that such updates are swiftly prioritized and addressed.
    • Source Integrity: It is crucial to ensure that the sources from which dependencies are obtained are secure and free from any tampering. It is recommended to use dependencies that are digitally signed by the maintainers to guarantee their integrity. This practice provides a reliable way to verify that the dependencies are authentic and have not been altered in any way. By doing so, we can mitigate the risk of introducing vulnerabilities or malicious code into our systems through third-party dependencies.
  4. Team skills and knowledge:

    • Expertise development: It's crucial to provide your team with frequent training and professional development opportunities to ensure they possess an in-depth knowledge of dependency management tools and strategies. This will help them stay up-to-date with the latest advancements in the field and enable them to effectively manage dependencies, reducing conflicts, and streamlining the development process.
    • Impact assessment: Enable your team to evaluate the probable consequences of dependency updates on your project, encompassing the secondary effects on system functionality and user interaction.
  5. Human oversight:

    • Manual Review Process: Create a framework that facilitates a meticulous evaluation of important modifications or updates to essential systems, integrating specialized knowledge and a thorough risk analysis.
    • Major Updates Analysis: Please conduct a comprehensive analysis of significant updates, considering the long-term objectives of the project, potential architectural impacts, and any refactoring that may be necessary. Kindly provide detailed technical insights along with your analysis.

Automatically updating dependencies can be a great benefit to your software development process, but it's important to take a comprehensive approach to ensure reliability and security. By implementing measures such as regular testing and version control, you can make use of tools like Mend Renovate's Pull Request workflow to seamlessly and effectively handle dependency updates.

Conclusion

Mend Renovate's automated pull request workflow offers numerous benefits to development teams, including increased efficiency in dependency updates. This allows developers to focus on core functionalities while Mend Renovate manages the tedious task of identifying, suggesting, and managing updates.

To get started with Mend Renovate, the comprehensive official documentation provides detailed instructions on installation, configuration, and best practices. Additionally, the Mend Renovate community forum offers a platform for users to connect, share experiences, and access the collective knowledge base.

By adopting this automated workflow, development teams can take a proactive approach to improving their project's dependencies, leading to more secure, efficient, and manageable development practices. With Mend Renovate, development teams can take control of their projects and embark on a more efficient and secure development journey.

Top comments (0)