github.com/rotblauer/buffalo@v0.7.1-0.20170112214545-7aa55ef80dd3/grifts/release.go (about)

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