github.com/mayra-cabrera/buffalo@v0.9.4-0.20170814145312-66d2e7772f11/grifts/release.go (about)

     1  package grifts
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"net/http"
     9  	"os"
    10  	"os/exec"
    11  	"path/filepath"
    12  	"regexp"
    13  	"strings"
    14  
    15  	"github.com/markbates/grift/grift"
    16  	"github.com/pkg/errors"
    17  )
    18  
    19  var _ = grift.Desc("release", "Generates a CHANGELOG and creates a new GitHub release based on what is in the version.go file.")
    20  var _ = grift.Add("release", func(c *grift.Context) error {
    21  	v, err := findVersion()
    22  	if err != nil {
    23  		return err
    24  	}
    25  
    26  	err = installBin()
    27  	if err != nil {
    28  		return err
    29  	}
    30  
    31  	err = localTest()
    32  	if err != nil {
    33  		return err
    34  	}
    35  
    36  	err = dockerTest()
    37  	if err != nil {
    38  		return err
    39  	}
    40  
    41  	grift.Run("shoulders", c)
    42  	grift.Run("deplist", c)
    43  
    44  	err = tagRelease(v)
    45  	if err != nil {
    46  		return err
    47  	}
    48  
    49  	err = runChangelogGenerator(v)
    50  	if err != nil {
    51  		return err
    52  	}
    53  
    54  	return commitAndPush(v)
    55  })
    56  
    57  func installBin() error {
    58  	cmd := exec.Command("go", "install", "-v", "./buffalo")
    59  	cmd.Stdin = os.Stdin
    60  	cmd.Stderr = os.Stderr
    61  	cmd.Stdout = os.Stdout
    62  	return cmd.Run()
    63  }
    64  
    65  func localTest() error {
    66  	cmd := exec.Command("go", "test", "-v", "-race", "./...")
    67  	cmd.Stdin = os.Stdin
    68  	cmd.Stderr = os.Stderr
    69  	cmd.Stdout = os.Stdout
    70  	return cmd.Run()
    71  }
    72  
    73  func dockerTest() error {
    74  	cmd := exec.Command("docker", "build", ".")
    75  	cmd.Stdin = os.Stdin
    76  	cmd.Stderr = os.Stderr
    77  	cmd.Stdout = os.Stdout
    78  	return cmd.Run()
    79  }
    80  
    81  func tagRelease(v string) error {
    82  	token := os.Getenv("GITHUB_TOKEN")
    83  	if token == "" {
    84  		return errors.New("GITHUB_TOKEN is not set")
    85  	}
    86  
    87  	body := map[string]interface{}{
    88  		"tag_name":   v,
    89  		"prerelease": false,
    90  	}
    91  
    92  	b, err := json.Marshal(&body)
    93  	if err != nil {
    94  		return err
    95  	}
    96  
    97  	res, err := http.Post(fmt.Sprintf("https://api.github.com/repos/gobuffalo/buffalo/releases?access_token=%s", token), "application/json", bytes.NewReader(b))
    98  	if err != nil {
    99  		return err
   100  	}
   101  
   102  	code := res.StatusCode
   103  	if code < 200 || code >= 300 {
   104  		return fmt.Errorf("got a not successful status code from github! %d", code)
   105  	}
   106  
   107  	return nil
   108  }
   109  
   110  func runChangelogGenerator(v string) error {
   111  	cmd := exec.Command("github_changelog_generator")
   112  	cmd.Stdin = os.Stdin
   113  	cmd.Stderr = os.Stderr
   114  	cmd.Stdout = os.Stdout
   115  	return cmd.Run()
   116  }
   117  
   118  func commitAndPush(v string) error {
   119  	cmd := exec.Command("git", "commit", "CHANGELOG.md", "-m", fmt.Sprintf("Updated changelog for release %s", v))
   120  	cmd.Stdin = os.Stdin
   121  	cmd.Stderr = os.Stderr
   122  	cmd.Stdout = os.Stdout
   123  	err := cmd.Run()
   124  	if err != nil {
   125  		return err
   126  	}
   127  
   128  	cmd = exec.Command("git", "push", "origin", "master")
   129  	cmd.Stdin = os.Stdin
   130  	cmd.Stderr = os.Stderr
   131  	cmd.Stdout = os.Stdout
   132  	return cmd.Run()
   133  }
   134  
   135  func findVersion() (string, error) {
   136  	pwd, err := os.Getwd()
   137  	if err != nil {
   138  		return "", err
   139  	}
   140  	vfile, err := ioutil.ReadFile(filepath.Join(pwd, "buffalo/cmd/version.go"))
   141  	if err != nil {
   142  		return "", err
   143  	}
   144  
   145  	//var Version = "v0.4.0"
   146  	re := regexp.MustCompile(`const Version = "(.+)"`)
   147  	matches := re.FindStringSubmatch(string(vfile))
   148  	if len(matches) < 2 {
   149  		return "", errors.New("failed to find the version")
   150  	}
   151  	v := matches[1]
   152  	if strings.Contains(v, "dev") {
   153  		return "", errors.Errorf("version can not be a dev version %s", v)
   154  	}
   155  	if !strings.HasPrefix(v, "v") {
   156  		return "", errors.Errorf("version must match format `v0.0.0`: %s", v)
   157  	}
   158  	return v, nil
   159  }