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 }