func runPush(cmd *cobra.Command, args []string) { switch len(args) { case 0: CommandError(cmd, "Too few arguments\n") case 1: err := docker.Push(log, args[0], pushDockerRegistry, pushDockerNamespace) if err != nil { Quitf("%s\n", err) } default: CommandError(cmd, "Too many arguments\n") } }
func Release(log *log.Logger, flags *Flags) error { // Detect environment hasMakefile := false isDev := flags.ReleaseType == "dev" if _, err := os.Stat(makefileFile); err == nil { hasMakefile = true log.Info("Found %s", makefileFile) } hasGruntfile := false if _, err := os.Stat(gruntfileFile); err == nil { hasGruntfile = true log.Info("Found %s", gruntfileFile) } hasDockerfile := false if _, err := os.Stat(dockerfileFile); err == nil { hasDockerfile = true log.Info("Found %s", dockerfileFile) } // Read the current version and name info, err := GetProjectInfo() if err != nil { return maskAny(err) } log.Info("Found old version %s", info.Version) version, err := semver.NewVersion(info.Version) if err != nil { return maskAny(err) } // Check repository state if !isDev { if err := checkRepoClean(log, info.GitBranch); err != nil { return maskAny(err) } } // Bump version switch flags.ReleaseType { case "major": version.Major++ version.Minor = 0 version.Patch = 0 case "minor": version.Minor++ version.Patch = 0 case "patch": version.Patch++ case "dev": // Do not change version default: return errgo.Newf("Unknown release type %s", flags.ReleaseType) } version.Metadata = "" // Write new release version if !isDev { if err := writeVersion(log, version.String(), info.Manifests, info.GradleConfigFile, false); err != nil { return maskAny(err) } } // Build project if hasGruntfile && !info.NoGrunt { if _, err := os.Stat(nodeModulesFolder); os.IsNotExist(err) { log.Info("Folder %s not found", nodeModulesFolder) if err := util.ExecPrintError(log, "npm", "install"); err != nil { return maskAny(err) } } if err := util.ExecPrintError(log, "grunt", "build-release"); err != nil { return maskAny(err) } } if hasMakefile { // Clean first if !isDev { if err := util.ExecPrintError(log, "make", info.Targets.CleanTarget); err != nil { return maskAny(err) } } // Now build makeArgs := []string{} if info.Targets.ReleaseTarget != "" { makeArgs = append(makeArgs, info.Targets.ReleaseTarget) } if err := util.ExecPrintError(log, "make", makeArgs...); err != nil { return maskAny(err) } } if hasDockerfile { // Build docker images tagVersion := version.String() if isDev { tagVersion = strings.Replace(time.Now().Format("2006-01-02-15-04-05"), "-", "", -1) } imageAndVersion := fmt.Sprintf("%s:%s", info.Image, tagVersion) imageAndMajorVersion := fmt.Sprintf("%s:%d", info.Image, version.Major) imageAndMinorVersion := fmt.Sprintf("%s:%d.%d", info.Image, version.Major, version.Minor) imageAndLatest := fmt.Sprintf("%s:latest", info.Image) buildTag := path.Join(info.Namespace, imageAndVersion) buildLatestTag := path.Join(info.Namespace, imageAndLatest) buildMajorVersionTag := path.Join(info.Namespace, imageAndMajorVersion) buildMinorVersionTag := path.Join(info.Namespace, imageAndMinorVersion) if err := util.ExecPrintError(log, "docker", "build", "--tag", buildTag, "."); err != nil { return maskAny(err) } if info.TagLatest { util.ExecSilent(log, "docker", "rmi", buildLatestTag) if err := util.ExecPrintError(log, "docker", "tag", buildTag, buildLatestTag); err != nil { return maskAny(err) } } if info.TagMajorVersion && !isDev { util.ExecSilent(log, "docker", "rmi", buildMajorVersionTag) if err := util.ExecPrintError(log, "docker", "tag", buildTag, buildMajorVersionTag); err != nil { return maskAny(err) } } if info.TagMinorVersion && !isDev { util.ExecSilent(log, "docker", "rmi", buildMinorVersionTag) if err := util.ExecPrintError(log, "docker", "tag", buildTag, buildMinorVersionTag); err != nil { return maskAny(err) } } registry := flags.DockerRegistry if info.Registry != "" { registry = info.Registry } namespace := info.Namespace if registry != "" || namespace != "" { // Push image to registry if err := docker.Push(log, imageAndVersion, registry, namespace); err != nil { return maskAny(err) } if info.TagLatest { // Push latest image to registry if err := docker.Push(log, imageAndLatest, registry, namespace); err != nil { return maskAny(err) } } if info.TagMajorVersion && !isDev { // Push major version image to registry if err := docker.Push(log, imageAndMajorVersion, registry, namespace); err != nil { return maskAny(err) } } if info.TagMinorVersion && !isDev { // Push minor version image to registry if err := docker.Push(log, imageAndMinorVersion, registry, namespace); err != nil { return maskAny(err) } } } } // Build succeeded, re-write new release version and commit if !isDev { if err := writeVersion(log, version.String(), info.Manifests, info.GradleConfigFile, true); err != nil { return maskAny(err) } // Tag version if err := git.Tag(log, version.String()); err != nil { return maskAny(err) } // Create github release (if needed) if err := createGithubRelease(log, version.String(), *info); err != nil { return maskAny(err) } // Update version to "+git" working version version.Metadata = "git" // Write new release version if err := writeVersion(log, version.String(), info.Manifests, info.GradleConfigFile, true); err != nil { return maskAny(err) } // Push changes if err := git.Push(log, "origin", false); err != nil { return maskAny(err) } // Push tags if err := git.Push(log, "origin", true); err != nil { return maskAny(err) } } return nil }