Move opensource docs to opensource subdirectory
34
Dockerfile
@@ -1,34 +0,0 @@
|
||||
FROM alpine
|
||||
MAINTAINER Jessica Frazelle <jess@docker.com>
|
||||
|
||||
ENV PATH /go/bin:/usr/local/go/bin:$PATH
|
||||
ENV GOPATH /go
|
||||
|
||||
RUN apk update && apk add \
|
||||
ca-certificates \
|
||||
&& rm -rf /var/cache/apk/*
|
||||
|
||||
COPY . /go/src/github.com/docker/opensource
|
||||
|
||||
RUN buildDeps=' \
|
||||
go \
|
||||
git \
|
||||
gcc \
|
||||
libc-dev \
|
||||
libgcc \
|
||||
' \
|
||||
set -x \
|
||||
&& apk update \
|
||||
&& apk add $buildDeps \
|
||||
&& cd /go/src/github.com/docker/opensource \
|
||||
&& go get -d -v github.com/docker/opensource/maintainercollector \
|
||||
&& go generate ./maintainercollector \
|
||||
&& go build -o /usr/bin/maintainercollector ./maintainercollector \
|
||||
&& apk del $buildDeps \
|
||||
&& rm -rf /var/cache/apk/* \
|
||||
&& rm -rf /go \
|
||||
&& echo "Build complete."
|
||||
|
||||
WORKDIR /root/maintainers
|
||||
|
||||
ENTRYPOINT [ "maintainercollector" ]
|
||||
8
Jenkinsfile
vendored
@@ -1,8 +0,0 @@
|
||||
// Only run on Linux atm
|
||||
wrappedNode(label: 'linux') {
|
||||
deleteDir()
|
||||
stage "checkout"
|
||||
checkout scm
|
||||
|
||||
documentationChecker("docs")
|
||||
}
|
||||
719
MAINTAINERS
@@ -1,719 +0,0 @@
|
||||
#
|
||||
# THIS FILE IS AUTOGENERATED; SEE "./maintainercollector"!
|
||||
#
|
||||
# Docker projects maintainers file
|
||||
#
|
||||
# This file describes who runs the Docker project and how.
|
||||
# This is a living document - if you see something out of date or missing,
|
||||
# speak up!
|
||||
#
|
||||
# It is structured to be consumable by both humans and programs.
|
||||
# To extract its contents programmatically, use any TOML-compliant
|
||||
# parser.
|
||||
[Rules]
|
||||
|
||||
[Rules.maintainers]
|
||||
|
||||
title = "What is a maintainer?"
|
||||
|
||||
text = """
|
||||
There are different types of maintainers, with different responsibilities, but
|
||||
all maintainers have 3 things in common:
|
||||
|
||||
1) They share responsibility in the project's success.
|
||||
2) They have made a long-term, recurring time investment to improve the project.
|
||||
3) They spend that time doing whatever needs to be done, not necessarily what
|
||||
is the most interesting or fun.
|
||||
|
||||
Maintainers are often under-appreciated, because their work is harder to appreciate.
|
||||
It's easy to appreciate a really cool and technically advanced feature. It's harder
|
||||
to appreciate the absence of bugs, the slow but steady improvement in stability,
|
||||
or the reliability of a release process. But those things distinguish a good
|
||||
project from a great one.
|
||||
"""
|
||||
[Rules.adding-maintainers]
|
||||
|
||||
title = "How are maintainers added?"
|
||||
|
||||
text = """
|
||||
Maintainers are first and foremost contributors that have shown they are
|
||||
committed to the long term success of a project. Contributors wanting to
|
||||
become maintainers are expected to be deeply involved in contributing code,
|
||||
pull request review, and triage of issues in the project for more than three
|
||||
months.
|
||||
|
||||
Just contributing does not make you a maintainer, it is about building trust
|
||||
with the current maintainers of the project and being a person that they can
|
||||
depend on and trust to make decisions in the best interest of the project.
|
||||
|
||||
Maintainers are assigned per project (repository). Being a maintainer in
|
||||
one project does not automatically make you a maintainer in other projects.
|
||||
|
||||
Periodically, the existing maintainers curate a list of contributors that have
|
||||
shown regular activity on the project over the prior months. From this
|
||||
list, maintainer candidates are selected and proposed on the maintainers
|
||||
mailing list.
|
||||
|
||||
After a candidate has been announced on the maintainers mailing list, the
|
||||
existing maintainers are given five business days to discuss the candidate,
|
||||
raise objections and cast their vote. Candidates must be approved by the BDFL
|
||||
and at least 66% of the current maintainers by adding their vote on the mailing
|
||||
list. Only maintainers of the repository that the candidate is proposed for are
|
||||
allowed to vote. The BDFL's vote is mandatory.
|
||||
|
||||
If a candidate is approved, a maintainer will contact the candidate to
|
||||
invite the candidate to open a pull request that adds the contributor to
|
||||
the MAINTAINERS file. The candidate becomes a maintainer once the pull
|
||||
request is merged.
|
||||
"""
|
||||
|
||||
[Rules.stepping-down-policy]
|
||||
|
||||
title = "Stepping down policy"
|
||||
|
||||
text = """
|
||||
Life priorities, interests, and passions can change. If you're a maintainer but
|
||||
feel you must remove yourself from the list, inform other maintainers that you
|
||||
intend to step down, and if possible, help find someone to pick up your work.
|
||||
At the very least, ensure your work can be continued where you left off.
|
||||
|
||||
After you've informed other maintainers, create a pull request to remove
|
||||
yourself from the MAINTAINERS file.
|
||||
"""
|
||||
|
||||
[Rules.inactive-maintainers]
|
||||
|
||||
title = "Removal of inactive maintainers"
|
||||
|
||||
text = """
|
||||
Similar to the procedure for adding new maintainers, existing maintainers can
|
||||
be removed from the list if they do not show significant activity on the
|
||||
project. Periodically, the maintainers review the list of maintainers and their
|
||||
activity over the last three months.
|
||||
|
||||
If a maintainer has shown insufficient activity over this period, a neutral
|
||||
person will contact the maintainer to ask if they want to continue being
|
||||
a maintainer. If the maintainer decides to step down as a maintainer, they
|
||||
open a pull request to be removed from the MAINTAINERS file.
|
||||
|
||||
If the maintainer wants to remain a maintainer, but is unable to perform the
|
||||
required duties they can be removed with a vote by the BDFL and at least 66% of
|
||||
the current maintainers. The BDFL's vote is mandatory. An e-mail is sent to the
|
||||
mailing list, inviting maintainers of the project to vote. The voting period is
|
||||
five business days. Issues related to a maintainer's performance should be
|
||||
discussed with them among the other maintainers so that they are not surprised
|
||||
by a pull request removing them.
|
||||
"""
|
||||
|
||||
[Rules.alumni]
|
||||
|
||||
title = "Alumni"
|
||||
|
||||
text = """
|
||||
Projects can opt to keep a list of former maintainers in the MAINTAINERS file.
|
||||
Instead of removing a maintainer from the file when they step down, the maintainer
|
||||
is moved to the alumni list (`[Org.Alumni]`). People on this list have
|
||||
no official capacity in the project, it's a way to say "thank you" for the
|
||||
work they have done for the project.
|
||||
"""
|
||||
|
||||
[Rules.bdfl]
|
||||
|
||||
title = "The Benevolent dictator for life (BDFL)"
|
||||
|
||||
text = """
|
||||
Docker follows the timeless, highly efficient and totally unfair system
|
||||
known as [Benevolent dictator for
|
||||
life](https://en.wikipedia.org/wiki/Benevolent_Dictator_for_Life), with
|
||||
yours truly, Solomon Hykes, in the role of BDFL. This means that all
|
||||
decisions are made, by default, by Solomon. Since making every decision
|
||||
myself would be highly un-scalable, in practice decisions are spread
|
||||
across multiple maintainers.
|
||||
|
||||
Ideally, the BDFL role is like the Queen of England: awesome crown, but not
|
||||
an actual operational role day-to-day. The real job of a BDFL is to NEVER GO AWAY.
|
||||
Every other rule can change, perhaps drastically so, but the BDFL will always
|
||||
be there, preserving the philosophy and principles of the project, and keeping
|
||||
ultimate authority over its fate. This gives us great flexibility in experimenting
|
||||
with various governance models, knowing that we can always press the "reset" button
|
||||
without fear of fragmentation or deadlock. See the US congress for a counter-example.
|
||||
|
||||
BDFL daily routine:
|
||||
|
||||
* Is the project governance stuck in a deadlock or irreversibly fragmented?
|
||||
* If yes: refactor the project governance
|
||||
* Are there issues or conflicts escalated by core?
|
||||
* If yes: resolve them
|
||||
* Go back to polishing that crown.
|
||||
"""
|
||||
|
||||
[Rules.decisions]
|
||||
|
||||
title = "How are decisions made?"
|
||||
|
||||
text = """
|
||||
Short answer: EVERYTHING IS A PULL REQUEST.
|
||||
|
||||
Docker is an open-source project with an open design philosophy. This
|
||||
means that the repository is the source of truth for EVERY aspect of the
|
||||
project, including its philosophy, design, road map, and APIs. *If it's
|
||||
part of the project, it's in the repo. If it's in the repo, it's part of
|
||||
the project.*
|
||||
|
||||
As a result, all decisions can be expressed as changes to the
|
||||
repository. An implementation change is a change to the source code. An
|
||||
API change is a change to the API specification. A philosophy change is
|
||||
a change to the philosophy manifesto, and so on.
|
||||
|
||||
All decisions affecting Docker, big and small, follow the same 3 steps:
|
||||
|
||||
* Step 1: Open a pull request. Anyone can do this.
|
||||
|
||||
* Step 2: Discuss the pull request. Anyone can do this.
|
||||
|
||||
* Step 3: Merge or refuse the pull request. Who does this depends on the nature
|
||||
of the pull request and which areas of the project it affects. See *review flow*
|
||||
for details.
|
||||
|
||||
Because Docker is such a large and active project, it's important for everyone to know
|
||||
who is responsible for deciding what. That is determined by a precise set of rules.
|
||||
|
||||
* For every *decision* in the project, the rules should designate, in a deterministic way,
|
||||
who should *decide*.
|
||||
|
||||
* For every *problem* in the project, the rules should designate, in a deterministic way,
|
||||
who should be responsible for *fixing* it.
|
||||
|
||||
* For every *question* in the project, the rules should designate, in a deterministic way,
|
||||
who should be expected to have the *answer*.
|
||||
"""
|
||||
|
||||
[Rules.review]
|
||||
|
||||
title = "Review flow"
|
||||
|
||||
text = """
|
||||
Pull requests should be processed according to the following flow:
|
||||
|
||||
* For each subsystem affected by the change, the maintainers of the subsystem must approve or refuse it.
|
||||
It is the responsibility of the subsystem maintainers to process patches affecting them in a timely
|
||||
manner.
|
||||
|
||||
* If the change affects areas of the code which are not part of a subsystem,
|
||||
or if subsystem maintainers are unable to reach a timely decision, it must be approved by
|
||||
the core maintainers.
|
||||
|
||||
* If the change affects the UI or public APIs, or if it represents a major change in architecture,
|
||||
the architects must approve or refuse it.
|
||||
|
||||
* If the change affects the operations of the project, it must be approved or rejected by
|
||||
the relevant operators.
|
||||
|
||||
* If the change affects the governance, philosophy, goals or principles of the project,
|
||||
it must be approved by BDFL.
|
||||
"""
|
||||
|
||||
[Rules.DCO]
|
||||
|
||||
title = "Helping contributors with the DCO"
|
||||
|
||||
text = """
|
||||
The [DCO or `Sign your work`](
|
||||
https://github.com/docker/docker/blob/master/CONTRIBUTING.md#sign-your-work)
|
||||
requirement is not intended as a roadblock or speed bump.
|
||||
|
||||
Some Docker contributors are not as familiar with `git`, or have used a web based
|
||||
editor, and thus asking them to `git commit --amend -s` is not the best way forward.
|
||||
|
||||
In this case, maintainers can update the commits based on clause (c) of the DCO. The
|
||||
most trivial way for a contributor to allow the maintainer to do this, is to add
|
||||
a DCO signature in a pull requests's comment, or a maintainer can simply note that
|
||||
the change is sufficiently trivial that it does not substantially change the existing
|
||||
contribution - i.e., a spelling change.
|
||||
|
||||
When you add someone's DCO, please also add your own to keep a log.
|
||||
"""
|
||||
|
||||
[Rules."no direct push"]
|
||||
|
||||
title = "I'm a maintainer. Should I make pull requests too?"
|
||||
|
||||
text = """
|
||||
Yes. Nobody should ever push to master directly. All changes should be
|
||||
made through a pull request.
|
||||
"""
|
||||
|
||||
[Rules.meta]
|
||||
|
||||
title = "How is this process changed?"
|
||||
|
||||
text = "Just like everything else: by making a pull request :)"
|
||||
|
||||
|
||||
# Current project roles
|
||||
[Roles]
|
||||
|
||||
[Roles.bdfl]
|
||||
|
||||
person = "shykes"
|
||||
|
||||
[Roles."Chief Architect"]
|
||||
|
||||
person = "shykes"
|
||||
|
||||
text = """
|
||||
The chief architect is responsible for the overall integrity of the technical architecture
|
||||
across all subsystems, and the consistency of APIs and UI.
|
||||
|
||||
Changes to UI, public APIs and overall architecture (for example a plugin system) must
|
||||
be approved by the chief architect.
|
||||
"""
|
||||
|
||||
[Roles."Chief Maintainer"]
|
||||
|
||||
person = "crosbymichael"
|
||||
|
||||
text = """
|
||||
The chief maintainer is responsible for all aspects of quality for the project including
|
||||
code reviews, usability, stability, security, performance, etc.
|
||||
The most important function of the chief maintainer is to lead by example. On the first
|
||||
day of a new maintainer, the best advice should be "follow the C.M.'s example and you'll
|
||||
be fine".
|
||||
"""
|
||||
|
||||
[Roles."Community Manager"]
|
||||
|
||||
person = "theadactyl"
|
||||
|
||||
text = """
|
||||
The community manager is responsible for serving the project community, including users,
|
||||
contributors and partners. This involves:
|
||||
- facilitating communication between maintainers, contributors and users
|
||||
- organizing contributor and maintainer events
|
||||
- helping new contributors get involved
|
||||
- anything the project community needs to be successful
|
||||
|
||||
The community manager is a point of contact for any contributor who has questions, concerns
|
||||
or feedback about project operations.
|
||||
"""
|
||||
|
||||
|
||||
[Org]
|
||||
[Org.Curators]
|
||||
People = ["programmerq", "thajeztah", "amitshukla"]
|
||||
[Org."Docs maintainers"]
|
||||
People = ["jamtur01", "moxiegirl", "sven", "thajeztah", "sfsmithcha"]
|
||||
[Org.boot2docker]
|
||||
People = ["ehazlett", "tianon"]
|
||||
[Org.compose]
|
||||
People = ["aanand", "bfirsh", "dnephin", "mnowster"]
|
||||
[Org.containerd]
|
||||
People = ["crosbymichael", "tonistiigi", "mlaventure"]
|
||||
[Org.datakit]
|
||||
People = ["samoht", "talex5"]
|
||||
[Org.distribution]
|
||||
People = ["aaronlehmann", "dmcgowan", "dmp42", "richardscothern", "shykes", "stevvooe"]
|
||||
[Org.docker]
|
||||
People = ["aaronlehmann", "calavera", "coolljt0725", "cpuguy83", "crosbymichael", "duglin", "estesp", "icecrime", "jhowardmsft", "justincormack", "lk4d4", "mavenugo", "mhbauer", "runcom", "tianon", "tibor", "tonistiigi", "unclejack", "vdemeester"]
|
||||
[Org.docker-bench-security]
|
||||
People = ["diogomonica", "konstruktoid"]
|
||||
[Org.docker-credential-helpers]
|
||||
People = ["aaronlehmann", "calavera", "coolljt0725", "cpuguy83", "crosbymichael", "dnephin", "dongluochen", "duglin", "estesp", "icecrime", "jhowardmsft", "lk4d4", "mavenugo", "mhbauer", "runcom", "stevvooe", "thajeztah", "tianon", "tibor", "tonistiigi", "unclejack", "vdemeester", "vieux"]
|
||||
[Org.docker-py]
|
||||
People = ["aanand", "dnephin", "mnowster", "mpetazzoni", "shin-"]
|
||||
[Org.dockercraft]
|
||||
People = ["aduermael", "davetucker", "gdevillele"]
|
||||
[Org.engine-api]
|
||||
People = ["aaronlehmann", "calavera", "coolljt0725", "cpuguy83", "crosbymichael", "dnephin", "dongluochen", "duglin", "estesp", "icecrime", "jhowardmsft", "lk4d4", "mavenugo", "mhbauer", "runcom", "stevvooe", "thajeztah", "tianon", "tibor", "tonistiigi", "unclejack", "vdemeester", "vieux"]
|
||||
[Org.go-connections]
|
||||
People = ["calavera"]
|
||||
[Org.go-events]
|
||||
People = ["aaronlehmann", "aluzzardi", "lk4d4", "stevvooe"]
|
||||
[Org.go-p9p]
|
||||
People = ["aduermael", "djs55", "frenchben", "justincormack", "stevvooe"]
|
||||
[Org.go-plugins-helpers]
|
||||
People = ["calavera", "dave-tucker", "runcom"]
|
||||
[Org.go-units]
|
||||
People = ["calavera"]
|
||||
[Org.hyperkit]
|
||||
People = ["avsm", "djs55", "dsheets", "gdevillele", "ijc25", "justincormack", "magnuss", "rneugeba", "samoht"]
|
||||
[Org.kitematic]
|
||||
People = ["elesant", "frenchben", "jeffdm", "mchiang0610"]
|
||||
[Org.leadership]
|
||||
People = ["abronan"]
|
||||
[Org.leeroy]
|
||||
People = ["calavera", "jfrazelle"]
|
||||
[Org.libchan]
|
||||
People = ["dmcgowan", "shykes"]
|
||||
[Org.libcompose]
|
||||
People = ["aanand", "aduermael", "dnephin", "ibuildthecloud", "joshwget", "gdevillele", "vdemeester"]
|
||||
[Org.libkv]
|
||||
People = ["abronan", "aluzzardi", "sanimej", "vieux"]
|
||||
[Org.libnetwork]
|
||||
People = ["aboch", "lk4d4", "icecrime", "mrjana", "mavenugo", "sanimej", "chenchun"]
|
||||
[Org.machine]
|
||||
People = ["dgageot", "ehazlett", "jeanlaurent", "nathanleclaire"]
|
||||
[Org.migrator]
|
||||
People = ["mbentley"]
|
||||
[Org.notary]
|
||||
People = ["cyli", "diogomonica", "dmcgowan", "endophage", "nathanmccauley", "riyazdf"]
|
||||
[Org.spdystream]
|
||||
People = ["dmcgowan"]
|
||||
[Org.swarm]
|
||||
People = ["abronan", "allencloud", "aluzzardi", "chanwit", "dongluochen", "jimmyxian", "mhbauer", "nishanttotla", "vieux"]
|
||||
[Org.swarm-frontends]
|
||||
People = ["abronan", "amitshukla", "samalba"]
|
||||
[Org.swarmkit]
|
||||
People = ["aaronlehmann", "abronan", "aluzzardi", "amitshukla", "diogomonica", "dongluochen", "lk4d4", "mrjana", "nishanttotla", "stevvooe", "tonistiigi", "vieux"]
|
||||
[Org.toolbox]
|
||||
People = ["jeffdm", "lisean106", "mchiang0610"]
|
||||
[Org."v1.10-migrator"]
|
||||
People = ["tonistiigi"]
|
||||
[Org.vpnkit]
|
||||
People = ["avsm", "djs55", "samoht", "yomimono"]
|
||||
|
||||
[People]
|
||||
[People.aanand]
|
||||
Name = "Aanand Prasad"
|
||||
Email = "aanand@docker.com"
|
||||
GitHub = "aanand"
|
||||
[People.aaronlehmann]
|
||||
Name = "Aaron Lehmann"
|
||||
Email = "aaron.lehmann@docker.com"
|
||||
GitHub = "aaronlehmann"
|
||||
[People.aboch]
|
||||
Name = "Alessandro Boch"
|
||||
Email = "aboch@docker.com"
|
||||
GitHub = "aboch"
|
||||
[People.abronan]
|
||||
Name = "Alexandre Beslic"
|
||||
Email = "abronan@docker.com"
|
||||
GitHub = "abronan"
|
||||
[People.aduermael]
|
||||
Name = "Adrien Duermael"
|
||||
Email = "adrien@docker.com"
|
||||
GitHub = "aduermael"
|
||||
[People.allencloud]
|
||||
Name = "Allen Sun"
|
||||
Email = "allen.sun@daocloud.io"
|
||||
GitHub = "allencloud"
|
||||
[People.aluzzardi]
|
||||
Name = "Andrea Luzzardi"
|
||||
Email = "al@docker.com"
|
||||
GitHub = "aluzzardi"
|
||||
[People.amitshukla]
|
||||
Name = "Amit Shukla"
|
||||
Email = "amit.shukla@docker.com"
|
||||
GitHub = "amitshukla"
|
||||
[People.avsm]
|
||||
Name = "Anil Madhavapeddy"
|
||||
Email = "anil@recoil.org"
|
||||
GitHub = "avsm"
|
||||
[People.bfirsh]
|
||||
Name = "Ben Firshman"
|
||||
Email = "ben@firshman.co.uk"
|
||||
GitHub = "bfirsh"
|
||||
[People.brianbland]
|
||||
Name = "Brian Bland"
|
||||
Email = "brian.bland@docker.com"
|
||||
GitHub = "BrianBland"
|
||||
[People.calavera]
|
||||
Name = "David Calavera"
|
||||
Email = "david.calavera@gmail.com"
|
||||
GitHub = "calavera"
|
||||
[People.chanwit]
|
||||
Name = "Chanwit Kaewkasi"
|
||||
Email = "chanwit@gmail.com"
|
||||
GitHub = "chanwit"
|
||||
[People.chenchun]
|
||||
Name = "Chun Chen"
|
||||
Email = "ramichen@tencent.com"
|
||||
GitHub = "chenchun"
|
||||
[People.coolljt0725]
|
||||
Name = "Lei Jitang"
|
||||
Email = "leijitang@huawei.com"
|
||||
GitHub = "coolljt0725"
|
||||
[People.cpuguy83]
|
||||
Name = "Brian Goff"
|
||||
Email = "cpuguy83@gmail.com"
|
||||
GitHub = "cpuguy83"
|
||||
[People.crosbymichael]
|
||||
Name = "Michael Crosby"
|
||||
Email = "crosbymichael@gmail.com"
|
||||
GitHub = "crosbymichael"
|
||||
[People.cyli]
|
||||
Name = "Ying Li"
|
||||
Email = "ying.li@docker.com"
|
||||
GitHub = "cyli"
|
||||
[People.dave-tucker]
|
||||
Name = "Dave Tucker"
|
||||
Email = "dt@docker.com"
|
||||
GitHub = "dave-tucker"
|
||||
[People.davetucker]
|
||||
Name = "Dave Tucker"
|
||||
Email = "dave.tucker@docker.com"
|
||||
GitHub = "dave-tucker"
|
||||
[People.dgageot]
|
||||
Name = "David Gageot"
|
||||
Email = "david.gageot@docker.com"
|
||||
GitHub = "dgageot"
|
||||
[People.diogomonica]
|
||||
Name = "Diogo Monica"
|
||||
Email = "diogo@docker.com"
|
||||
GitHub = "diogomonica"
|
||||
[People.djs55]
|
||||
Name = "David Scott"
|
||||
Email = "dave.scott@docker.com"
|
||||
GitHub = "djs55"
|
||||
[People.dmcgowan]
|
||||
Name = "Derek McGowan"
|
||||
Email = "derek@docker.com"
|
||||
GitHub = "dmcgowan"
|
||||
[People.dmp42]
|
||||
Name = "Olivier Gambier"
|
||||
Email = "olivier@docker.com"
|
||||
GitHub = "dmp42"
|
||||
[People.dnephin]
|
||||
Name = "Daniel Nephin"
|
||||
Email = "dnephin@gmail.com"
|
||||
GitHub = "dnephin"
|
||||
[People.dongluochen]
|
||||
Name = "Dongluo Chen"
|
||||
Email = "dong@docker.com"
|
||||
GitHub = "dongluochen"
|
||||
[People.dsheets]
|
||||
Name = "David Sheets"
|
||||
Email = "dsheets@docker.com"
|
||||
GitHub = "dsheets"
|
||||
[People.duglin]
|
||||
Name = "Doug Davis"
|
||||
Email = "dug@us.ibm.com"
|
||||
GitHub = "duglin"
|
||||
[People.ehazlett]
|
||||
Name = "Evan Hazlett"
|
||||
Email = "ejhazlett@gmail.com"
|
||||
GitHub = "ehazlett"
|
||||
[People.elesant]
|
||||
Name = "Sean Li"
|
||||
Email = "mail@shang.li"
|
||||
GitHub = "elesant"
|
||||
[People.endophage]
|
||||
Name = "David Lawrence"
|
||||
Email = "david.lawrence@docker.com"
|
||||
GitHub = "endophage"
|
||||
[People.erikh]
|
||||
Name = "Erik Hollensbe"
|
||||
Email = "erik@docker.com"
|
||||
GitHub = "erikh"
|
||||
[People.estesp]
|
||||
Name = "Phil Estes"
|
||||
Email = "estesp@linux.vnet.ibm.com"
|
||||
GitHub = "estesp"
|
||||
[People.frenchben]
|
||||
Name = "Ben French"
|
||||
Email = "frenchben@docker.com"
|
||||
GitHub = "FrenchBen"
|
||||
[People.gdevillele]
|
||||
Name = "Gaetan de Villele"
|
||||
Email = "gaetan@docker.com"
|
||||
GitHub = "gdevillele"
|
||||
[People.ibuildthecloud]
|
||||
Name = "Darren Shepherd"
|
||||
Email = "darren@rancher.com"
|
||||
GitHub = "ibuildthecloud"
|
||||
[People.icecrime]
|
||||
Name = "Arnaud Porterie"
|
||||
Email = "arnaud@docker.com"
|
||||
GitHub = "icecrime"
|
||||
[People.ijc25]
|
||||
Name = "Ian Campbell"
|
||||
Email = "ian.campbell@docker.com"
|
||||
GitHub = "ijc25"
|
||||
[People.jamtur01]
|
||||
Name = "James Turnbull"
|
||||
Email = "james@lovedthanlost.net"
|
||||
GitHub = "jamtur01"
|
||||
[People.jeanlaurent]
|
||||
Name = "Jean-Laurent de Morlhon"
|
||||
Email = "jeanlaurent@docker.com>"
|
||||
GitHub = "jeanlaurent"
|
||||
[People.jeffdm]
|
||||
Name = "Jeff Morgan"
|
||||
Email = "jmorgan@docker.com"
|
||||
GitHub = "jeffdm"
|
||||
[People.jfrazelle]
|
||||
Name = "Jessie Frazelle"
|
||||
Email = "acidburn@docker.com"
|
||||
GitHub = "jfrazelle"
|
||||
[People.jhowardmsft]
|
||||
Name = "John Howard"
|
||||
Email = "jhoward@microsoft.com"
|
||||
GitHub = "jhowardmsft"
|
||||
[People.jimmyxian]
|
||||
Name = "Xian Chaobo"
|
||||
Email = "xianchaobo@huawei.com"
|
||||
GitHub = "jimmyxian"
|
||||
[People.joshwget]
|
||||
Name = "Josh Curl"
|
||||
Email = "josh@rancher.com"
|
||||
GitHub = "joshwget"
|
||||
[People.justincormack]
|
||||
Name = "Justin Cormack"
|
||||
Email = "justin.cormack@docker.com"
|
||||
GitHub = "justincormack"
|
||||
[People.konstruktoid]
|
||||
Name = "Thomas Sjögren"
|
||||
Email = "thomas.sjogren@outlook.com"
|
||||
GitHub = "konstruktoid"
|
||||
[People.lisean106]
|
||||
Name = "Sean Li"
|
||||
Email = "sean@docker.com"
|
||||
GitHub = "lisean106"
|
||||
[People.lk4d4]
|
||||
Name = "Alexander Morozov"
|
||||
Email = "lk4d4@docker.com"
|
||||
GitHub = "lk4d4"
|
||||
[People.magnuss]
|
||||
Name = "Magnus Skjegstad"
|
||||
Email = "magnus@skjegstad.com"
|
||||
GitHub = "MagnusS"
|
||||
[People.mavenugo]
|
||||
Name = "Madhu Venugopal"
|
||||
Email = "madhu@docker.com"
|
||||
GitHub = "mavenugo"
|
||||
[People.mbentley]
|
||||
Name = "Matt Bentley"
|
||||
Email = "matt.bentley@docker.com"
|
||||
GitHub = "mbentley"
|
||||
[People.mchiang0610]
|
||||
Name = "Michael Chiang"
|
||||
Email = "mchiang@docker.com"
|
||||
GitHub = "mchiang0610"
|
||||
[People.mhbauer]
|
||||
Name = "Morgan Bauer"
|
||||
Email = "mbauer@us.ibm.com"
|
||||
GitHub = "mhbauer"
|
||||
[People.mlaventure]
|
||||
Name = "Kenfe-Mickaël Laventure"
|
||||
Email = "mickael.laventure@docker.com"
|
||||
GitHub = "mlaventure"
|
||||
[People.mnowster]
|
||||
Name = "Mazz Mosley"
|
||||
Email = "mazz@houseofmnowster.com"
|
||||
GitHub = "mnowster"
|
||||
[People.moxiegirl]
|
||||
Name = "Mary Anthony"
|
||||
Email = "mary.anthony@docker.com"
|
||||
GitHub = "moxiegirl"
|
||||
[People.mpetazzoni]
|
||||
Name = "Maxime Petazzoni"
|
||||
Email = "maxime.petazzoni@bulix.org"
|
||||
GitHub = "mpetazzoni"
|
||||
[People.mrjana]
|
||||
Name = "Jana Radhakrishnan"
|
||||
Email = "mrjana@docker.com"
|
||||
GitHub = "mrjana"
|
||||
[People.nathanleclaire]
|
||||
Name = "Nathan LeClaire"
|
||||
Email = "nathan.leclaire@docker.com"
|
||||
GitHub = "nathanleclaire"
|
||||
[People.nathanmccauley]
|
||||
Name = "Nathan McCauley"
|
||||
Email = "nathan.mccauley@docker.com"
|
||||
GitHub = "nathanmccauley"
|
||||
[People.nishanttotla]
|
||||
Name = "Nishant Totla"
|
||||
Email = "nishanttotla@gmail.com"
|
||||
GitHub = "nishanttotla"
|
||||
[People.programmerq]
|
||||
Name = "Jeff Anderson"
|
||||
Email = "jeff@docker.com"
|
||||
GitHub = "programmerq"
|
||||
[People.richardscothern]
|
||||
Name = "Richard Scothern"
|
||||
Email = "richard.scothern@gmail.com"
|
||||
GitHub = "richardscothern"
|
||||
[People.riyazdf]
|
||||
Name = "Riyaz Faizullabhoy"
|
||||
Email = "riyaz@docker.com"
|
||||
GitHub = "riyazdf"
|
||||
[People.rneugeba]
|
||||
Name = "Rolf Neugebauer"
|
||||
Email = "rolf.neugebauer@docker.com"
|
||||
GitHub = "rneugeba"
|
||||
[People.runcom]
|
||||
Name = "Antonio Murdaca"
|
||||
Email = "runcom@redhat.com"
|
||||
GitHub = "runcom"
|
||||
[People.samalba]
|
||||
Name = "Sam Alba"
|
||||
Email = "sam.alba@docker.com"
|
||||
GitHub = "samalba"
|
||||
[People.samoht]
|
||||
Name = "Thomas Gazagnaire"
|
||||
Email = "thomas@gazagnaire.org"
|
||||
GitHub = "samoht"
|
||||
[People.sanimej]
|
||||
Name = "Santhosh Manohar"
|
||||
Email = "santhosh@docker.com"
|
||||
GitHub = "sanimej"
|
||||
[People.shin-]
|
||||
Name = "Joffrey F"
|
||||
Email = "joffrey@docker.com"
|
||||
GitHub = "shin-"
|
||||
[People.shykes]
|
||||
Name = "Solomon Hykes"
|
||||
Email = "solomon@docker.com"
|
||||
GitHub = "shykes"
|
||||
[People.stevvooe]
|
||||
Name = "Stephen Day"
|
||||
Email = "stephen.day@docker.com"
|
||||
GitHub = "stevvooe"
|
||||
[People.sven]
|
||||
Name = "Sven Dowideit"
|
||||
Email = "SvenDowideit@home.org.au"
|
||||
GitHub = "SvenDowideit"
|
||||
[People.talex5]
|
||||
Name = "Thomas Leonard"
|
||||
Email = "thomas.leonard@docker.com"
|
||||
GitHub = "talex5"
|
||||
[People.thajeztah]
|
||||
Name = "Sebastiaan van Stijn"
|
||||
Email = "github@gone.nl"
|
||||
GitHub = "thaJeztah"
|
||||
[People.tianon]
|
||||
Name = "Tianon Gravi"
|
||||
Email = "admwiggin@gmail.com"
|
||||
GitHub = "tianon"
|
||||
[People.tibor]
|
||||
Name = "Tibor Vass"
|
||||
Email = "tibor@docker.com"
|
||||
GitHub = "tiborvass"
|
||||
[People.tonistiigi]
|
||||
Name = "Tõnis Tiigi"
|
||||
Email = "tonis@docker.com"
|
||||
GitHub = "tonistiigi"
|
||||
[People.unclejack]
|
||||
Name = "Cristian Staretu"
|
||||
Email = "cristian.staretu@gmail.com"
|
||||
GitHub = "unclejack"
|
||||
[People.vbatts]
|
||||
Name = "Vincent Batts"
|
||||
Email = "vbatts@redhat.com"
|
||||
GitHub = "vbatts"
|
||||
[People.vdemeester]
|
||||
Name = "Vincent Demeester"
|
||||
Email = "vincent@sbr.pm"
|
||||
GitHub = "vdemeester"
|
||||
[People.vieux]
|
||||
Name = "Victor Vieux"
|
||||
Email = "vieux@docker.com"
|
||||
GitHub = "vieux"
|
||||
[People.vishh]
|
||||
Name = "Vishnu Kannan"
|
||||
Email = "vishnuk@google.com"
|
||||
GitHub = "vishh"
|
||||
[People.yomimono]
|
||||
Name = "Mindy Preston"
|
||||
Email = "mindy.preston@docker.com"
|
||||
GitHub = "yomimono"
|
||||
5
Makefile
@@ -1,5 +0,0 @@
|
||||
.PHONY: maintainers
|
||||
|
||||
maintainers:
|
||||
@docker build --rm --force-rm -t docker/maintainers .
|
||||
@docker run --rm -v $(CURDIR):/root/maintainers docker/maintainers
|
||||
@@ -1,4 +0,0 @@
|
||||
This repo contains documentation and scripts related to the management of Open Source at Docker.
|
||||
|
||||
The compiled list of maintainers of all Docker subprojects can be found at
|
||||
[MAINTAINERS](MAINTAINERS).
|
||||
@@ -1,43 +0,0 @@
|
||||
// +build ignore
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
func main() {
|
||||
wd, err := os.Getwd()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err := generateFile(wd, "rules.toml", "rules"); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err := generateFile(wd, "roles.toml", "roles"); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func generateFile(wd string, file string, target string) error {
|
||||
src, err := ioutil.ReadFile(file)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
out, err := os.Create(filepath.Join(wd, target+".go"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
out.Write([]byte("// This file is autogenerated; DO NOT EDIT DIRECTLY\n// See maintainercollector/generate.go for more info\npackage main\n\nconst (\n"))
|
||||
|
||||
out.Write([]byte(fmt.Sprintf("%s = %q", target, string(src))))
|
||||
|
||||
out.Write([]byte("\n)\n"))
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -1,174 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/BurntSushi/toml"
|
||||
"github.com/Sirupsen/logrus"
|
||||
)
|
||||
|
||||
const (
|
||||
ghRawUri = "https://raw.githubusercontent.com"
|
||||
head = `#
|
||||
# THIS FILE IS AUTOGENERATED; SEE "./maintainercollector"!
|
||||
#
|
||||
# Docker projects maintainers file
|
||||
#
|
||||
# This file describes who runs the Docker project and how.
|
||||
# This is a living document - if you see something out of date or missing,
|
||||
# speak up!
|
||||
#
|
||||
# It is structured to be consumable by both humans and programs.
|
||||
# To extract its contents programmatically, use any TOML-compliant
|
||||
# parser.
|
||||
`
|
||||
)
|
||||
|
||||
var (
|
||||
org = "docker"
|
||||
projects = []string{
|
||||
"boot2docker",
|
||||
"compose",
|
||||
"containerd",
|
||||
"datakit",
|
||||
"distribution",
|
||||
"docker",
|
||||
"docker-bench-security",
|
||||
"docker-credential-helpers",
|
||||
"docker-py",
|
||||
"dockercraft",
|
||||
"engine-api",
|
||||
"go-connections",
|
||||
"go-events",
|
||||
"go-p9p",
|
||||
"go-plugins-helpers",
|
||||
"go-units",
|
||||
"hyperkit",
|
||||
"kitematic",
|
||||
"leadership",
|
||||
"leeroy",
|
||||
"libchan",
|
||||
"libcompose",
|
||||
"libkv",
|
||||
"libnetwork",
|
||||
"machine",
|
||||
"migrator",
|
||||
"notary",
|
||||
"spdystream",
|
||||
"swarm",
|
||||
"swarmkit",
|
||||
"swarm-frontends",
|
||||
"toolbox",
|
||||
"v1.10-migrator",
|
||||
"vpnkit",
|
||||
}
|
||||
)
|
||||
|
||||
//go:generate go run generate.go
|
||||
|
||||
func main() {
|
||||
// initialize the project MAINTAINERS file
|
||||
projectMaintainers := Maintainers{
|
||||
Org: map[string]*Org{},
|
||||
People: map[string]Person{},
|
||||
}
|
||||
|
||||
// initialize Curators
|
||||
projectMaintainers.Org["Curators"] = &Org{}
|
||||
projectMaintainers.Org["Docs maintainers"] = &Org{}
|
||||
|
||||
// parse the MAINTAINERS file for each repo
|
||||
for _, project := range projects {
|
||||
maintainers, err := getMaintainers(project)
|
||||
if err != nil {
|
||||
logrus.Errorf("%s: parsing MAINTAINERS file failed: %v", project, err)
|
||||
continue
|
||||
}
|
||||
|
||||
// create the Org object for the project
|
||||
p := &Org{
|
||||
// Repo: fmt.Sprintf("https://github.com/%s/%s", org, project),
|
||||
// TODO: change this to:
|
||||
// People: maintainers.Org["Core maintainers"].People,
|
||||
// once MaintainersDepreciated is removed.
|
||||
People: maintainers.Organization.CoreMaintainers.People,
|
||||
}
|
||||
|
||||
// lowercase all maintainers nicks for consistency
|
||||
for i, n := range p.People {
|
||||
p.People[i] = strings.ToLower(n)
|
||||
}
|
||||
|
||||
projectMaintainers.Org[project] = p
|
||||
|
||||
if maintainers.Organization.DocsMaintainers != nil {
|
||||
projectMaintainers.Org["Docs maintainers"].People = append(projectMaintainers.Org["Docs maintainers"].People, maintainers.Organization.DocsMaintainers.People...)
|
||||
}
|
||||
|
||||
if maintainers.Organization.Curators != nil {
|
||||
projectMaintainers.Org["Curators"].People = append(projectMaintainers.Org["Curators"].People, maintainers.Organization.Curators.People...)
|
||||
}
|
||||
|
||||
// iterate through the people and add them to compiled list
|
||||
for nick, person := range maintainers.People {
|
||||
projectMaintainers.People[strings.ToLower(nick)] = person
|
||||
}
|
||||
}
|
||||
|
||||
projectMaintainers.Org["Curators"].People = removeDuplicates(projectMaintainers.Org["Curators"].People)
|
||||
projectMaintainers.Org["Docs maintainers"].People = removeDuplicates(projectMaintainers.Org["Docs maintainers"].People)
|
||||
|
||||
// encode the result to a file
|
||||
buf := new(bytes.Buffer)
|
||||
t := toml.NewEncoder(buf)
|
||||
t.Indent = " "
|
||||
if err := t.Encode(projectMaintainers); err != nil {
|
||||
logrus.Fatalf("TOML encoding error: %v", err)
|
||||
}
|
||||
|
||||
file := append([]byte(head), []byte(rules)...)
|
||||
file = append(file, []byte(roles)...)
|
||||
file = append(file, buf.Bytes()...)
|
||||
|
||||
if err := ioutil.WriteFile("MAINTAINERS", file, 0755); err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
|
||||
logrus.Infof("Successfully wrote new combined MAINTAINERS file.")
|
||||
}
|
||||
|
||||
func removeDuplicates(slice []string) []string {
|
||||
seens := map[string]bool{}
|
||||
uniqs := []string{}
|
||||
for _, element := range slice {
|
||||
if _, seen := seens[element]; !seen {
|
||||
uniqs = append(uniqs, element)
|
||||
seens[element] = true
|
||||
}
|
||||
}
|
||||
return uniqs
|
||||
}
|
||||
|
||||
func getMaintainers(project string) (maintainers MaintainersDepreciated, err error) {
|
||||
fileUrl := fmt.Sprintf("%s/%s/%s/master/MAINTAINERS", ghRawUri, org, project)
|
||||
resp, err := http.Get(fileUrl)
|
||||
if err != nil {
|
||||
return maintainers, fmt.Errorf("%s: %v", project, err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
file, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return maintainers, fmt.Errorf("%s: %v", project, err)
|
||||
}
|
||||
|
||||
if _, err := toml.Decode(string(file), &maintainers); err != nil {
|
||||
return maintainers, fmt.Errorf("%s: parsing MAINTAINERS file failed: %v", project, err)
|
||||
}
|
||||
|
||||
return maintainers, nil
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
# Current project roles
|
||||
[Roles]
|
||||
|
||||
[Roles.bdfl]
|
||||
|
||||
person = "shykes"
|
||||
|
||||
[Roles."Chief Architect"]
|
||||
|
||||
person = "shykes"
|
||||
|
||||
text = """
|
||||
The chief architect is responsible for the overall integrity of the technical architecture
|
||||
across all subsystems, and the consistency of APIs and UI.
|
||||
|
||||
Changes to UI, public APIs and overall architecture (for example a plugin system) must
|
||||
be approved by the chief architect.
|
||||
"""
|
||||
|
||||
[Roles."Chief Maintainer"]
|
||||
|
||||
person = "crosbymichael"
|
||||
|
||||
text = """
|
||||
The chief maintainer is responsible for all aspects of quality for the project including
|
||||
code reviews, usability, stability, security, performance, etc.
|
||||
The most important function of the chief maintainer is to lead by example. On the first
|
||||
day of a new maintainer, the best advice should be "follow the C.M.'s example and you'll
|
||||
be fine".
|
||||
"""
|
||||
|
||||
[Roles."Community Manager"]
|
||||
|
||||
person = "theadactyl"
|
||||
|
||||
text = """
|
||||
The community manager is responsible for serving the project community, including users,
|
||||
contributors and partners. This involves:
|
||||
- facilitating communication between maintainers, contributors and users
|
||||
- organizing contributor and maintainer events
|
||||
- helping new contributors get involved
|
||||
- anything the project community needs to be successful
|
||||
|
||||
The community manager is a point of contact for any contributor who has questions, concerns
|
||||
or feedback about project operations.
|
||||
"""
|
||||
|
||||
|
||||
@@ -1,240 +0,0 @@
|
||||
[Rules]
|
||||
|
||||
[Rules.maintainers]
|
||||
|
||||
title = "What is a maintainer?"
|
||||
|
||||
text = """
|
||||
There are different types of maintainers, with different responsibilities, but
|
||||
all maintainers have 3 things in common:
|
||||
|
||||
1) They share responsibility in the project's success.
|
||||
2) They have made a long-term, recurring time investment to improve the project.
|
||||
3) They spend that time doing whatever needs to be done, not necessarily what
|
||||
is the most interesting or fun.
|
||||
|
||||
Maintainers are often under-appreciated, because their work is harder to appreciate.
|
||||
It's easy to appreciate a really cool and technically advanced feature. It's harder
|
||||
to appreciate the absence of bugs, the slow but steady improvement in stability,
|
||||
or the reliability of a release process. But those things distinguish a good
|
||||
project from a great one.
|
||||
"""
|
||||
[Rules.adding-maintainers]
|
||||
|
||||
title = "How are maintainers added?"
|
||||
|
||||
text = """
|
||||
Maintainers are first and foremost contributors that have shown they are
|
||||
committed to the long term success of a project. Contributors wanting to
|
||||
become maintainers are expected to be deeply involved in contributing code,
|
||||
pull request review, and triage of issues in the project for more than three
|
||||
months.
|
||||
|
||||
Just contributing does not make you a maintainer, it is about building trust
|
||||
with the current maintainers of the project and being a person that they can
|
||||
depend on and trust to make decisions in the best interest of the project.
|
||||
|
||||
Maintainers are assigned per project (repository). Being a maintainer in
|
||||
one project does not automatically make you a maintainer in other projects.
|
||||
|
||||
Periodically, the existing maintainers curate a list of contributors that have
|
||||
shown regular activity on the project over the prior months. From this
|
||||
list, maintainer candidates are selected and proposed on the maintainers
|
||||
mailing list.
|
||||
|
||||
After a candidate has been announced on the maintainers mailing list, the
|
||||
existing maintainers are given five business days to discuss the candidate,
|
||||
raise objections and cast their vote. Candidates must be approved by the BDFL
|
||||
and at least 66% of the current maintainers by adding their vote on the mailing
|
||||
list. Only maintainers of the repository that the candidate is proposed for are
|
||||
allowed to vote. The BDFL's vote is mandatory.
|
||||
|
||||
If a candidate is approved, a maintainer will contact the candidate to
|
||||
invite the candidate to open a pull request that adds the contributor to
|
||||
the MAINTAINERS file. The candidate becomes a maintainer once the pull
|
||||
request is merged.
|
||||
"""
|
||||
|
||||
[Rules.stepping-down-policy]
|
||||
|
||||
title = "Stepping down policy"
|
||||
|
||||
text = """
|
||||
Life priorities, interests, and passions can change. If you're a maintainer but
|
||||
feel you must remove yourself from the list, inform other maintainers that you
|
||||
intend to step down, and if possible, help find someone to pick up your work.
|
||||
At the very least, ensure your work can be continued where you left off.
|
||||
|
||||
After you've informed other maintainers, create a pull request to remove
|
||||
yourself from the MAINTAINERS file.
|
||||
"""
|
||||
|
||||
[Rules.inactive-maintainers]
|
||||
|
||||
title = "Removal of inactive maintainers"
|
||||
|
||||
text = """
|
||||
Similar to the procedure for adding new maintainers, existing maintainers can
|
||||
be removed from the list if they do not show significant activity on the
|
||||
project. Periodically, the maintainers review the list of maintainers and their
|
||||
activity over the last three months.
|
||||
|
||||
If a maintainer has shown insufficient activity over this period, a neutral
|
||||
person will contact the maintainer to ask if they want to continue being
|
||||
a maintainer. If the maintainer decides to step down as a maintainer, they
|
||||
open a pull request to be removed from the MAINTAINERS file.
|
||||
|
||||
If the maintainer wants to remain a maintainer, but is unable to perform the
|
||||
required duties they can be removed with a vote by the BDFL and at least 66% of
|
||||
the current maintainers. The BDFL's vote is mandatory. An e-mail is sent to the
|
||||
mailing list, inviting maintainers of the project to vote. The voting period is
|
||||
five business days. Issues related to a maintainer's performance should be
|
||||
discussed with them among the other maintainers so that they are not surprised
|
||||
by a pull request removing them.
|
||||
"""
|
||||
|
||||
[Rules.alumni]
|
||||
|
||||
title = "Alumni"
|
||||
|
||||
text = """
|
||||
Projects can opt to keep a list of former maintainers in the MAINTAINERS file.
|
||||
Instead of removing a maintainer from the file when they step down, the maintainer
|
||||
is moved to the alumni list (`[Org.Alumni]`). People on this list have
|
||||
no official capacity in the project, it's a way to say "thank you" for the
|
||||
work they have done for the project.
|
||||
"""
|
||||
|
||||
[Rules.bdfl]
|
||||
|
||||
title = "The Benevolent dictator for life (BDFL)"
|
||||
|
||||
text = """
|
||||
Docker follows the timeless, highly efficient and totally unfair system
|
||||
known as [Benevolent dictator for
|
||||
life](https://en.wikipedia.org/wiki/Benevolent_Dictator_for_Life), with
|
||||
yours truly, Solomon Hykes, in the role of BDFL. This means that all
|
||||
decisions are made, by default, by Solomon. Since making every decision
|
||||
myself would be highly un-scalable, in practice decisions are spread
|
||||
across multiple maintainers.
|
||||
|
||||
Ideally, the BDFL role is like the Queen of England: awesome crown, but not
|
||||
an actual operational role day-to-day. The real job of a BDFL is to NEVER GO AWAY.
|
||||
Every other rule can change, perhaps drastically so, but the BDFL will always
|
||||
be there, preserving the philosophy and principles of the project, and keeping
|
||||
ultimate authority over its fate. This gives us great flexibility in experimenting
|
||||
with various governance models, knowing that we can always press the "reset" button
|
||||
without fear of fragmentation or deadlock. See the US congress for a counter-example.
|
||||
|
||||
BDFL daily routine:
|
||||
|
||||
* Is the project governance stuck in a deadlock or irreversibly fragmented?
|
||||
* If yes: refactor the project governance
|
||||
* Are there issues or conflicts escalated by core?
|
||||
* If yes: resolve them
|
||||
* Go back to polishing that crown.
|
||||
"""
|
||||
|
||||
[Rules.decisions]
|
||||
|
||||
title = "How are decisions made?"
|
||||
|
||||
text = """
|
||||
Short answer: EVERYTHING IS A PULL REQUEST.
|
||||
|
||||
Docker is an open-source project with an open design philosophy. This
|
||||
means that the repository is the source of truth for EVERY aspect of the
|
||||
project, including its philosophy, design, road map, and APIs. *If it's
|
||||
part of the project, it's in the repo. If it's in the repo, it's part of
|
||||
the project.*
|
||||
|
||||
As a result, all decisions can be expressed as changes to the
|
||||
repository. An implementation change is a change to the source code. An
|
||||
API change is a change to the API specification. A philosophy change is
|
||||
a change to the philosophy manifesto, and so on.
|
||||
|
||||
All decisions affecting Docker, big and small, follow the same 3 steps:
|
||||
|
||||
* Step 1: Open a pull request. Anyone can do this.
|
||||
|
||||
* Step 2: Discuss the pull request. Anyone can do this.
|
||||
|
||||
* Step 3: Merge or refuse the pull request. Who does this depends on the nature
|
||||
of the pull request and which areas of the project it affects. See *review flow*
|
||||
for details.
|
||||
|
||||
Because Docker is such a large and active project, it's important for everyone to know
|
||||
who is responsible for deciding what. That is determined by a precise set of rules.
|
||||
|
||||
* For every *decision* in the project, the rules should designate, in a deterministic way,
|
||||
who should *decide*.
|
||||
|
||||
* For every *problem* in the project, the rules should designate, in a deterministic way,
|
||||
who should be responsible for *fixing* it.
|
||||
|
||||
* For every *question* in the project, the rules should designate, in a deterministic way,
|
||||
who should be expected to have the *answer*.
|
||||
"""
|
||||
|
||||
[Rules.review]
|
||||
|
||||
title = "Review flow"
|
||||
|
||||
text = """
|
||||
Pull requests should be processed according to the following flow:
|
||||
|
||||
* For each subsystem affected by the change, the maintainers of the subsystem must approve or refuse it.
|
||||
It is the responsibility of the subsystem maintainers to process patches affecting them in a timely
|
||||
manner.
|
||||
|
||||
* If the change affects areas of the code which are not part of a subsystem,
|
||||
or if subsystem maintainers are unable to reach a timely decision, it must be approved by
|
||||
the core maintainers.
|
||||
|
||||
* If the change affects the UI or public APIs, or if it represents a major change in architecture,
|
||||
the architects must approve or refuse it.
|
||||
|
||||
* If the change affects the operations of the project, it must be approved or rejected by
|
||||
the relevant operators.
|
||||
|
||||
* If the change affects the governance, philosophy, goals or principles of the project,
|
||||
it must be approved by BDFL.
|
||||
"""
|
||||
|
||||
[Rules.DCO]
|
||||
|
||||
title = "Helping contributors with the DCO"
|
||||
|
||||
text = """
|
||||
The [DCO or `Sign your work`](
|
||||
https://github.com/docker/docker/blob/master/CONTRIBUTING.md#sign-your-work)
|
||||
requirement is not intended as a roadblock or speed bump.
|
||||
|
||||
Some Docker contributors are not as familiar with `git`, or have used a web based
|
||||
editor, and thus asking them to `git commit --amend -s` is not the best way forward.
|
||||
|
||||
In this case, maintainers can update the commits based on clause (c) of the DCO. The
|
||||
most trivial way for a contributor to allow the maintainer to do this, is to add
|
||||
a DCO signature in a pull requests's comment, or a maintainer can simply note that
|
||||
the change is sufficiently trivial that it does not substantially change the existing
|
||||
contribution - i.e., a spelling change.
|
||||
|
||||
When you add someone's DCO, please also add your own to keep a log.
|
||||
"""
|
||||
|
||||
[Rules."no direct push"]
|
||||
|
||||
title = "I'm a maintainer. Should I make pull requests too?"
|
||||
|
||||
text = """
|
||||
Yes. Nobody should ever push to master directly. All changes should be
|
||||
made through a pull request.
|
||||
"""
|
||||
|
||||
[Rules.meta]
|
||||
|
||||
title = "How is this process changed?"
|
||||
|
||||
text = "Just like everything else: by making a pull request :)"
|
||||
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
package main
|
||||
|
||||
// Maintainers defines the struct for a MAINTAINERS file
|
||||
type Maintainers struct {
|
||||
Rules map[string]Rule
|
||||
Roles map[string]Role
|
||||
Org map[string]*Org
|
||||
People map[string]Person
|
||||
}
|
||||
|
||||
// Rule is a project rule
|
||||
type Rule struct {
|
||||
Title string `toml:"title,omitempty"`
|
||||
Text string `toml:"text,omitempty"`
|
||||
}
|
||||
|
||||
// Role is a project role
|
||||
type Role struct {
|
||||
Person string `toml:"person,omitempty"`
|
||||
Text string `toml:"text,omitempty"`
|
||||
}
|
||||
|
||||
// Org defines the organization within a project
|
||||
type Org struct {
|
||||
People []string
|
||||
}
|
||||
|
||||
// Person member of the project
|
||||
type Person struct {
|
||||
Name string
|
||||
Email string
|
||||
GitHub string
|
||||
}
|
||||
|
||||
// MaintainersDepreciated is an old struct for compatibility
|
||||
// with the docker/docker maintainers file.
|
||||
// TODO: delete this once the file in docker/docker repo is updated
|
||||
type MaintainersDepreciated struct {
|
||||
Rules map[string]Rule
|
||||
Organization Organization `toml:"Org"`
|
||||
People map[string]Person
|
||||
}
|
||||
|
||||
// Organization defines the project's organization
|
||||
// TODO: delete this once MaintainersDepreciated is removed
|
||||
type Organization struct {
|
||||
BDFL string `toml:"bdfl"`
|
||||
ChiefArchitect string `toml:"Chief Architect"`
|
||||
ChiefMaintainer string `toml:"Chief Maintainer"`
|
||||
CommunityManager string `toml:"Community Manager"`
|
||||
CoreMaintainers *Org `toml:"Core maintainers"`
|
||||
DocsMaintainers *Org `toml:"Docs maintainers"`
|
||||
Curators *Org `toml:"Curators"`
|
||||
}
|
||||
|
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 113 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 223 KiB After Width: | Height: | Size: 223 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 207 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 305 KiB After Width: | Height: | Size: 305 KiB |
|
Before Width: | Height: | Size: 151 B After Width: | Height: | Size: 151 B |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 223 B After Width: | Height: | Size: 223 B |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 111 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |