github.com/jenkins-x/jx/v2@v2.1.155/pkg/maven/cli.go (about)

     1  package maven
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  	"strings"
     9  
    10  	filemutex "github.com/alexflint/go-filemutex"
    11  	"github.com/jenkins-x/jx-logging/pkg/log"
    12  	"github.com/jenkins-x/jx/v2/pkg/packages"
    13  	"github.com/jenkins-x/jx/v2/pkg/util"
    14  )
    15  
    16  // InstallMavenIfRequired installs maven if not available
    17  func InstallMavenIfRequired() error {
    18  	homeDir, err := util.ConfigDir()
    19  	if err != nil {
    20  		return err
    21  	}
    22  	m, err := filemutex.New(homeDir + "/jx.lock")
    23  	if err != nil {
    24  		panic(err)
    25  	}
    26  	err = m.Lock()
    27  	if err != nil {
    28  		return err
    29  	}
    30  
    31  	cmd := util.Command{
    32  		Name: "mvn",
    33  		Args: []string{"-v"},
    34  	}
    35  	_, err = cmd.RunWithoutRetry()
    36  	if err == nil {
    37  		err = m.Unlock()
    38  		if err != nil {
    39  			return err
    40  		}
    41  		return nil
    42  	}
    43  	// lets assume maven is not installed so lets download it
    44  	clientURL := fmt.Sprintf("https://repo1.maven.org/maven2/org/apache/maven/apache-maven/%s/apache-maven-%s-bin.zip", MavenVersion, MavenVersion)
    45  
    46  	log.Logger().Infof("Apache Maven is not installed so lets download: %s", util.ColorInfo(clientURL))
    47  
    48  	mvnDir := filepath.Join(homeDir, "maven")
    49  	mvnTmpDir := filepath.Join(homeDir, "maven-tmp")
    50  	zipFile := filepath.Join(homeDir, "mvn.zip")
    51  
    52  	err = os.MkdirAll(mvnDir, util.DefaultWritePermissions)
    53  	if err != nil {
    54  		err = m.Unlock()
    55  		if err != nil {
    56  			return err
    57  		}
    58  		return err
    59  	}
    60  
    61  	log.Logger().Info("\ndownloadFile")
    62  	err = packages.DownloadFile(clientURL, zipFile)
    63  	if err != nil {
    64  		err = m.Unlock()
    65  		if err != nil {
    66  			return err
    67  		}
    68  		return err
    69  	}
    70  
    71  	log.Logger().Info("\nutil.Unzip")
    72  	err = util.Unzip(zipFile, mvnTmpDir)
    73  	if err != nil {
    74  		err = m.Unlock()
    75  		if err != nil {
    76  			return err
    77  		}
    78  		return err
    79  	}
    80  
    81  	// lets find a directory inside the unzipped folder
    82  	log.Logger().Info("\nReadDir")
    83  	files, err := ioutil.ReadDir(mvnTmpDir)
    84  	if err != nil {
    85  		err = m.Unlock()
    86  		if err != nil {
    87  			return err
    88  		}
    89  		return err
    90  	}
    91  	for _, f := range files {
    92  		name := f.Name()
    93  		if f.IsDir() && strings.HasPrefix(name, "apache-maven") {
    94  			err = os.RemoveAll(mvnDir)
    95  			if err != nil {
    96  				return err
    97  			}
    98  
    99  			err = os.Rename(filepath.Join(mvnTmpDir, name), mvnDir)
   100  			if err != nil {
   101  				err = m.Unlock()
   102  				if err != nil {
   103  					return err
   104  				}
   105  				return err
   106  			}
   107  			log.Logger().Infof("Apache Maven is installed at: %s", util.ColorInfo(mvnDir))
   108  			err = m.Unlock()
   109  			if err != nil {
   110  				return err
   111  			}
   112  			err = os.Remove(zipFile)
   113  			if err != nil {
   114  				err = m.Unlock()
   115  				if err != nil {
   116  					return err
   117  				}
   118  				return err
   119  			}
   120  			err = os.RemoveAll(mvnTmpDir)
   121  			if err != nil {
   122  				err = m.Unlock()
   123  				if err != nil {
   124  					return err
   125  				}
   126  				return err
   127  			}
   128  			err = m.Unlock()
   129  			if err != nil {
   130  				return err
   131  			}
   132  			return nil
   133  		}
   134  	}
   135  	err = m.Unlock()
   136  	if err != nil {
   137  		return err
   138  	}
   139  	return fmt.Errorf("Could not find an apache-maven folder inside the unzipped maven distro at %s", mvnTmpDir)
   140  }