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 }