mirror of https://github.com/grafana/grafana
parent
68e6700663
commit
7864828e75
@ -0,0 +1,150 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"bytes" |
||||
"encoding/json" |
||||
"flag" |
||||
"fmt" |
||||
"io/ioutil" |
||||
"log" |
||||
"net/http" |
||||
"os" |
||||
"path/filepath" |
||||
"regexp" |
||||
"strings" |
||||
"time" |
||||
) |
||||
|
||||
var apiUrl = flag.String("apiUrl", "https://grafana.com/api", "api url") |
||||
var apiKey = flag.String("apiKey", "", "api key") |
||||
var version = "" |
||||
var versionRe = regexp.MustCompile(`grafana-(.*)\.(linux|windows)`) |
||||
var builds = []build{} |
||||
|
||||
func main() { |
||||
flag.Parse() |
||||
if *apiKey == "" { |
||||
log.Fatalf("Require apiKey command line parameters") |
||||
} |
||||
|
||||
err := filepath.Walk("dist", packageWalker) |
||||
if err != nil { |
||||
log.Fatalf("Cannot find any packages to publish, %v", err) |
||||
} |
||||
|
||||
if version == "" { |
||||
log.Fatalf("No version found") |
||||
} |
||||
|
||||
if len(builds) == 0 { |
||||
log.Fatalf("No builds found") |
||||
} |
||||
|
||||
nightly := release{ |
||||
Version: version, |
||||
ReleaseDate: time.Now(), |
||||
Stable: false, |
||||
Nightly: true, |
||||
Beta: false, |
||||
WhatsNewUrl: "", |
||||
ReleaseNotesUrl: "", |
||||
Builds: builds, |
||||
} |
||||
|
||||
postRequest("/grafana/versions", nightly, fmt.Sprintf("Create Release %s", nightly.Version)) |
||||
postRequest("/grafana/versions/"+nightly.Version, nightly, fmt.Sprintf("Update Release %s", nightly.Version)) |
||||
|
||||
for _, b := range nightly.Builds { |
||||
postRequest(fmt.Sprintf("/grafana/versions/%s/packages", nightly.Version), b, fmt.Sprintf("Create Build %s %s", b.Os, b.Arch)) |
||||
postRequest(fmt.Sprintf("/grafana/versions/%s/packages/%s/%s", nightly.Version, b.Arch, b.Os), b, fmt.Sprintf("Update Build %s %s", b.Os, b.Arch)) |
||||
} |
||||
} |
||||
|
||||
func packageWalker(path string, f os.FileInfo, err error) error { |
||||
if f.Name() == "dist" || strings.Contains(f.Name(), "sha256") { |
||||
return nil |
||||
} |
||||
|
||||
log.Printf("Finding package file %s", f.Name()) |
||||
result := versionRe.FindSubmatch([]byte(f.Name())) |
||||
|
||||
if len(result) > 0 { |
||||
version = string(result[1]) |
||||
log.Printf("Version detected: %v", version) |
||||
} |
||||
|
||||
shaBytes, err := ioutil.ReadFile(path + ".sha256") |
||||
if err != nil { |
||||
log.Fatalf("Failed to read sha256 file", err) |
||||
} |
||||
|
||||
os := "" |
||||
if strings.Contains(f.Name(), "linux-x64.tar.gz") { |
||||
os = "linux" |
||||
} |
||||
if strings.HasSuffix(f.Name(), "windows-x64.zip") { |
||||
os = "win" |
||||
} |
||||
if strings.HasSuffix(f.Name(), ".rpm") { |
||||
os = "rhel" |
||||
} |
||||
if strings.HasSuffix(f.Name(), ".deb") { |
||||
os = "deb" |
||||
} |
||||
|
||||
builds = append(builds, build{ |
||||
Os: os, |
||||
Arch: "amd64", |
||||
Url: "https://s3-us-west-2.amazonaws.com/grafana-releases/master/" + f.Name(), |
||||
Sha256: string(shaBytes), |
||||
}) |
||||
|
||||
return nil |
||||
} |
||||
|
||||
func postRequest(url string, obj interface{}, desc string) { |
||||
jsonBytes, _ := json.Marshal(obj) |
||||
req, _ := http.NewRequest(http.MethodPost, (*apiUrl)+url, bytes.NewReader(jsonBytes)) |
||||
req.Header.Add("Authorization", "Bearer "+(*apiKey)) |
||||
req.Header.Add("Content-Type", "application/json") |
||||
|
||||
res, err := http.DefaultClient.Do(req) |
||||
if err != nil { |
||||
log.Fatalf("error: %v", err) |
||||
} |
||||
|
||||
if res.StatusCode == http.StatusOK { |
||||
log.Printf("Action: %s \t OK", desc) |
||||
} else { |
||||
|
||||
if res.Body != nil { |
||||
defer res.Body.Close() |
||||
body, _ := ioutil.ReadAll(res.Body) |
||||
if strings.Contains(string(body), "already exists") || strings.Contains(string(body), "Nothing to update") { |
||||
log.Printf("Action: %s \t Already exists", desc) |
||||
} else { |
||||
log.Printf("Action: %s \t Failed - Status: %v", desc, res.Status) |
||||
log.Printf("Resp: %s", body) |
||||
log.Fatalf("Quiting") |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
type release struct { |
||||
Version string `json:"version"` |
||||
ReleaseDate time.Time `json:"releaseDate"` |
||||
Stable bool `json:"stable"` |
||||
Beta bool `json:"beta"` |
||||
Nightly bool `json:"nightly"` |
||||
WhatsNewUrl string `json:"whatsNewUrl"` |
||||
ReleaseNotesUrl string `json:"releaseNotesUrl"` |
||||
Builds []build `json:"-"` |
||||
} |
||||
|
||||
type build struct { |
||||
Os string `json:"os"` |
||||
Url string `json:"url"` |
||||
Sha256 string `json:"sha256"` |
||||
Arch string `json:"arch"` |
||||
} |
Loading…
Reference in new issue