 ------
 Archiva Sites Publishing
 ------

Publishing the Archiva Site

  The Archiva site, documentation and reference documentation are now
  published to <<<http://archiva.apache.org/>>> using the
  {{{http://www.apache.org/dev/project-site.html#svnpubsub} ASF's svnpubsub}}
  service.

  The files published to the site are all stored under the Subversion
  repository at {{http://svn.apache.org/repos/asf/archiva/site-content/}}.

  This mostly operates like a normal site deployment, though there are some
  specific customisations and special instructions for the reference library.
  The processes follow those described for the
  {{{http://maven.apache.org/plugins/maven-scm-publish-plugin/}Maven SCM Publish Plugin}}
  for
  {{{http://maven.apache.org/plugins/maven-scm-publish-plugin/examples/one-module-configuration.html}
  Single module projects}} and
  {{{http://maven.apache.org/plugins/maven-scm-publish-plugin/examples/multi-module-configuration.html}
  Multi-module projects}} as applicable.

  Each site checks out the production site data into the <<<site-publish>>>
  directory of the current project, to avoid being cleaned as part of the
  build. It is ignored by <<<svn>>> operations, but you should ensure that
  the checkout is clean if you ever cancel or have a failure during a publish
  operation. You can check it is clean by ensuring there is no data from
  <<<git status>>> in that directory, or by removing it and having it get
  checked out again.

* Editing and Publishing the Main Site

  The site displayed at the root of {{http://archiva.apache.org}} (where
  you are reading this) has its source code in Git at
  {{https://gitbox.apache.org/repos/asf/archiva-site.git}}.

  To edit and publish the site, do the following:

    [[1]] Checkout the source code from Git (if you follow the
          instructions in {{{./building.html} Building Archiva}}, you know
          how to have it.

    [[2]] Make edits and check them using <<<mvn site>>> or <<<mvn
          site:run>>> until satisfied.

    [[3]] Commit your changes (making sure your working copy is completely up
          to date first)

    [[4]] Publish the site:

----
mvn site-deploy
----

  This site deployment can be done at any time, and is not tied to releases.

  Note that since the main site also contains the (large!) <<<docs>>> and 
  <<<ref>>> directories in the <<<site-publish>>> directory, there is a
  special <<<setup-checkout>>> profile in place to get the initial checkout
  without those directories. This will normally be activated whenever the
  <<<site-publish>>> directory is missing - if you happen to have active
  profiles from your <<<settings.xml>>> you may need to enable it explicitly
  whenever you do a deployment and that checkout is missing: <<<mvn
  site-deploy -Psetup-checkout>>>   

* Editing and Publishing the Archiva Documentation

  The documentation displayed under the subdirectories of
  {{http://archiva.apache.org/docs/}} has its source code in Git at
  {{https://gitbox.apache.org/repos/asf/archiva.git}} directory archiva-docs, which
  is part of the main project checkout.

  The instructions for managing the documentation is the same as for the main
  site, being published from the directory using:

----
mvn site-deploy
----

  However, in this case it is typically done as part of a release process - 
  see {{{./releasing.html} Releasing Archiva}} for instructions on doing this.

  The documentation remains versioned based on the release it is related to.
  To best manage this with svnpubsub, the site is always published into a
  directory <<<docs/latest>>>, only requiring a small number of modifications
  to be made. Then, as part of the release instructions, the <<<latest>>>
  directory is copied to the versioned location - for example,
  <<<http://svn.apache.org/repos/asf/archiva/site-content/docs/1.4-M4>>>.

  For <<<site:stage>>> to apply correctly without needing a full checkout, a
  workaround is applied by setting the <<<distributionManagement/site/url>>>
  element to match that of the parent site. The value is then overridden with
  the correct value in the <<<maven-scm-publish-plugin>>> configuration. This
  avoids the Site plugin attempting to relativize links incorrectly.

* Editing and Publishing the Reference Documentation

  The reference documentation, including JavaDocs and source cross-reference,
  is displayed under the URL {{http://archiva.apache.org/ref}}. At this
  time, only the latest reference documents are retained. They require quite
  a lot of space, and historical information is of less relevance to
  Archiva developers or users.

  To publish the latest reference documents, you need to run:

----
cd archiva-modules
mvn site site:stage scm-publish:publish-scm
or
sh ./deploySite.sh
----

  This will likely cause a very large commit, and should be done
  infrequently. Once per release is likely to be adequate.

* Publishing Redback site

  The redback is stored under the Subversion repository at {{https://svn.apache.org/repos/asf/archiva/redback/redback-site/trunk}}.

  It's displayed under the URL {{http://archiva.apache.org/redback}}.

  To publish documentation, you need to run:

----
mvn site-deploy
----

* Publishing Redback Core reference

  The Redback core reference is displayed under the URL {{http://archiva.apache.org/redback/core}}.

  It contains javadoc for Redback core.

  To publish documentation, you need to run:

----
mvn clean site-deploy scm-publish:publish-scm
or
sh ./deploySite.sh
----

* Publishing Redback Components reference

  The Redback components reference is displayed under the URL {{http://archiva.apache.org/redback/components}}.

  It contains javadoc for Redback components.

  To publish documentation, you need to run:

----
mvn clean site-deploy scm-publish:publish-scm
or
sh ./deploySite.sh
----


  
