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 }