GitHub vs GitLab

GitLab compared to other DevOps tools

On this page

Summary

(drawn from https://en.wikipedia.org/wiki/GitHub)

GitHub is a collaborative code repository to host and review code, manage projects and build software. It offers all of the distributed version control and source code management (SCM) functionality of Git as well as adding its own features. It provides access control and several collaboration features such as bug tracking, feature requests, task management, and wikis for every project.

CI/CD is accomplished via integrations with other products, while GitLab has integrated CI/CD. In contrast, GitHub also offers application performance and server monitoring along with cycle analytics. GitLab includes static and dynamic security testing and container scanning.

GitHub does not come with a deployment platform and needs additional applications, like Heroku, in order to deploy applications. GitLab leverages Kubernetes to create a seamless deployment experience in a single application.

GitHub offers plans for both private repositories and free accounts which are commonly used to host open-source software projects. As of June 2018, GitHub reports having over 28 million users and 57 million repositories (including 28 million public repositories), making it the largest host of source code in the world.

On June 4, 2018, Microsoft announced it had reached an agreement to acquire GitHub for US$7.5 billion. The purchase is expected to close by the end of the year.

GitHuba is also offered in a self-managed version called GitHub Enterprise (GHE).

Comments/Anecdotes

Resources

FAQs

Distribution architecture

Q: Is GHE is based on a closed VM
A: Yes - https://help.github.com/enterprise/2.13/admin/guides/installation/ “GitHub Enterprise is distributed as a virtual machine image that you install and manage within your existing infrastructure.”

Possible disadvantages of a closed VM:

Q: a closed environment (could be a trojan inside!)
A: Agree with assessment

Q: Installation is quite complicated
A: DISAGREE - single VM makes it easy to install, although less flexible
See installation instructions at https://help.github.com/enterprise/2.13/admin/guides/installation/setting-up-a-github-enterprise-instance/

Q: upgrades and patching is complicated
A: DISAGREE - VM appliance makes patching and upgrading relatively simple.
See upgrade instructions at https://help.github.com/enterprise/2.13/admin/guides/installation/upgrading-github-enterprise/

Q: bad thing off my head for using VM is I/O
A: Not clear - In general yes. But things can be tuned to improve it a lot
See https://academic.oup.com/comjnl/article/61/6/808/4259797 for general recent study on this.

Q: probably can't separate the installation to separated parts (in order to improve performance)
A: DISAGREE - Can have VM act as different parts to scale per requirements. See https://help.github.com/enterprise/2.13/admin/guides/clustering/about-cluster-nodes/#cluster-design-recommendations and https://help.github.com/enterprise/2.13/admin/guides/clustering/initializing-the-cluster/ for more details.

Comparison

FEATURES

Free CI/CD with shared or personal Runners

GitLab.com has shared Runners that allow you to use GitLab CI/CD completely free up to 2000 build minutes for private projects and unlimited for public projects. Alternatively, you can set up your own Runner for faster build processing, unlimited build minutes, or special requirements.

Explore GitLab.com offerings

Built-in CI/CD

GitLab has built-in Continuous Integration/Continuous Delivery, for free, no need to install it separately. Use it to build, test, and deploy your website (GitLab Pages) or webapp. The job results are displayed on merge requests for easy access.

Learn more about CI/CD

Innersourcing

Internal projects in GitLab allow you to promote innersourcing of your internal repositories.

Find out more about innersourcing

Commit graph and reporting tools

GitLab provides commit graphs and reporting tools about collaborators' work.

Learn more about commit graphs

Group Milestones

Create and manage milestones across projects, to work towards a target date from the group level. View all the issues for the milestone you’re currently working on across multiple projects.

Learn more about Group Milestones

Availability

GitLab.com is at 99.5% availability while we want to be above 99.95%. We're hiring to improve this in the last two months of 2017 and in 2018.

GitLab.com status

The most comprehensive import feature set

GitLab can import projects and issues from more sources (GitHub, BitBucket, Google Code, FogBugz, Gitea and from any git URL) than GitHub or any other VCS. We even have you covered for your move from SVN to Git with comprehensive guides and documentation.

Making it easier to get up and running with GitLab

Export projects

GitLab allows you to export your project to other systems.

We don't restrict access to your data

Powerful Issue Tracker

Quickly set the status, assignee or milestone for multiple issues at the same time or easily filter them on any properties. See milestones and issues across projects.

Learn more about the Issue Tracker

Issue Boards

GitLab has Issue Boards, each list of an Issue Board is based on a label that exists in your issue tracker. The Issue Board will therefore match the state of your issue tracker in a user-friendly way.

Learn more about GitLab Issue Boards

Burndown Charts

GitLab provides Burndown Charts as part of Milestones. This allows users to better track progress during a sprint or while working on a new version of their software.

Read our Burndown Chart Documentation

Issue Weights

GitLab lets you manage issues using Agile practices by setting the weight of an issue.

Read our Issue Weights documentation

Related issues

Explicitly mark issues as related and track their status.

Learn more about Related Issues

Multiple assignees for issues

Assign more than one person to an issue at a time.

Read our Multiple Assignees Documentation

Time tracking

Time Tracking in GitLab lets your team add estimates and record time spent on issues and merge requests.

Learn more about Time Tracking

Wiki based project documentation

A separate system for documentation called Wiki, is built right into each GitLab project. Every Wiki is a separate Git repository.

Learn more about GitLab Wikis

Due dates for individual issues

In GitLab, you can set a due date for individual issues. This is very convenient if you have small tasks with a specific deadline.

Due dates documentation

Move issues between projects

You can move issues between projects in GitLab. All links, history and comments will be copied and the original issue will reference the newly moved issue. This makes working with multiple issue trackers much easier.

Learn more about moving issues between projects

Create new branches from issues

In GitLab, you can quickly create a new branch from an issue on the issue tracker. It will include the issue number and title automatically, making it easy to track which branch belongs to which issue.

See how in our documentation

Allow edits from upstream maintainers in branch

When a user opens a merge request from a fork, they are given the option to allow upstream maintainers to collaborate with them on the source branch. This allows the maintainers of the upstream project to make small fixes or rebase branches before merging, reducing the back and forth of accepting community contributions.

Application performance monitoring

GitLab collects and displays performance metrics for deployed apps, leveraging Prometheus. Developers can determine the impact of a merge and keep an eye on their production systems, without leaving GitLab.

Learn more about monitoring deployed apps

Application performance alerts

GitLab allows engineers to seamlessly create service level indicator alerts and be notified of any desired events, all within the same workflow where they write their code.

Learn more about creating SLI alerts

GitLab server monitoring

GitLab comes out of the box enabled for Prometheus monitoring with extensive instrumentation, making it easy to ensure your GitLab deployment is responsive and healthy.

Learn more about monitoring the GitLab service

Cycle Analytics

GitLab provides a dashboard that lets teams measure the time it takes to go from planning to monitoring. GitLab can provide this data because it has all the tools built-in: from the idea, to the CI, to code review, to deploy to production.

Learn more about Cycle Analytics

Quick actions

GitLab provides a convenient way to change metadata of an issue or merge request without leaving the comment field with slash commands.

Documentation about quick actions

Image Discussions

Within a commit view or a merge request diff view, and with respect to a specific location of an image, you can have a resolvable discussion. Have multiple discussions specifying different areas of an image.

Image Discussions

Merge Request Commit Discussions

Comment on a commit within the context of a merge request itself

Merge Request Commit Discussions

Lock Discussion

Lock down continued discussion in an issue or merge request as a Master role or higher, to prevent further abuse, spam, or unproductive collaboration.

Lock Discussion

Drag and drop tasks

You can change the order of tasks in markdown on GitHub. GitLab does not have this ability, but is considering implementing it.

See the GitLab issue to implement this

First time contributor badge

Highlight first-time contributors in a project.

SUPPORT file link

Link from new issues to a SUPPORT file, pointing to support resources.

See the GitLab issue to implement this

Built-in Container Registry

GitLab Container Registry is a secure and private registry for Docker images. It allows for easy upload and download of images from GitLab CI. It is fully integrated with Git repository management.

Documentation on Container Registry

Full Binary Repository

A binary repository is a software repository for packages, artifacts and their corresponding metadata. It can be used to store binary files produced by an organization itself, such as product releases and nightly product builds, or for third party binaries which must be treated differently for both technical and legal reasons.

Preview your changes with Review Apps

With GitLab CI/CD you can create a new environment for each one of your branches, speeding up your development process. Spin up dynamic environments for your merge requests with the ability to preview your branch in a live environment.

Learn more about Review Apps

New features every month

GitLab is updated with new features and improvements every month on the 22nd.

One integrated tool

Other tools require the integration of multiple 3rd party tools to complete the software development lifecycle. GitLab has a completely integrated solution that covers the entire development lifecycle.

Access to the server

You have complete control of the server/instance, so you can install additional software (intrusion detection, performance monitoring, etc.) and view log files on the server itself. GitLab's advanced log system means everything gets logged and provides you with easy access to a wealth of log file information.

Learn more about logging

Runs on metal

GitLab can run on bare metal servers where you can have control of the disk I/O, CPU, RAM, etc. Scale horizontally without an issue.

Read about the different ways to install GitLab

Highly Available setups

For mission critical releases, you cannot afford downtime. Split your app servers, database, etc., into multiple instances and work in read-only mode during backups.

More information on High Availability

Run your own software on your instance

You are free to run your own software on the instance that GitLab is running on. Have your own intrusion detection system? No problem.

Read about the different ways to install GitLab

Use your configuration management software

You can use your choice of configuration management software, from Puppet, Chef, Ansible for quick and straightforward implementation.

Read about the different ways to install GitLab

Use standard Unix tools for maintenance and monitoring

Use the tools you know for monitoring and maintenance, whether they're standard or your own. GitLab doesn't restrict you.

Read about the different ways to install GitLab

IPv6 ready

Both GitLab.com and GitLab Self-manages support IPv6.

Read the docs on configuring IPv6

AD / LDAP integration

Sync groups, manage SSH-keys, manage permissions, authentication and more. You can manage an entire GitLab instance through the LDAP / AD integration.

More information about AD / LDAP integration

Multiple LDAP / AD server support

Link multiple LDAP servers to GitLab for authentication and authorization

Advanced LDAP configuration

Multiple approvals in code review

In GitLab, to ensure strict code review, you can require a specific number of approvals on a merge request by different users before being able to merge it. You can undo an approval by removing it after the fact.

Approvals Documentation

Ease of migration from other providers

GitLab lets you easily migrate all repos, issues and merge request data from your previous provider.

Learn how to migrate your projects to GitLab

Confidential Issues

Keep your information secure with Confidential Issues. With GitLab, you can create confidential issues visible only for project members with Reporter access level or above.

Learn more about Confidential Issues

Access to and ability to modify source code

GitLab Enterprise Edition is publicly readable, meaning you can scan or modify the code to meet your security and development needs. The code used by most other providers is proprietary, meaning you cannot edit or view the source code.

Read the GitLab Enterprise Edition license.

A comprehensive API

GitLab provides APIs for most features, allowing developers to create deeper integrations with the product.

Read our API Documentation

Search files with fuzzy file finder

GitLab provides a way to search a file in your repository in one keystroke.

Read about the file finder in our documentation

Fast-forward merge with option to rebase

With this setting at the project level, you can ensure that no merge commits are created and all merges are fast-forwarded. When a fast-forward merge is not possible, the user is given the option to rebase.

Learn more about rebase before merge

Squash and merge

Combine commits into one so that main branch has a simpler to follow and revert history.

Learn more about squash and merge

Remote repository push mirroring

Mirror a repository from your local server to elsewhere.

Learn more about repository push mirroring

Remote repository pull mirroring

Mirror a repository from a remote Git server to your local server, making it easy to keep local forks and replicas up to date.

Learn more about repository pull mirroring

Export issues as CSV

Issues can be exported as CSV from GitLab and are sent to your default notification email as an attachment.

Learn more about exporting issues as CSV

Merge approvals

When a project requires multiple sign-offs, GitLab Enterprise Edition enables you to make sure every merge request is approved by one or more people. Merge request approvals allow you to set the number of necessary approvals and predefine a list of approvers that will need to approve every merge request in a project, and in-turn improve your code’s quality.

Learn more about merge request approvals

Granular user roles and flexible permissions

Manage access and permissions with five different user roles and settings for external users. Set permissions according to people's role, rather than either read or write access to a repository. Don't share the source code with people that only need access to the issue tracker.

Learn more about User Roles

Todos

When a user is mentioned in or assigned to a merge request it will be included in the user Todos, making the development workflow faster and easier to track.

Learn more about Todos

Merge conflict resolution

Preview merge conflicts in the GitLab UI and tell Git which version to use.

Learn more about the merge conflict resolution UI

Reject unsigned commits

GitLab Enterprise Edition Premium allows you to enforce GPG signatures by rejecting unsigned commits.

Read more about enforcing push rules

Verified Committer

Verify that a push only contains commits by the same user performing the push.

In development for GitLab. Follow this link for more information.

Navigate to method/function in a merge request diff

When viewing a merge request diff, navigate directly to a method/function in a changed file.

See the GitLab issue to implement this feature

Merge when pipeline succeeds

When reviewing a merge request that looks ready to merge but still has one or more CI/CD jobs running, you can set it to be merged automatically when the jobs pipeline succeeds.

Learn more about Merge when pipeline succeeds

Revert specific commits or a merge request from the UI

Revert any commit or a single merge request from GitLab's UI, with a click of a button.

Learn how to revert a commit or a merge request from the GitLab UI.

Inline commenting and discussion resolution

Code or text review is faster and more effective with inline comments in merge requests. Leave comments and resolve discussions on specific lines of code. In GitLab, Merge Request inline comments are interpreted as a discussion. You can configure your project to only accept merge requests when all discussions are resolved.

Learn more about resolving discussions

Cherry-picking changes

Cherry-pick any commit in the UI by simply clicking the Cherry-Pick button in a merged merge request or a specific commit.

Learn more about cherry picking merge requests

GPG Signed Commits

Sign commits and prove that a commit was performed by a certain user.

Read more about GPG signed commits

Code Owners

The ability to specify Code Owners or reviewers in the repository.

GitLab's issue to implement this

Subgroups: groups within groups

Create groups within groups to easily manage large numbers of people and projects.

Learn more about Subgroups

Container debugging with an integrated web terminal

Easily debug your containers in any of your environments using the built-in GitLab Web Terminal. GitLab can open a terminal session directly from your environment if your application is deployed on Kubernetes. This is a very powerful feature where you can quickly debug issues without leaving the comfort of your web browser.

Learn more about the web terminal

Publish static websites for free with GitLab Pages

GitLab Pages provides an easy system for hosting static sites using GitLab repositories and GitLab CI, complete with custom domains and HTTPS support.

Learn more about GitLab Pages

Publish your website from a private project for free

With GitLab Pages, you can create a private repository to hold your site content, and keep only the page source (HTML) available online.

Visit GitLab Pages Documentation.

Custom domains for GitLab Pages

With GitLab Pages websites, you can use a custom domain or subdomain.

Learn how to apply custom domains to GitLab Pages websites

Multiple custom domains for GitLab Pages

GitLab Pages allows you to add as many custom domains (known as domain aliases) pointing to a single website. A domain alias is like having multiple front doors to one location.

Learn how to add custom domains to your GitLab Pages website

Secure custom domains (HTTPS) with GitLab Pages

Install a SSL/TLS certificate, at no cost, on a website set up with a custom domain served by GitLab Pages.

Learn how to add an SSL/TLS certificate to your GitLab Pages website

GitLab Pages custom domains verification

When adding a new custom domain, users must add an associated TXT record in order to verify they are the owner of the domain. That mechanism is used to prevent users from claiming domains they do not own.

Visit GitLab Pages Documentation.

GitLab Pages support all Static Site Generators

With GitLab, you can build any SSG, and also choose specific SSGs' versions you want your site to build with (e.g. Middleman 4.1.1).

Learn how to build any SSG with GitLab Pages

GitLab Pages example projects

Choose an [example project](https://gitlab.com/pages) to fork and get started with GitLab Pages.

Watch a 3-min video tutorial on how to get started with GitLab Pages by forking a project

GitLab Pages supports all Jekyll plugins

Besides building any Jekyll version you want, with GitLab Pages you can use all Jekyll plugins available.

Visit GitLab Pages Documentation.

Custom Error Pages (404) for GitLab Pages

GitLab Pages allows you to create custom error pages.

Learn how to add a custom 404 to GitLab Pages websites

Deploy Boards

GitLab Premium ships with Deploy Boards offering a consolidated view of the current health and status of each CI/CD environment running on Kubernetes. The status of each pod of your latest deployment is displayed seamlessly within GitLab without the need to access Kubernetes.

Learn more about Deploy Boards

Control

Take control of maintenance downtime, don't be at the mercy of your hosting provider. Control how and where your code is backed up and stored.

You decide when you upgrade

GitLab releases a new version each month and lets you choose when to upgrade.

Learn how to upgrade your GitLab instance

Easy upgrade process

Using our official Linux repositories or the official Docker image, upgrading GitLab is a breeze.

Learn how to upgrade your GitLab instance

Labels

Labels provide an easy way to categorize issues or merge requests based on descriptive titles as 'bug', or 'documentation'.

Learn more about GitLab Labels

Ability to edit all fields of a merge request

GitLab Merge Requests are editable by the author, the project's owners and users with master access. Every field is editable, as well as the target branch.

Read through GitLab Merge Request's Documentation

Automatically close issue(s) when a merge request is merged

With GitLab, you can use specific keywords to close one or more issues as soon as a merge request is merged.

Learn more about automatically closing issues

Configurable issue closing pattern

Define your own specific keywords to close one or more issues as soon as a merge request is merged.

Learn more about automatically closing issues

Enriched Markdown support

GitLab uses 'GitLab Flavored Markdown' (GFM). It extends the standard Markdown in a few significant ways to add some useful functionality.

Learn more about GitLab Flavored Markdown

Work in Progress merge requests (WIP)

Prevent merge requests from accidentally being accepted before they're completely ready by marking them as Work In Progress (WIP). This gives you all the code review power of merge requests, while protecting unfinished work.

Learn more about WIP MRs

Issues and merge requests templates

By adding a description template to your MRs, users who create a new issue or merge request can select a template to help them to communicate effectively.

Learn more about GitLab Description Templates

Custom Git Hooks

Leverage the power of Git Hooks and chain them together to fire off custom scripts when certain actions occur on the repository. If the commit is declined or an error occurs during the Git hook check, the error message of the hook will be present in GitLab's UI. GitLab supports all types of hooks.

Learn how to use Git Hooks with GitLab

Responsive-first design

GitLab is built with a responsive-first design approach. Be it on a desktop, tablet or smartphone, GitLab is optimized to be viewed for the best result.

Community based, users can help shape the product

GitLab has open issue trackers for almost all of its operations. From GitLab itself to infrastructure and marketing, you can help shape the product.

View all GitLab contributors

Git LFS 2.0 support

Manage large files such as audio, video and graphics files with the help of Git LFS. Git LFS 2.0 file locking support helps large teams work with binary assets and is integrated with our native file locking feature.

Learn more about Git LFS support in GitLab

Security Dashboards

Security Dashboard report the latest security status of the default branch for each project

Learn more about Security Dashboards

Static Application Security Testing

GitLab allows easily running Static Application Security Testing (SAST) in CI/CD pipelines; checking for vulnerable source code or well known security bugs in the libraries that are included by the application. Results are then shown in the Merge Request and in the Pipeline view. This feature is available as part of [Auto DevOps](https://docs.gitlab.com/ee/topics/autodevops/#auto-sast) to provide security-by-default.

Learn more about Static Application Security Testing

Dependency Scanning

GitLab automatically detects well known security bugs in the libraries that are included by the application, protecting your application from vulnerabilities that affect dependencies that are used dynamically. Results are then shown in the Merge Request and in the Pipeline view. This feature is available as part of [Auto DevOps](https://docs.gitlab.com/ee/topics/autodevops/#auto-dependency-scanning) to provide security-by-default.

Learn more about Dependency Scanning

Container Scanning

When building a Docker image for your application, GitLab can run a security scan to ensure it does not have any known vulnerability in the environment where your code is shipped. Results are then shown in the Merge Request and in the Pipeline view. This feature is available as part of [Auto DevOps](https://docs.gitlab.com/ee/topics/autodevops/#auto-container-scanning) to provide security-by-default.

Learn more about container scanning

Dynamic Application Security Testing

Once your application is online, GitLab allows running Dynamic Application Security Testing (DAST) in CI/CD pipelines; your application will be scanned to ensure threats like XSS or broken authentication flaws are not affecting it. Results are then shown in the Merge Request and in the Pipeline view. This feature is available as part of [Auto DevOps](https://docs.gitlab.com/ee/topics/autodevops/#auto-sast) to provide security-by-default.

Learn more about application security for containers

Interactive Application Security Testing

[IAST](https://blogs.gartner.com/neil_macdonald/2012/01/30/interactive-application-security-testing/) combines elements of static and dynamic application security testing methods to improve the overall quality of the results. IAST typically uses an agent to instrument the application to monitor library calls and more. GitLab does not yet offer this feature.

Runtime Application Security Testing

RASP uses an agent to instrument the application to monitor library calls as the application is running in production. Unlike other security tools, RASP can take action to block threats in real-time, similar to a Web Application Firewall but from within the app's runtime environment rather than at the network layer. GitLab does not yet offer this feature.

Create projects with Git push

Push new projects to the desired location and a new private project will automatically be created.

Learn more about creating Projects

Keep personal email private

Use a noreply email address for your commits instead of your personal email address private.

See the GitLab issue to implement this

Kubernetes Cluster Monitoring

Monitor key metrics of your connected Kubernetes cluster.

Learn more about Cluster Monitoring

ChatOps

Execute common actions directly from chat, with the output sent back to the channel.

Learn more about ChatOps

Deploy Tokens

Provide read-only access to specific repositories or container images to external infrastructures that need to access your data, for example to deploy applications on Kubernetes.

Learn more about Deploy Tokens

View Kubernetes pod logs

Quickly and easily view the pod logs of an app deployed to Kubernetes.

Learn more about viewing Kubernetes pod logs

Supports geolocation-aware DNS

Having Geo replicated server(s) can make local pulls go more quickly, but without support for Geolocation-aware DNS, developers need to reconfigure their tools manually to point to their nearest geo replicated server. Users using Geolocation-aware DNS can be transparently directed to the closest server available and can access repository data faster.

Learn more about GitLab Geo

Advanced global search installed as default search

Advanced global search via ElasticSearch is installed and enabled as part of the core installation and provides the default search capability

Learn more about GitLab search

Groups dropdown in navigation

Searching for a group is directly available behind a lightweight dropdown menu, removing the need to navigate away from your work into a separate view when you’re looking for a hard-to-remember group.

Learn more about Groups

GitLab Flavored Markdown with CommonMark

GitLab Flavored Markdown is now rendered using CommonMark, a modern standard, for new Markdown content.

Learn more about GitLab Flavored Markdown

Initialize README on project creation

A repository can be initialized with an example README when creating a new project. If this option is checked, a project repository is initialized with a default master branch which can be cloned right away.

Learn more about Project creation

'Contribute to GitLab' link

GitLab Core and GitLab.com users can now find our GitLab contribution page with a handy link, available right away from your user profile menu.

Learn more about Contributing to GitLab

Allow SAML assurance level to bypass 2FA

it is now possible to honor the SAML provider's assurance level, allowing to disable the two-factor authentification on GitLab side via a new SAML configuration option

Learn more about SAML OmniAuth Provider

Manage third party offers

GitLab 11.1 introduces the ability to control the display of third party offers in the administration area, providing more control over the display of these offers

Learn more about Third party offers

See JUnit test summaries in merge request widget

GitLab allows you to view JUnit test results from the merge request widget, giving you insight into quality impacts of your changes.

Learn more about JUnit test summaries in the merge request widget

User status message

Define and show your personal status message via an Emoji and text message, exposed on your profile page and on any comment and author line.

Learn more about Status messages

Private profile page

In certain situations, when privacy is of concern, users might not want to show their activity, contributions and personal projects. Activity-related information can be disabled in the profile settings.

Learn more about Private profiles

Download single repository files

When browsing through project repositories on GitLab, having direct access to single files is a relevant use case. A 'Download' button in the file viewer allows you to download individual files from the GitLab UI.

Learn more about Project repositories

Repository languages on project overview

A code languages bar on the project overview shows all relevant languages the GitLab repository consists of, including relative quantity.

Learn more about Projects

Interactive Web Terminals

Interactive web terminals allow you to connect to a running or completed Kubernetes or Shell runner job and manually run commands to better understand what's happening in the system.

Learn more about Interactive Web Terminals

Custom file templates

Define custom `LICENSE`, `.gitignore`, `Dockerfile` and `.gitlab-ci.yml` templates to make consistency easier.

Learn more about custom file templates

Code Owners

Assign Code Owners to files to indicate the team members responsible for code in your project using a `CODEOWNERS` file.

Learn more about Code Owners

Protected Environments

Specify which person, group, or account is allowed to deploy to a given environment, allowing further protection and safety of sensitive environments.

Learn more about Protected Environments

Maven Repository

GitLab's Maven repository makes it easier to publish and share Java libraries across an organization, and ensure dependencies are managed correctly. It is fully integrated with GitLab, including authentication and authorization.

Documentation on the Maven Repository