//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//
//http://www.apache.org/licenses/LICENSE-2.0
//
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
= Mentors' Guide
Apache Incubator PMC
2002-10-16
:jbake-type: pmcGuide
:jbake-status: published
:idprefix:
:toc:
:imagesdir: ../images/

The Mentors' guide is a go-to place for information about getting a podling up and running from an infrastructure point of view.

This document targets any Incubating Project member, but
especially Mentors, who have to ensure that some things get done.
For a general description of the role of a mentor on an incubating
project see the
link:/guides/roles_and_responsibilities.html#Mentor[Roles and Responsibilities]document.

This guide is a descriptive and at times
discursive document. It describes established practices.
It is informational not normative. Policy is laid down in the
link:/incubation/Incubation_Policy.html[Incubation Policy].

== Overview

After the Podling has been accepted by the Incubator PMC, one of the mentors
link:/incubation/Incubation_Policy.html#Setting+Up+a+New+Podling[sets up]
the Podling; _i.e._ adds the podling metadata, creates the initial Podling status page, and
either creates or requests that
other resources (mail lists, subversion, bug tracker, _etc._)
be created.

== Add to Incubation Summary file

Add the podling to the podling summary file in
the "incubator" SVN at *content/podlings.xml*
(e.g. copy the entry from another podling that also has status="current")
and see link:website.html[instructions].

Please do this step ASAP after Acceptance. Other setup procedures utilize
this metadata.

Add a *'reporting'* tag (after *'description'*) with the attribute *'monthly="true"'*
and the appropriate "group" attribute, based on the month in which  the podling
entered incubation (1 for January, April, July, October, 2 for February, May,
August, November or 3 for March, June, September, December). The text content
of the 'reporting' tag must contain the initial list of reporting months,
starting with the month after the podling entered incubation.  Below is an example of the final XML snippet

[literal]
----
    <podling name="PodlingName" status="current" resource="podlingname" sponsor="Sponsor" startdate="YYYY-MM-DD">
        <description>A description of the podling, for the status page and reports</description>
        <reporting group="1|2|3" monthly="true">First,Second,Third</reporting>
        <champion availid="userid">Champion Name</champion>
        <mentors>
            <mentor username="userid">Mentor One</mentor>
            <mentor username="userid">Mentor Two</mentor>
            <mentor username="userid">Mentor Three</mentor>
        </mentors>
    </podling>
----

An example reporting block:
[literal]
----
<reporting group="3" monthly="true">June, July, August</reporting>
----
Once the first three reports are complete, the monthly attribute should be removed
and the list of months removed as well.

The first report might be
very short. However it is better that the Incubator PMC can help to
guide through the early setup stages.
For more details see the
link:ppmc.html#Incubator+ASF+Board+Reports[PPMC Guide].

== Initialize Podling Status Page

A mentor needs to
link:website.html#Edit+your+project+status+page[create the web page] that will track the project's status.
A mentor will also need to update it until
link:ppmc.html#Project+Status+Updates[others in the project's PPMC can update it].

The status
page is the incubator's record of the progress made.
It MUST be kept update to date during incubation.
Some of the information is available from the proposal.
As the startup process continues and resources are
created the status SHOULD be updated.

The template contains lists of actions which may be needed
to start up a podling. All those which do not apply should
be deleted.

The status page is a useful aid to workflow. Volunteers
can use it to sign up to the various tasks and monitor their
progress. Once the mailing lists are set up and prospective
committers subscribe then these may be used for discussion.

== Resources

Resources should be requested in a particular order, and based on paperwork processed.  Do not request source repositories before SGAs are filed, for instance, if the source code is not already Apache licensed or Category A licensed.

The proposal should include a list of required resources. All of these will
require active set up. Some are created by infrastructure after an appropriate
request, others can be set up by any IPMC members (typically mentors).

The first resources to be created are LDAP and DNS.  These should be requested via link:https://issues.apache.org/jira/browse/INFRA[Apache Infra JIRA -> New Podling Parent Request]

Once these items are requested, mailing lists should be created next. Other resources typically post information to these lists.

=== Request Mailing Lists

Apache mailing lists require volunteer moderators. New moderators can be
link:http://www.apache.org/dev/committers.html#mailing-list-moderators[changed later]
but at least one volunteer is required before the mailing lists can be set up.
Moderation is a reasonably
link:http://www.apache.org/dev/committers.html#mail-moderate[easy task]
though moderators may want to set up
link:http://spamassassin.apache.org/[spam filtering].
Having at least three moderators is recommended to spread the load.

The proposal should contain the rest of the information that needs to be collected
before the mailing lists can be requested. Incubator is the responsible top level project.
So the domain *MUST* be *incubator.apache.org*.
For example:

- dev@${podling}.incubator.apache.org
- commits@${podling}.incubator.apache.org
- private@${podling}.incubator.apache.org

For initial community building it is usually appropriate to only have a "dev" list, to keep the discussions focussed. Later add a "user" list if needed.  A podling that is already established and using an existing user interaction channel may want to keep those resources around until they feel they have transitioned to the ASF successfully.  You will want to discuss this on your existing development lists.

[NOTE]
====
If you are using SVN
Commits under *http://svn.apache.org/repos/asf/incubator/_${podling}_* will be emailed to *commits@${podling}.incubator.apache.org*.
Any deviation will require special configuration in the *asf-mailer.conf* file by the IPMC.
====

Mailing lists creation is a task for the link:#who-infra[infrastructure team]. The
infrastructure team offers a tool that simplifies the creation of mailing lists.  You can access the
link:https://selfserve.apache.org/mail.html[Incubator Mailing List Request Form^]
to request a list.  A notification will be sent to private@incubator when the lists have been created.

Remember to update the project status file with mailing list details. Prospective committers
and mentors will need to subscribe. Email them once the status file has been updated. Inform
any existing mailing lists or forums previously used by the project.

Once the *commits* list is created, the project MUST review
the */incubator/${podling}* tree, since any commits made prior
to the list's creation will have generated no email trail.

==== Mail Archives

Archives at link:http://mail-archives.apache.org[http://mail-archives.apache.org] for the public
mailing lists will be setup as part of the mailing list creation process. No action is
required by Mentors. The archives will be link:http://mail-archives.apache.org/mod_mbox/[visible]
as soon as posts have been made (and moderated) to these lists.

You can also leverage link:https://lists.apache.org[lists.apache.org^] for
mailing list archives.  There is a login link in the top right corner, which allows you to respond to
threads from within the web application.

Many projects are independently archived externally (for example, at
link:http://www.mail-archive.com/[The Mail Archive] and
link:http://marc.info/?q=about[MARC])
Independent archives help to
increase project visibility as well as preserving a independent historic record.
These subscriptions are not automatically created. If desired, subscribe manually.

Subscriptions to news-to-mailing-list bridges (for example, link:http://www.nabble.com[Nabble])
must also be created manually. Subscribing helps accessibility and visibility but Nabble news
users may not be aware that they are posting to a mailing list.

==== Mailing List Administration

Apache uses link:http://www.ezmlm.org/[ezmlm]. See the
link:http://www.ezmlm.org/man/ezmlmman.html[manual] and
committer link:http://www.apache.org/dev/committers.html#mail[mail FAQ]
for more details.

==== Mailing List Transition

Independent mailing lists and groups are perfectly acceptable but development should
happen on the official mailing lists at Apache. If a project has existing mailing lists,
forums or groups the community needs to consider their future and plan for the transition
to the official Apache mailing lists.

It may be useful to move development first to the official lists followed gradually
by the user resources.

Note that subscribers of external mailing lists will not be automatically subscribed
to the new Incubator project mailing lists. Instead, a note should be posted to the
old external mailing list asking them to subscribe to the new list. If possible, add
a footer to the old mailing list with some instructions.

=== Self Service Requests

Most of the resources you will request can be done via Self Service.  To do that, visit https://selfserve.apache.org/ and request the necessary resources.  This includes git, mailing lists, JIRA and Confluence.  If you do not have access to Self Serve, please use link:https://issues.apache.org/jira/browse/INFRA[JIRA] instead.

==== JIRA Issue Tracking

To request JIRA, visit https://selfserve.apache.org/jira.html

==== Other Issue Trackers

Request an issue tracker on the link:https://issues.apache.org/jira/browse/INFRA[infra jira]

Remember to post an email announcing that the issue tracker is available.

=== Git Migrations

To request a git migration, please file a link:https://issues.apache.org/jira/browse/INFRA[New Git Repository] infra ticket, requesting to migrate from an existing organization to the Apache Organization

=== Gitbox Requests

To request gitbox repositories for a new podling, please first file a link:https://issues.apache.org/jira/browse/INFRA[GitBox Integration] infra ticket.  Once your podling has been added, you can use link:https://gitbox.apache.org/ to manage your gitbox repositories and user information.

== Podling Bootstrap

Following podling creation, it needs to be bootstrapped. Here are some of the tasks:

* Ensure link:#mentors-ipmc[Mentors are on the IPMC]
* Add podling to link:#Sending+in+an+Incubation+Report[reporting schedule]
* link:#Initialize+Podling+Status+Page[Initialize project status page]
* Start link:#orientation[orientation] link:#who-committers[Prospective committers]
* Start *CLA* and *CCLA* submission link:#who-committers[Prospective committers]
* Request Required Resources  
** link:#request-mailing-lists[Mailing Lists]
*** Consider and plan link:#transition-mailing-lists[transition to official mailing lists]
*** Ensure all PPMC members are signed up to teh private mailing list
** link:#request-issue-tracking[Issue Tracking]
*** Consider and plan link:#issue-tracking-transition[issue tracking transition]
* link:#create-website[Create website] link:#who-committers[Prospective committers]
** Consider and plan link:#web-site-transition[web site transition]
* Start link:#initial-ip-clearance[IP Clearance]
* Start *SGA* submission
** link:#Set+Up+Repository[Transfer Repos]

== Mentors MUST be on the IPMC

Mentors link:/policy/incubation.html#Mentor[MUST] be on the IPMC.  This should be checked prior to beginning incubation.
Any prospective Mentors who are not yet on the IPMC should ask to be added (by election).
Email the application to *private@incubator.apache.org*.

[NOTE]
====
This process may take a few days.
====

== CLA and CCLA Submission

Prospective committers need to submit a Contributor License Agreement
(link:http://www.apache.org/licenses/#clas[CLA]).
This process can take a while so it is recommended that committers start to submit
these as soon as the podling is accepted.
