:linkattrs:
= Plugin Lifecycle

Most of the plugins are hosted on the same instance as the
link:https://gerrit-review.googlesource.com[Gerrit project itself,role=external,window=_blank] to make them
more discoverable and have more chances to be reviewed by the whole community.

[[hosting_lifecycle]]
== Hosting Lifecycle

The process of writing a new plugin goes through different phases:

- Ideation and Discussion:
+
The idea of creating a new plugin is posted and discussed on the
link:https://groups.google.com/d/forum/repo-discuss[repo-discuss,role=external,window=_blank] mailing list.
+
Also see section link#ideation_discussion[Ideation and discussion] below.

- Prototyping (optional):
+
The author of the plugin creates a working prototype on a public repository
accessible to the community.
+
Also see section link#plugin_prototyping[Plugin Prototyping] below.

- Proposal and Hosting:
+
The author proposes to release the plugin under the
link:https://www.apache.org/licenses/LICENSE-2.0.html[Apache 2.0 OpenSource
license,role=external,window=_blank] and requests the plugin to be hosted on
link:https://gerrit-review.googlesource.com[the Gerrit project site,role=external,window=_blank]. The
proposal must be   accepted by at least one Gerrit maintainer. In case of
disagreement between maintainers, the issue can be escalated to the
link:dev-processes.html#steering-committee[Engineering Steering Committee]. If
the plugin is accepted, the Gerrit maintainer creates the project under the
plugins path on link:https://gerrit-review.googlesource.com[the Gerrit project
site,role=external,window=_blank].
+
Also see section link#plugin_proposal[Plugin Proposal] below.

- Build:
+
To make the consumption of the plugin easy and to notice plugin breakages early
the plugin author should setup build jobs on
link:https://gerrit-ci.gerritforge.com[the GerritForge CI,role=external,window=_blank] that build the
plugin for each Gerrit version that it supports.
+
Also see section link#build[Build] below.

- Development and Contribution:
+
The author develops a production-ready code base of the plugin, with
contributions, reviews, and help from the Gerrit community.
+
Also see section link#development_contribution[Development and contribution]
below.

- Release:
+
The author releases the plugin by creating a Git tag and announcing the plugin
on the link:https://groups.google.com/d/forum/repo-discuss[repo-discuss,role=external,window=_blank]
mailing list.
+
Also see section link#plugin_release[Plugin release] below.

- Maintenance:
+
The author maintains their plugins as new Gerrit versions are released, updates
them when necessary, develops further existing or new features and reviews
incoming contributions.

- Deprecation:
+
The author declares that the plugin is not maintained anymore or is deprecated
and should not be used anymore.
+
Also see section link#plugin_deprecation[Plugin deprecation] below.

[[ideation_discussion]]
== Ideation and Discussion

Starting a new plugin project is a community effort: it starts with the
identification of a gap in the Gerrit Code Review product but evolves with the
contribution of ideas and suggestions by the whole community.

The ideator of the plugin starts with an RFC (Request For Comments) post on the
link:https://groups.google.com/d/forum/repo-discuss[repo-discuss,role=external,window=_blank] mailing list
with a description of the main reasons for starting a new plugin.

Example of a post:

----
  [RFC] Code-Formatter plugin

  Hello, community,
  I am proposing to create a new plugin for Gerrit called 'Code-Formatter', see
  the details below.

  *The gap*
  Often, when I post a new change to Gerrit, I forget to run the common code
  formatting tool (e.g. Google-Java-Format for the Gerrit project). I would
  like Gerrit to be in charge of highlighting these issues to me and save many
  people's time.

  *The proposal*
  The Code-Formatter plugin reads the formatting rules in the project config
  and applies them automatically to every patch-set. Any issue is reported as a
  regular review comment to the patchset, highlighting the part of the code to
  be changed.

  What do you think? Did anyone have the same idea or need?
----

The idea is discussed on the mailing list and can evolve based on the needs and
inputs from the entire community.

After the discussion, the ideator of the plugin can decide to start prototyping
on it or park the proposal, if the feedback provided an alternative solution to
the problem. The prototype phase can be optionally skipped if the idea is clear
enough and receives a general agreement from the Gerrit maintainers. The author
can be given a "leap of faith" and can go directly to the format plugin
proposal (see below) and the creation of the plugin repository.

[[plugin_prototyping]]
== Plugin Prototyping

The initial idea is translated to code by the plugin author. The development
can happen on any public or private source code repository and can involve one
or more contributors. The purpose of prototyping is to verify that the idea can
be implemented and provides the expected benefits.

Once a working prototype is ready, it can be announced as a follow-up to the
initial RFC proposal so that other members of the community can see the code
and try the plugin themselves.

[[plugin_proposal]]
== Plugin Proposal

The author decides that the plugin prototype makes sense as a general purpose
plugin and decides to release the code with the same
link:https://www.apache.org/licenses/LICENSE-2.0.html[Apache 2.0 license,role=external,window=_blank]
as the Gerrit Code Review project and have it hosted on
link:https://gerrit-review.googlesource.com[the Gerrit project site,role=external,window=_blank].

The plugin author formalizes the proposal with a follow-up of the initial RFC
post and asks for public opinion on it.

Example:

----
  Re - [RFC] Code-Formatter plugin

  Hello, community,
  thanks for your feedback on the prototype. I have now decided to donate the
  project to the Gerrit Code Review project and make it a plugin:

  Plugin name:
  /plugins/code-formatter

  Plugin description:
    Plugin to allow automatic posting review based on code-formatting rules
----

The community discusses the proposal and the value of the plugin for the whole
project; the result of the discussion can end up in one of the following cases:

- The plugin's project request is widely appreciated and formally accepted by
  at least one Gerrit maintainer who creates the repository as child project of
  'Public-Projects' on link:https://gerrit-review.googlesource.com[the Gerrit
  project site,role=external,window=_blank], creates an associated plugin owners group with "Owner"
  permissions for the plugin and adds the plugin's author as member of it.
- The plugin's project is widely appreciated; however, another existing plugin
  already partially covers the same use-case and thus it would make more sense
  to have the features integrated into the existing plugin. The new plugin's
  author contributes his prototype commits refactored to be included as change
  into the existing plugin.
- The plugin's project is found useful; however, it is too specific to the
  author's use-case and would not make sense outside of it. The plugin remains
  in a public repository, widely accessible and OpenSource, but not hosted on
  link:https://gerrit-review.googlesource.com[the Gerrit project site,role=external,window=_blank].

[[build]]
== Build

The plugin's maintainer creates a job on the
link:https://gerrit-ci.gerritforge.com[GerritForge CI,role=external,window=_blank] by creating a new YAML
definition in the link:https://gerrit.googlesource.com/gerrit-ci-scripts[Gerrit
CI Scripts,role=external,window=_blank] repository.

Example of a YAML CI job for plugins:

----
  - project:
    name: code-formatter
    jobs:
      - 'plugin-{name}-bazel-{branch}':
          branch:
            - master
----

[[development_contribution]]
== Development and Contribution

The plugin follows the same lifecycle as Gerrit Code Review and needs to be
kept up-to-date with the current active branches, according to the
link:https://www.gerritcodereview.com/#support[current support policy,role=external,window=_blank].
During the development, the plugin's maintainer can reward contributors
requesting to be more involved and making them maintainers of his plugin,
adding them to the list of the project owners.

[[plugin_release]]
== Plugin Release

The plugin's maintainer is the only person responsible for making and
announcing the official releases, typically, but not limited to, in conjunction
with the major releases of Gerrit Code Review. The plugin's maintainer may tag
his plugin and follow the notation and semantics of the Gerrit Code Review
project; however it is not mandatory and many of the plugins do not have any
tags or releases.

Example of a YAML CI job for a plugin compatible with multiple Gerrit versions:

----
  - project:
    name: code-formatter
    jobs:
      - 'plugin-{name}-bazel-{branch}-{gerrit-branch}':
          branch:
            - master
          gerrit-branch:
            - master
            - stable-3.0
            - stable-2.16
----

[[plugin_deprecation]]
== Plugin Deprecation

The plugin's maintainer and the community have agreed that the plugin is not
useful anymore or there isn't anyone willing to contribute to bringing it
forward and keeping it up-to-date with the recent versions of Gerrit Code
Review.

The plugin's maintainer puts a deprecation notice in the README.md of the
plugin and pushes it for review. If nobody is willing to bring the code
forward, the change gets merged, and the master branch is removed from the list
of branches to be built on the GerritFoge CI.

GERRIT
------
Part of link:index.html[Gerrit Code Review]

SEARCHBOX
---------
