func Contracts(sous *core.Sous, args []string) { contractsFlags.Parse(args) args = contractsFlags.Args() timeout := *timeoutFlag targetName := "app" if len(args) != 0 { targetName = args[0] } core.RequireGit() core.RequireDocker() if *dockerImage != "" { cli.Fatalf("-image flag not yet implemented") } target, context := sous.AssembleTargetContext(targetName) sous.RunTarget(target, context) cli.Logf("=> Running Contracts") cli.Logf(`=> **TIP:** Open another terminal in this directory and type **sous logs -f**`) taskHost := core.DivineTaskHost() port0, err := ports.GetFreePort() if err != nil { cli.Fatalf("Unable to get free port: %s", err) } dr := docker.NewRun(context.DockerTag()) dr.AddEnv("PORT0", strconv.Itoa(port0)) dr.AddEnv("TASK_HOST", taskHost) dr.StdoutFile = context.FilePath("stdout") dr.StderrFile = context.FilePath("stderr") container, err := dr.Background().Start() if err != nil { cli.Fatalf("Unable to start container: %s", err) } cli.AddCleanupTask(func() error { return container.KillIfRunning() }) failed := 0 for _, c := range theContracts { cli.Logf(`===> CHECKING CONTRACT: "%s"`, c.Name) cli.Logf(`===> Description: %s`, c.Desc(dr)) if c.Tips != nil { cli.Logf("===> **TIPS for this contract:**") cli.LogBulletList(" -", c.Tips(dr)) } failed += within(timeout, func() bool { return c.Premise(dr) }) } if failed != 0 { cli.Fatalf("%d contracts failed.", failed) } cli.Success() }
func Push(sous *core.Sous, args []string) { target := "app" if len(args) != 0 { target = args[0] } core.RequireGit() core.RequireDocker() if err := git.AssertCleanWorkingTree(); err != nil { cli.Warn("Dirty working tree: %s", err) } _, context := sous.AssembleTargetContext(target) tag := context.DockerTag() if !docker.ImageExists(tag) { cli.Fatalf("No built image available; try building first") } docker.Push(tag) name := context.CanonicalPackageName() cli.Successf("Successfully pushed %s v%s as %s", name, context.BuildVersion, context.DockerTag()) }
func Run(sous *core.Sous, args []string) { targetName := "app" if len(args) != 0 { targetName = args[0] } core.RequireGit() core.RequireDocker() target, context := sous.AssembleTargetContext(targetName) runner, ok := target.(core.ContainerTarget) if !ok { cli.Fatalf("Target %s does not support running.", target.Name()) } rebuilt, _ := sous.RunTarget(target, context) dr, _ := sous.RunContainerTarget(runner, context, rebuilt) if exitCode := dr.ExitCode(); exitCode != 0 { cli.Logf("Docker container exited with code %d", exitCode) cli.Exit(exitCode) } cli.Success() }
func Build(sous *core.Sous, args []string) { targetName := "app" if len(args) != 0 { targetName = args[0] } core.RequireGit() core.RequireDocker() if err := git.AssertCleanWorkingTree(); err != nil { cli.Warn("Dirty working tree: %s", err) } target, context := sous.AssembleTargetContext(targetName) built, _ := sous.RunTarget(target, context) if !built { cli.Successf("Already built: %s", context.DockerTag()) } name := context.CanonicalPackageName() cli.Successf("Successfully built %s v%s as %s", name, context.BuildVersion, context.DockerTag()) }