github.com/jacobsoderblom/buffalo@v0.11.0/grifts/release.go (about)

     1  package grifts
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"os/exec"
     7  	"path/filepath"
     8  	"regexp"
     9  	"strings"
    10  
    11  	"github.com/markbates/grift/grift"
    12  	"github.com/pkg/errors"
    13  )
    14  
    15  var _ = grift.Desc("release", "Generates a CHANGELOG and creates a new GitHub release based on what is in the version.go file.")
    16  var _ = grift.Add("release", func(c *grift.Context) error {
    17  	v, err := findVersion()
    18  	if err != nil {
    19  		return err
    20  	}
    21  
    22  	err = installBin()
    23  	if err != nil {
    24  		return err
    25  	}
    26  
    27  	err = localTest()
    28  	if err != nil {
    29  		return err
    30  	}
    31  
    32  	err = dockerTest()
    33  	if err != nil {
    34  		return err
    35  	}
    36  
    37  	grift.Run("shoulders", c)
    38  
    39  	if err := push(); err != nil {
    40  		return errors.WithStack(err)
    41  	}
    42  
    43  	err = tagRelease(v)
    44  	if err != nil {
    45  		return err
    46  	}
    47  
    48  	return runReleaser(v)
    49  })
    50  
    51  func installBin() error {
    52  	cmd := exec.Command("go", "install", "-v", "./buffalo")
    53  	cmd.Stdin = os.Stdin
    54  	cmd.Stderr = os.Stderr
    55  	cmd.Stdout = os.Stdout
    56  	return cmd.Run()
    57  }
    58  
    59  func localTest() error {
    60  	cmd := exec.Command("go", "test", "-tags", "sqlite", "-v", "-race", "./...")
    61  	cmd.Stdin = os.Stdin
    62  	cmd.Stderr = os.Stderr
    63  	cmd.Stdout = os.Stdout
    64  	return cmd.Run()
    65  }
    66  
    67  func dockerTest() error {
    68  	cmd := exec.Command("docker", "build", ".")
    69  	cmd.Stdin = os.Stdin
    70  	cmd.Stderr = os.Stderr
    71  	cmd.Stdout = os.Stdout
    72  	return cmd.Run()
    73  }
    74  
    75  func tagRelease(v string) error {
    76  	cmd := exec.Command("git", "tag", v)
    77  	cmd.Stdin = os.Stdin
    78  	cmd.Stdout = os.Stdout
    79  	cmd.Stderr = os.Stderr
    80  	if err := cmd.Run(); err != nil {
    81  		return err
    82  	}
    83  
    84  	cmd = exec.Command("git", "push", "origin", "--tags")
    85  	cmd.Stdin = os.Stdin
    86  	cmd.Stdout = os.Stdout
    87  	cmd.Stderr = os.Stderr
    88  	return cmd.Run()
    89  }
    90  
    91  func runReleaser(v string) error {
    92  	cmd := exec.Command("goreleaser", "--rm-dist")
    93  	cmd.Stdin = os.Stdin
    94  	cmd.Stderr = os.Stderr
    95  	cmd.Stdout = os.Stdout
    96  	return cmd.Run()
    97  }
    98  
    99  func push() error {
   100  	cmd := exec.Command("git", "push", "origin", "master")
   101  	cmd.Stdin = os.Stdin
   102  	cmd.Stderr = os.Stderr
   103  	cmd.Stdout = os.Stdout
   104  	return cmd.Run()
   105  }
   106  
   107  func findVersion() (string, error) {
   108  	pwd, err := os.Getwd()
   109  	if err != nil {
   110  		return "", err
   111  	}
   112  	vfile, err := ioutil.ReadFile(filepath.Join(pwd, "buffalo/cmd/version.go"))
   113  	if err != nil {
   114  		return "", err
   115  	}
   116  
   117  	//var Version = "v0.4.0"
   118  	re := regexp.MustCompile(`const Version = "(.+)"`)
   119  	matches := re.FindStringSubmatch(string(vfile))
   120  	if len(matches) < 2 {
   121  		return "", errors.New("failed to find the version")
   122  	}
   123  	v := matches[1]
   124  	if strings.Contains(v, "dev") {
   125  		return "", errors.Errorf("version can not be a dev version %s", v)
   126  	}
   127  	if !strings.HasPrefix(v, "v") {
   128  		return "", errors.Errorf("version must match format `v0.0.0`: %s", v)
   129  	}
   130  	return v, nil
   131  }