 ------
 Deploying With Network Issues
 ------
 Hervé Boutemy
 ------
 2019-01-20
 ------

~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements.  See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership.  The ASF licenses this file
~~ to you 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.

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html

Deploying With Network Issues

 Sometimes, network quality from building machine to the remote repository is not perfect.
 Of course, improving the network would be the best solution, but it is not always possible.

 There are a few strategies to work around the network issue.

* Configuring Multiple Tries

 Deploy plugin provides {{{../deploy-mojo.html#retryFailedDeploymentCount}<<<retryFailedDeploymentCount>>> parameter}}
 to retry deployment multiple times before giving up and returning a failure for the <<<deploy>>> goal: 

+----+
<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-deploy-plugin</artifactId>
        <configuration>
          <retryFailedDeploymentCount>3</retryFailedDeploymentCount>
        <configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
+----+

* Deploying to a Local Staging Directory

 When the network is really not consistent, a deeper strategy is to deploy in 2 steps:

 1. <<<deploy>>> to a local <<<file:./target/staging-deploy>>> directory during the build,

 2. then copy from the local area to the target remote repository, retrying as much as necessary.

 []

** Deploying to a Local Directory

 Deploying to a local directory can be done from command line, without changing POM, using
 {{{../deploy-mojo.html#altDeploymentRepository}<<<altDeploymentRepository>>> parameter}}:
 
+----+
mvn deploy -DaltDeploymentRepository=local::file:./target/staging-deploy
+----+  

 Notice: with maven-deploy-plugin 2.x, the parameter format was <<<local::default::file:./target/staging-deploy>>>

 Of course, if you want can configure the repository in your <<<pom.xml>>> if you want to go from a temporary strategy
 to the general strategy.
 
** Copying from Local Directory to Target Remote Repository

 <<<wagon-maven-plugin>>>'s {{{http://www.mojohaus.org/wagon-maven-plugin/merge-maven-repos-mojo.html}<<<merge-maven-repos>>> goal}}
 provides a mechanism to copy from one remote repository to the other, while merging repository metadata.
 
 <<<wagon-maven-plugin>>>'s {{{http://www.mojohaus.org/wagon-maven-plugin/upload-mojo.html}<<<upload>>> goal}}
 will do the same without taking care of repository metadata: use it if you have an empty repository as target,
 like a staging repository provided by a repository manager.
 
 It can be invoked fully from command line (renaming <<<-Dwagon.>>> with <<<wagon.targetId>>> when
 {{{https://github.com/mojohaus/wagon-maven-plugin/pull/26}2.0.1 will be released}}):

+----+
mvn org.codehaus.mojo:wagon-maven-plugin:2.0.0:merge-maven-repos \
  -Dwagon.source=file:./target/staging-deploy \
  -Dwagon.target=https://... \
  -Dwagon.=id
+----+

 or more simply with <<<mvn wagon:merge-maven-repos>>> with configuration in <<<pom.xml>>>:

+----+
<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>wagon-maven-plugin</artifactId>
        <version>2.0.0</version>
        <configuration>
          <source>file:./target/staging-deploy</source>
          <target>https://...</target>
          <targetId>id</targetId>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
+----+
