= Gerrit at SAP
:backend: slidy
:max-width: 70em

[[title-page]]
== Gerrit at SAP

== Gerrit at SAP

* Introduction
* Project Administration & Self-Services
* Future Plans

[[title-page]]
== Introduction

== SAP AG

* market leader in enterprise application software
* more than 65.500 employees
* more than 100.000 customers and 12 million users
* office locations in more than 130 countries

== Gerrit at SAP

Why is SAP using Gerrit?

== Gerrit at SAP

Why is SAP using Gerrit?

* We like Git.

== Gerrit at SAP

Why is SAP using Gerrit?

* We like Git.
* We believe in Code Review.

== Gerrit at SAP

Why is SAP using Gerrit?

* We like Git.
* We believe in Code Review.
* Fosters Collaboration between Teams.

== Gerrit at SAP

Why is SAP using Gerrit?

* We like Git.
* We believe in Code Review.
* Fosters Collaboration between Teams.
* Highly Customizable Workflows
** Access Rights
** Prolog Submit Rules

== Gerrit at SAP

Why is SAP using Gerrit?

* We like Git.
* We believe in Code Review.
* Fosters Collaboration between Teams.
* Highly Customizable Workflows
* Automatic Verifications of Open Changes
** Gerrit Trigger on Jenkins

== Gerrit at SAP

Why is SAP using Gerrit?

* We like Git.
* We believe in Code Review.
* Fosters Collaboration between Teams.
* Highly Customizable Workflows
* Automatic Verifications of Open Changes
* Easy Integration with other Tools
** REST API
** Stream Events
** Plugins

== Gerrit at SAP

Why is SAP using Gerrit?

* We like Git.
* We believe in Code Review.
* Fosters Collaboration between Teams.
* Highly Customizable Workflows
* Automatic Verifications of Open Changes
* Easy Integration with other Tools
* Runs very stable + Low Administration Effort

== Gerrit at SAP

Why is SAP using Gerrit?

* We like Git.
* We believe in Code Review.
* Fosters Collaboration between Teams.
* Highly Customizable Workflows
* Automatic Verifications of Open Changes
* Easy Integration with other Tools
* Runs very stable + Low Administration Effort
* Large Open Source Community, Friendly Licence, no Licence Fees

== Gerrit at SAP

* using Gerrit since 2010
* 2 Gerrit maintainers
* multiple committers in JGit and EGit

== Gerrit at SAP

=== Main instance (2.7)

* mainly small projects
* number of projects: > 5K (~70GB)
* number of users: ~ 8K
* number of changes: ~ 400K
* virtual machine: 16 CPU, 64GB RAM

=== Special instance (2.5.2)

* 1 huge project (~15GB)
* number of users: > 2K
* hardware cluster, 80 CPU, 1TB RAM

=== &nbsp;
Further Gerrit instances in preparation.

[[title-page]]
== Project Administration & Self-Services

== SAP Project Portal

* Central index of all projects
+
image:../../img/project-portal.png[]

== Project Search

.Quick Search
image:../../img/project-portal-search-1.png[]

.Result
image:../../img/project-portal-search-2.png[]

== Project Info

image:../../img/project-portal-project-info.png[]

== Project Info

image:../../img/project-portal-project-info-about.png[]

== Project Info

image:../../img/project-portal-project-info-project-team.png[]

== Project Info

image:../../img/project-portal-project-info-links.png[]

== Contribute to a project

1. find project in Project Portal
2. clone the Git repository
3. make a change and push to Gerrit for review

== Contribute to a project

Everyone at SAP can contribute to any SAP project &#x278a;!

* Committer/Contributor model

~&#x278a; any project hosted in Gerrit~

== Project Creation

* Self-Service for creating new projects via SAP Project Portal
+
image:../../img/project-portal-project-creation.png[]

== Skalli

image:../../img/skalli.png[]

* Open Source project management tool
+
link:http://www.eclipse.org/skalli/[http://www.eclipse.org/skalli/]

* SAP Project Portal = Skalli + SAP specific extensions

== Default Access Rights

* The project creator becomes project owner

== Default Access Rights

* The project creator becomes project owner
* The project owner group is self-owned

== Default Access Rights

* The project creator becomes project owner
* The project owner group is self-owned
* By default Project Owners can approve, verify, submit and push tags

== Default Access Rights

* The project creator becomes project owner
* The project owner group is self-owned
* By default Project Owners can approve, verify, submit and push tags
* Everyone can push for review and forge authors

== Default Access Rights

.Project access rights
image:../../img/project-access-rights.png[]

.Inherited default access rights
image:../../img/default-access-rights.png[]

== Default Access Rights

* Teams can start working without touching the access rights.

== Default Access Rights

* Teams can start working without touching the access rights.
* Teams can adapt the access rights to their needs
** enables team specific workflows (e.g. bypass code review)

== Default Access Rights

* Teams can start working without touching the access rights.
* Teams can adapt the access rights to their needs
** enables team specific workflows (e.g. bypass code review)
* Teams can configure custom Prolog rules, e.g.:
** 2 teams collaborate on 1 project, core team has to approve changes
   in core files
** enforce 4-eyes-principle by prohibiting merging own changes

== Default Access Rights

* Best practices about which access rights should be assigned to which
  roles are documented.

== Default Access Rights

* Best practices about which access rights should be assigned to which
  roles are documented.
* Everyone can create new groups in Gerrit.
+
image:../../img/create-group-capability.png[height=80]

== Default Access Rights

* Best practices about which access rights should be assigned to which
  roles are documented.
* Everyone can create new groups in Gerrit.
+
image:../../img/create-group-capability.png[height=80]

* `refs/meta/config` is readable for all
+
image:../../img/refs-meta-config-access-right.png[height=100]

* By default new groups are visible to all users:
+
.gerrit.config
----
  [groups]
    newGroupsVisibleToAll = true
----

== Decentralized Project Administration

* maximal freedom for teams to customize their workflows
* low central administration effort
+
2 admins spend a few hours per week on Gerrit administration

== SAP Product Standards

Requirements for development infrastructures

* security
* traceability
* etc.

== SAP Product Standards

For each code change it must be possible to find the person that was
doing the change.

* `Forge Committer` is BLOCKED on `All-Projects`
+
image:../../img/block-forge-committer.png[height=150]

== SAP Product Standards

Traceability

* ref logs never expire
+
GC script automatically sets:
+
----
  gc.reflogexpire = never
  gc.reflogexpireunreachable = never
----

* `reviewnotes` plugin is used
+
image:../../img/block-push-on-review-notes.png[height=100]

== SAP Product Standards

Every release build must be reproducable.

* Every release build is tagged
* Release tags must never be deleted
+
`Force Push` for release tags is BLOCKED on `All-Projects`
+
image:../../img/block-force-push.png[height=100]

== SAP Product Standards

Special processes are enforced for release branches:

* code review mandatory
* release notes for customers
* custom review label in Gerrit with automated voting
* etc.

== Self-Service for Service User Creation

* many teams use Jenkins with Gerrit Trigger Plugin for verification
  of open changes
* for each Jenkins instance a new service user needs to be created
* service users must not be able to push commits
+
.serviceuser Plugin (Gerrit 2.9)
image:../../img/service-user-plugin.png[]

== Configuration of serviceuser Plugin

image:../../img/service-user-plugin-administration.png[]

== Configuration of serviceuser Plugin

image:../../img/service-user-plugin-administration-help-messages.png[]

== Configuration of serviceuser Plugin

image:../../img/service-user-plugin-administration-email.png[]

== Configuration of serviceuser Plugin

image:../../img/service-user-plugin-administration-group.png[]

== Configuration of serviceuser Plugin

image:../../img/service-user-plugin-administration-git-notes.png[]

== Observed misuses of Gerrit

* storage of Linux ISO images
* backup of database dumps
* (unintentional) upload of heap dumps
* usage as general purpose backup for arbitary files

== Protect against misuse of Gerrit

* Files larger than 20 MB cannot be pushed
+
----
  [receive]
    maxObjectSizeLimit = 20 m
----

* Quota plugin
** limit max repository size

== Administration Pain Points

* project deletion
+
support to archive repositories is missing

* project renaming

* Project Owner confusion with Prolog

* accidental removal of owner rights for project / group

* configuration of periodical fetches for forked open source projects

== Summary - Project Administration & Self-Services

* decentralized project administration
** maximal freedom for teams to customize their workflows
** low central administration effort

* enforcement of central requirements
** use BLOCK rules on access rights

* Self-Services
** project creation via SAP Project Portal (Skalli)
** serviceuser plugin

[[title-page]]
== Future Plans

== Future Plans

Offer Gerrit as Git Service in the SAP HANA Cloud Platform.

== Future Plans

Offer Gerrit as Git Service in the SAP HANA Cloud Platform.

* *SAP HANA Cloud Platform*: SAP platform that enables customers and
  developers to build, extend and run applications on SAP HANA in the
  cloud.

== Future Plans

Offer Gerrit as Git Service in the SAP HANA Cloud Platform.

* *SAP HANA Cloud Platform*: SAP platform that enables customers and
  developers to build, extend and run applications on SAP HANA in the
  cloud.
* *SAP HANA* is an in-memory, column-oriented, relational database
  management system

== Helium

* HTML5 applications
** static resources
** connect to existing backends via REST
* applications are directly served from Git repositories
* multiple versions can exist in parallel
* online development in the cloud (Web IDE)
* solution for SAP customers

image:../../img/helium.png[]

== Requirements for Gerrit

* must run on SAP HANA Cloud Platform
** enabling of service-to-service communication
** roles are assigned outside of Gerrit (e.g. Gerrit admin role)

== Requirements for Gerrit

* must run on SAP HANA Cloud Platform

* isolation of Git repositories of different customers
** support for multi tenancy

== Requirements for Gerrit

* must run on SAP HANA Cloud Platform

* isolation of Git repositories from different customers

* protection against misuse
** enforcement of quotas per tenant

== Requirements for Gerrit

* must run on SAP HANA Cloud Platform

* isolation of Git repositories from different customers

* protection against misuse

* metering

== Requirements for Gerrit

* must run on SAP HANA Cloud Platform

* isolation of Git repositories of different customers

* protection against misuse

* metering

* unattended installation and upgrade
** automatic schema and index upgrades
** automatic plugin installation
** packaging of different configuration and choosing one based on a
   system property

== Multi Tenancy Support in Gerrit

Map tenant to top-level folder in Gerrit.

== Multi Tenancy Support in Gerrit

Map tenant to top-level folder in Gerrit.

image:../../img/tenant-projects.png[]

== Multi Tenancy Support in Gerrit

Tenant users must only see projects of their own tenant.

.ProjectControl
----
  /** Can this user see this project exists? */
  public boolean isVisible() {
    if (user instanceof InternalUser && !isHidden()) {
      return true;
    }

    if (!canPerformOnAnyRef(Permission.READ) || isHidden()) {
      return false;
    }

    Project p = state.getProject();
    for (ProjectFilter e : visibilityExtensions) {
      if (!e.accept(p)) {
        return false;
      }
    }
    return true;
  }
----

.ProjectFilter
----
  /**
   * An extension to the standard project visibility check
   */
  public interface ProjectFilter {
    public boolean accept(Project project);
  }
----

.Tenant ProjectFilter
----
  class TenantAsTopLevelFolder implements ProjectFilter {
    private final Provider<CurrentUser> currentUser;
    private final DomainDbClient checker;

    @Inject
    public TenantAsTopLevelFolder(Provider<CurrentUser> currentUser,
        DomainDbClient checker) {
      this.currentUser = currentUser;
      this.checker = checker;
    }

    @Override
    public boolean accept(Project project) {
      if (currentUser.get().getCapabilities().canAdministrateServer()) {
        return true;
      }

      String projectName = project.getName();
      int n = projectName.indexOf('/');
      if (n == -1) {
        return false;
      }
      String tenant = projectName.substring(0, n);
      String userName = currentUser.get().getUserName();
      return checker.hasGitAccess(userName, tenant);
     }
  }
----

== Questions?

++++
<style type="text/css">
#title-page {
  border-bottom: 0;
  text-align: center;
  position: relative;
  top: 30%;
  font-size: 60px;
}
</style>
++++
