Merge pull request #17267 from brendandburns/docs2
Add a description of the proposed owners file system for the repo
This commit is contained in:
		
							
								
								
									
										131
									
								
								docs/devel/owners.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								docs/devel/owners.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,131 @@
 | 
				
			|||||||
 | 
					<!-- BEGIN MUNGE: UNVERSIONED_WARNING -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- BEGIN STRIP_FOR_RELEASE -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
				
			||||||
 | 
					     width="25" height="25">
 | 
				
			||||||
 | 
					<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
				
			||||||
 | 
					     width="25" height="25">
 | 
				
			||||||
 | 
					<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
				
			||||||
 | 
					     width="25" height="25">
 | 
				
			||||||
 | 
					<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
				
			||||||
 | 
					     width="25" height="25">
 | 
				
			||||||
 | 
					<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
				
			||||||
 | 
					     width="25" height="25">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h2>PLEASE NOTE: This document applies to the HEAD of the source tree</h2>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you are using a released version of Kubernetes, you should
 | 
				
			||||||
 | 
					refer to the docs that go with that version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<strong>
 | 
				
			||||||
 | 
					The latest release of this document can be found
 | 
				
			||||||
 | 
					[here](http://releases.k8s.io/release-1.1/docs/devel/owners.md).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Documentation for other releases can be found at
 | 
				
			||||||
 | 
					[releases.k8s.io](http://releases.k8s.io).
 | 
				
			||||||
 | 
					</strong>
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- END STRIP_FOR_RELEASE -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- END MUNGE: UNVERSIONED_WARNING -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Owners files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_Note_: This is a design for a feature that is not yet implemented.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Overview
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We want to establish owners for different parts of the code in the Kubernetes codebase.  These owners
 | 
				
			||||||
 | 
					will serve as the approvers for code to be submitted to these parts of the repository.  Notably, owners
 | 
				
			||||||
 | 
					are not necessarily expected to do the first code review for all commits to these areas, but they are
 | 
				
			||||||
 | 
					required to approve changes before they can be merged.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## High Level flow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Step One: A PR is submitted
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					After a PR is submitted, the automated kubernetes PR robot will append a message to the PR indicating the owners
 | 
				
			||||||
 | 
					that are required for the PR to be submitted.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Subsequently, a user can also request the approval message from the robot by writing:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					@k8s-bot approvers
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					into a comment.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In either case, the automation replies with an annotation that indicates
 | 
				
			||||||
 | 
					the owners required to approve.  The annotation is a comment that is applied to the PR.
 | 
				
			||||||
 | 
					This comment will say:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Approval is required from <owner-a> OR <owner-b>, AND <owner-c> OR <owner-d>, AND ...
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The set of required owners is drawn from the OWNERS files in the repository (see below).  For each file
 | 
				
			||||||
 | 
					there should be multiple different OWNERS, these owners are listed in the `OR` clause(s). Because
 | 
				
			||||||
 | 
					it is possible that a PR may cover different directories, with disjoint sets of OWNERS, a PR may require
 | 
				
			||||||
 | 
					approval from more than one person, this is where the `AND` clauses come from.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`<owner-a>` should be the github user id of the owner _without_ a leading `@` symbol to prevent the owner
 | 
				
			||||||
 | 
					from being cc'd into the PR by email.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Step Two: A PR is LGTM'd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Once a PR is reviewed and LGTM'd it is eligible for submission.  However, for it to be submitted
 | 
				
			||||||
 | 
					an owner for all of the files changed in the PR have to 'approve' the PR.  A user is an owner for a
 | 
				
			||||||
 | 
					file if they are included in the OWNERS hierarchy (see below) for that file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Owner approval comes in two forms:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   * An owner adds a comment to the PR saying "I approve" or "approved"
 | 
				
			||||||
 | 
					   * An owner is the original author of the PR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In the case of a comment based approval, the same rules as for the 'lgtm' label apply.  If the PR is
 | 
				
			||||||
 | 
					changed by pushing new commits to the PR, the previous approval is invalidated, and the owner(s) must
 | 
				
			||||||
 | 
					approve again.  Because of this is recommended that PR authors squash their PRs prior to getting approval
 | 
				
			||||||
 | 
					from owners.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Step Three: A PR is merged
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Once a PR is LGTM'd and all required owners have approved, it is eligible for merge.  The merge bot takes care of
 | 
				
			||||||
 | 
					the actual merging.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Design details
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We need to build new features into the existing github munger in order to accomplish this.  Additionally
 | 
				
			||||||
 | 
					we need to add owners files to the repository.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Approval Munger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We need to add a munger that adds comments to PRs indicating whose approval they require.  This munger will
 | 
				
			||||||
 | 
					look for PRs that do not have approvers already present in the comments, or where approvers have been
 | 
				
			||||||
 | 
					requested, and add an appropriate comment to the PR.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Status Munger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GitHub has a [status api](https://developer.github.com/v3/repos/statuses/), we will add a status munger that pushes a status onto a PR of approval status.  This status will only be approved if the relevant
 | 
				
			||||||
 | 
					approvers have approved the PR.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Requiring approval status
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Github has the ability to [require status checks prior to merging](https://help.github.com/articles/enabling-required-status-checks/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Once we have the status check munger described above implemented, we will add this required status check
 | 
				
			||||||
 | 
					to our main branch as well as any release branches.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Adding owners files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In each directory in the repository we may add an OWNERS file.  This file will contain the github OWNERS
 | 
				
			||||||
 | 
					for that directory.  OWNERSHIP is hierarchical, so if a directory does not container an OWNERS file, its
 | 
				
			||||||
 | 
					parent's OWNERS file is used instead.  There will be a top-level OWNERS file to back-stop the system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Obviously changing the OWNERS file requires OWNERS permission.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- BEGIN MUNGE: GENERATED_ANALYTICS -->
 | 
				
			||||||
 | 
					[]()
 | 
				
			||||||
 | 
					<!-- END MUNGE: GENERATED_ANALYTICS -->
 | 
				
			||||||
		Reference in New Issue
	
	Block a user