github.com/thetechnoweenie/graven@v1.0.2/commands/pkg.go (about)

     1  package commands
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"sync"
     7  
     8  	"github.com/cbegin/graven/domain"
     9  	"github.com/cbegin/graven/util"
    10  	"github.com/hashicorp/go-multierror"
    11  	"github.com/urfave/cli"
    12  	"path"
    13  	"path/filepath"
    14  )
    15  
    16  var PackageCommand = cli.Command{
    17  	Name:   "package",
    18  	Usage:  "Produces packaged archive for deployment",
    19  	Action: pkg,
    20  }
    21  
    22  func pkg(c *cli.Context) error {
    23  	if err := build(c); err != nil {
    24  		return err
    25  	}
    26  
    27  	project, err := domain.FindProject()
    28  	if err != nil {
    29  		return err
    30  	}
    31  
    32  	var merr error
    33  	mutex := sync.Mutex{}
    34  	wg := sync.WaitGroup{}
    35  	for _, artifact := range project.Artifacts {
    36  		a := artifact
    37  		wg.Add(1)
    38  		go func() {
    39  			defer wg.Done()
    40  			err := packageArtifact(project, &a)
    41  			if err != nil {
    42  				mutex.Lock()
    43  				merr = multierror.Append(merr, err)
    44  				mutex.Unlock()
    45  			}
    46  		}()
    47  	}
    48  	wg.Wait()
    49  
    50  	for _, repo := range project.Repositories {
    51  		if repo.Type == "docker" && repo.HasRole("release") {
    52  			dockerPath := path.Join(repo.URL, repo.Group, repo.Artifact)
    53  			dockerTag := fmt.Sprintf("%v:%v", dockerPath, project.Version)
    54  			dockerDir := filepath.Dir(project.ProjectPath(repo.File))
    55  			fmt.Printf("Building docker image %v\n", dockerTag)
    56  			if sout, serr, err := util.RunCommand(project.ProjectPath(), nil, "docker", "build", "-f", repo.File, "-t", dockerTag, dockerDir); err != nil {
    57  				fmt.Printf("%v\n%v\n", sout, serr)
    58  				merr = multierror.Append(merr, err)
    59  			}
    60  		}
    61  	}
    62  
    63  	return merr
    64  }
    65  
    66  func packageArtifact(project *domain.Project, artifact *domain.Artifact) error {
    67  	targetFile := artifact.ArtifactFile(project)
    68  	source := project.TargetPath(artifact.Classifier)
    69  	dest := project.TargetPath(targetFile)
    70  	temp := fmt.Sprintf("%s.tmp", dest)
    71  	fmt.Printf("Packaging %v\n", targetFile)
    72  	defer fmt.Printf("Done %v\n", targetFile)
    73  	switch artifact.Archive {
    74  	case "zip":
    75  		err := util.ZipDir(source, dest, true)
    76  		if err != nil {
    77  			return err
    78  		}
    79  	case "tgz":
    80  		fallthrough
    81  	case "tar.gz":
    82  		err := util.TarDir(source, dest)
    83  		if err != nil {
    84  			return err
    85  		}
    86  		err = util.GzipFile(dest, temp)
    87  		if err != nil {
    88  			return err
    89  		}
    90  		os.Remove(dest)
    91  		os.Rename(temp, dest)
    92  	}
    93  	return nil
    94  }