2015-01-05 03:46:58 -06:00
|
|
|
// +build ignore
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"crypto/md5"
|
2017-02-23 13:48:31 -06:00
|
|
|
"crypto/sha256"
|
2015-03-04 09:23:21 -06:00
|
|
|
"encoding/json"
|
2015-01-05 03:46:58 -06:00
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
2015-03-02 05:56:40 -06:00
|
|
|
"io/ioutil"
|
2015-01-05 03:46:58 -06:00
|
|
|
"log"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
2017-03-21 04:35:18 -05:00
|
|
|
"path"
|
2015-01-05 03:46:58 -06:00
|
|
|
"path/filepath"
|
|
|
|
"runtime"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2018-09-22 03:50:00 -05:00
|
|
|
const (
|
|
|
|
windows = "windows"
|
|
|
|
linux = "linux"
|
|
|
|
)
|
|
|
|
|
2015-01-05 03:46:58 -06:00
|
|
|
var (
|
2018-04-24 11:42:27 -05:00
|
|
|
//versionRe = regexp.MustCompile(`-[0-9]{1,3}-g[0-9a-f]{5,10}`)
|
|
|
|
goarch string
|
|
|
|
goos string
|
|
|
|
gocc string
|
2018-05-08 02:42:20 -05:00
|
|
|
cgo bool
|
2018-04-24 11:42:27 -05:00
|
|
|
pkgArch string
|
|
|
|
version string = "v1"
|
2015-04-21 11:46:44 -05:00
|
|
|
// deb & rpm does not support semver so have to handle their version a little differently
|
|
|
|
linuxPackageVersion string = "v1"
|
|
|
|
linuxPackageIteration string = ""
|
|
|
|
race bool
|
2016-09-18 05:07:12 -05:00
|
|
|
phjsToRelease string
|
2015-04-21 11:46:44 -05:00
|
|
|
workingDir string
|
2018-11-05 08:05:12 -06:00
|
|
|
includeBuildId bool = true
|
|
|
|
buildId string = "0"
|
2016-02-15 08:22:03 -06:00
|
|
|
binaries []string = []string{"grafana-server", "grafana-cli"}
|
2018-04-18 04:24:29 -05:00
|
|
|
isDev bool = false
|
2018-04-27 06:41:58 -05:00
|
|
|
enterprise bool = false
|
2019-01-18 04:36:04 -06:00
|
|
|
skipRpmGen bool = false
|
|
|
|
skipDebGen bool = false
|
2019-03-22 10:12:42 -05:00
|
|
|
printGenVersion bool = false
|
2015-01-05 03:46:58 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
log.SetOutput(os.Stdout)
|
|
|
|
log.SetFlags(0)
|
|
|
|
|
2015-03-02 05:56:40 -06:00
|
|
|
ensureGoPath()
|
2015-01-05 03:46:58 -06:00
|
|
|
|
2018-11-05 08:05:12 -06:00
|
|
|
var buildIdRaw string
|
|
|
|
|
2015-01-05 03:46:58 -06:00
|
|
|
flag.StringVar(&goarch, "goarch", runtime.GOARCH, "GOARCH")
|
|
|
|
flag.StringVar(&goos, "goos", runtime.GOOS, "GOOS")
|
2016-09-18 05:07:12 -05:00
|
|
|
flag.StringVar(&gocc, "cc", "", "CC")
|
2018-05-08 02:42:20 -05:00
|
|
|
flag.BoolVar(&cgo, "cgo-enabled", cgo, "Enable cgo")
|
2016-09-18 05:07:12 -05:00
|
|
|
flag.StringVar(&pkgArch, "pkg-arch", "", "PKG ARCH")
|
|
|
|
flag.StringVar(&phjsToRelease, "phjs", "", "PhantomJS binary")
|
2015-01-05 03:46:58 -06:00
|
|
|
flag.BoolVar(&race, "race", race, "Use race detector")
|
2018-11-05 08:05:12 -06:00
|
|
|
flag.BoolVar(&includeBuildId, "includeBuildId", includeBuildId, "IncludeBuildId in package name")
|
2018-04-27 06:41:58 -05:00
|
|
|
flag.BoolVar(&enterprise, "enterprise", enterprise, "Build enterprise version of Grafana")
|
2018-11-05 08:05:12 -06:00
|
|
|
flag.StringVar(&buildIdRaw, "buildId", "0", "Build ID from CI system")
|
2018-04-18 04:24:29 -05:00
|
|
|
flag.BoolVar(&isDev, "dev", isDev, "optimal for development, skips certain steps")
|
2019-01-18 04:36:04 -06:00
|
|
|
flag.BoolVar(&skipRpmGen, "skipRpm", skipRpmGen, "skip rpm package generation (default: false)")
|
|
|
|
flag.BoolVar(&skipDebGen, "skipDeb", skipDebGen, "skip deb package generation (default: false)")
|
2019-03-22 10:12:42 -05:00
|
|
|
flag.BoolVar(&printGenVersion, "gen-version", printGenVersion, "generate Grafana version and output (default: false)")
|
2015-01-05 03:46:58 -06:00
|
|
|
flag.Parse()
|
|
|
|
|
2018-11-05 08:05:12 -06:00
|
|
|
buildId = shortenBuildId(buildIdRaw)
|
|
|
|
|
2017-01-30 08:21:39 -06:00
|
|
|
readVersionFromPackageJson()
|
|
|
|
|
2018-08-21 02:33:48 -05:00
|
|
|
if pkgArch == "" {
|
|
|
|
pkgArch = goarch
|
|
|
|
}
|
|
|
|
|
2019-03-22 10:12:42 -05:00
|
|
|
if printGenVersion {
|
|
|
|
printGeneratedVersion()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-01-30 08:21:39 -06:00
|
|
|
log.Printf("Version: %s, Linux Version: %s, Package Iteration: %s\n", version, linuxPackageVersion, linuxPackageIteration)
|
|
|
|
|
2015-01-05 03:46:58 -06:00
|
|
|
if flag.NArg() == 0 {
|
|
|
|
log.Println("Usage: go run build.go build")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2015-01-28 06:10:09 -06:00
|
|
|
workingDir, _ = os.Getwd()
|
|
|
|
|
2015-01-05 03:46:58 -06:00
|
|
|
for _, cmd := range flag.Args() {
|
|
|
|
switch cmd {
|
|
|
|
case "setup":
|
|
|
|
setup()
|
|
|
|
|
2017-12-02 04:22:51 -06:00
|
|
|
case "build-srv":
|
|
|
|
clean()
|
|
|
|
build("grafana-server", "./pkg/cmd/grafana-server", []string{})
|
|
|
|
|
2017-01-25 07:42:19 -06:00
|
|
|
case "build-cli":
|
|
|
|
clean()
|
|
|
|
build("grafana-cli", "./pkg/cmd/grafana-cli", []string{})
|
2016-12-09 08:25:02 -06:00
|
|
|
|
2018-03-06 16:59:45 -06:00
|
|
|
case "build-server":
|
|
|
|
clean()
|
|
|
|
build("grafana-server", "./pkg/cmd/grafana-server", []string{})
|
|
|
|
|
2015-01-05 03:46:58 -06:00
|
|
|
case "build":
|
2018-05-08 02:42:20 -05:00
|
|
|
//clean()
|
2016-02-15 08:22:03 -06:00
|
|
|
for _, binary := range binaries {
|
|
|
|
build(binary, "./pkg/cmd/"+binary, []string{})
|
|
|
|
}
|
2015-01-05 03:46:58 -06:00
|
|
|
|
2018-05-08 02:42:20 -05:00
|
|
|
case "build-frontend":
|
|
|
|
grunt(gruntBuildArg("build")...)
|
|
|
|
|
2015-01-05 03:46:58 -06:00
|
|
|
case "test":
|
2015-01-28 06:10:09 -06:00
|
|
|
test("./pkg/...")
|
2015-03-04 07:48:21 -06:00
|
|
|
grunt("test")
|
2015-01-28 06:10:09 -06:00
|
|
|
|
|
|
|
case "package":
|
2018-05-08 02:42:20 -05:00
|
|
|
grunt(gruntBuildArg("build")...)
|
2018-08-21 02:33:48 -05:00
|
|
|
grunt(gruntBuildArg("package")...)
|
2018-09-22 03:50:00 -05:00
|
|
|
if goos == linux {
|
2018-08-21 02:33:48 -05:00
|
|
|
createLinuxPackages()
|
|
|
|
}
|
2018-05-08 02:42:20 -05:00
|
|
|
|
|
|
|
case "package-only":
|
2018-08-21 02:33:48 -05:00
|
|
|
grunt(gruntBuildArg("package")...)
|
2018-09-22 03:50:00 -05:00
|
|
|
if goos == linux {
|
2018-08-21 02:33:48 -05:00
|
|
|
createLinuxPackages()
|
|
|
|
}
|
2018-11-15 07:42:09 -06:00
|
|
|
case "pkg-archive":
|
|
|
|
grunt(gruntBuildArg("package")...)
|
2018-08-21 02:33:48 -05:00
|
|
|
|
2015-12-04 15:36:38 -06:00
|
|
|
case "pkg-rpm":
|
2016-09-18 05:07:12 -05:00
|
|
|
grunt(gruntBuildArg("release")...)
|
2015-12-04 15:36:38 -06:00
|
|
|
createRpmPackages()
|
2015-12-04 15:55:23 -06:00
|
|
|
|
2015-12-04 15:36:38 -06:00
|
|
|
case "pkg-deb":
|
2016-09-18 05:07:12 -05:00
|
|
|
grunt(gruntBuildArg("release")...)
|
2015-12-04 15:36:38 -06:00
|
|
|
createDebPackages()
|
|
|
|
|
2017-02-23 13:48:31 -06:00
|
|
|
case "sha-dist":
|
|
|
|
shaFilesInDist()
|
2016-10-18 03:54:17 -05:00
|
|
|
|
2015-03-04 09:23:21 -06:00
|
|
|
case "latest":
|
|
|
|
makeLatestDistCopies()
|
|
|
|
|
2015-01-05 03:46:58 -06:00
|
|
|
case "clean":
|
2015-03-02 11:26:43 -06:00
|
|
|
clean()
|
2015-01-05 03:46:58 -06:00
|
|
|
|
|
|
|
default:
|
|
|
|
log.Fatalf("Unknown command %q", cmd)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-04 09:23:21 -06:00
|
|
|
func makeLatestDistCopies() {
|
2017-02-28 02:09:49 -06:00
|
|
|
files, err := ioutil.ReadDir("dist")
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("failed to create latest copies. Cannot read from /dist")
|
|
|
|
}
|
|
|
|
|
2017-03-21 04:35:18 -05:00
|
|
|
latestMapping := map[string]string{
|
2018-05-28 03:39:42 -05:00
|
|
|
"_amd64.deb": "dist/grafana_latest_amd64.deb",
|
|
|
|
".x86_64.rpm": "dist/grafana-latest-1.x86_64.rpm",
|
2018-05-08 02:42:20 -05:00
|
|
|
".linux-amd64.tar.gz": "dist/grafana-latest.linux-x64.tar.gz",
|
2018-12-20 15:48:53 -06:00
|
|
|
".linux-armv7.tar.gz": "dist/grafana-latest.linux-armv7.tar.gz",
|
2019-01-11 08:55:22 -06:00
|
|
|
".linux-armv6.tar.gz": "dist/grafana-latest.linux-armv6.tar.gz",
|
2018-12-20 15:48:53 -06:00
|
|
|
".linux-arm64.tar.gz": "dist/grafana-latest.linux-arm64.tar.gz",
|
2015-10-16 11:26:30 -05:00
|
|
|
}
|
|
|
|
|
2017-02-28 02:09:49 -06:00
|
|
|
for _, file := range files {
|
|
|
|
for extension, fullName := range latestMapping {
|
|
|
|
if strings.HasSuffix(file.Name(), extension) {
|
|
|
|
runError("cp", path.Join("dist", file.Name()), fullName)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-03-04 09:23:21 -06:00
|
|
|
}
|
|
|
|
|
2015-03-02 10:21:52 -06:00
|
|
|
func readVersionFromPackageJson() {
|
2015-03-04 09:23:21 -06:00
|
|
|
reader, err := os.Open("package.json")
|
2015-03-02 10:21:52 -06:00
|
|
|
if err != nil {
|
2015-03-04 09:23:21 -06:00
|
|
|
log.Fatal("Failed to open package.json")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
defer reader.Close()
|
|
|
|
|
|
|
|
jsonObj := map[string]interface{}{}
|
|
|
|
jsonParser := json.NewDecoder(reader)
|
|
|
|
|
|
|
|
if err := jsonParser.Decode(&jsonObj); err != nil {
|
|
|
|
log.Fatal("Failed to decode package.json")
|
2015-03-02 10:21:52 -06:00
|
|
|
}
|
2015-03-04 09:23:21 -06:00
|
|
|
|
|
|
|
version = jsonObj["version"].(string)
|
2015-04-21 11:46:44 -05:00
|
|
|
linuxPackageVersion = version
|
|
|
|
linuxPackageIteration = ""
|
|
|
|
|
|
|
|
// handle pre version stuff (deb / rpm does not support semver)
|
2015-04-22 01:56:14 -05:00
|
|
|
parts := strings.Split(version, "-")
|
2015-04-21 11:46:44 -05:00
|
|
|
|
2015-04-22 01:56:14 -05:00
|
|
|
if len(parts) > 1 {
|
|
|
|
linuxPackageVersion = parts[0]
|
|
|
|
linuxPackageIteration = parts[1]
|
2015-04-21 11:46:44 -05:00
|
|
|
}
|
2016-05-11 06:20:01 -05:00
|
|
|
|
|
|
|
// add timestamp to iteration
|
2018-11-05 08:05:12 -06:00
|
|
|
if includeBuildId {
|
|
|
|
if buildId != "0" {
|
|
|
|
linuxPackageIteration = fmt.Sprintf("%s%s", buildId, linuxPackageIteration)
|
2017-02-02 08:55:37 -06:00
|
|
|
} else {
|
|
|
|
linuxPackageIteration = fmt.Sprintf("%d%s", time.Now().Unix(), linuxPackageIteration)
|
|
|
|
}
|
2017-01-30 08:21:39 -06:00
|
|
|
}
|
2015-03-02 10:21:52 -06:00
|
|
|
}
|
|
|
|
|
2015-04-10 09:20:01 -05:00
|
|
|
type linuxPackageOptions struct {
|
|
|
|
packageType string
|
2019-03-22 10:12:42 -05:00
|
|
|
packageArch string
|
2015-04-10 09:20:01 -05:00
|
|
|
homeDir string
|
2016-02-15 08:22:03 -06:00
|
|
|
binPath string
|
2016-02-15 07:58:16 -06:00
|
|
|
serverBinPath string
|
|
|
|
cliBinPath string
|
2015-04-10 09:20:01 -05:00
|
|
|
configDir string
|
2015-07-15 03:08:23 -05:00
|
|
|
ldapFilePath string
|
2015-04-10 09:20:01 -05:00
|
|
|
etcDefaultPath string
|
|
|
|
etcDefaultFilePath string
|
|
|
|
initdScriptFilePath string
|
|
|
|
systemdServiceFilePath string
|
|
|
|
|
|
|
|
postinstSrc string
|
|
|
|
initdScriptSrc string
|
|
|
|
defaultFileSrc string
|
|
|
|
systemdFileSrc string
|
|
|
|
|
|
|
|
depends []string
|
|
|
|
}
|
2015-04-08 09:58:05 -05:00
|
|
|
|
2015-12-04 15:36:38 -06:00
|
|
|
func createDebPackages() {
|
2019-03-22 10:12:42 -05:00
|
|
|
debPkgArch := pkgArch
|
|
|
|
if pkgArch == "armv7" || pkgArch == "armv6" {
|
|
|
|
debPkgArch = "armhf"
|
2018-05-28 03:39:42 -05:00
|
|
|
}
|
2019-03-22 10:12:42 -05:00
|
|
|
|
2015-04-10 09:20:01 -05:00
|
|
|
createPackage(linuxPackageOptions{
|
|
|
|
packageType: "deb",
|
2019-03-22 10:12:42 -05:00
|
|
|
packageArch: debPkgArch,
|
2015-04-10 09:20:01 -05:00
|
|
|
homeDir: "/usr/share/grafana",
|
2016-02-15 08:22:03 -06:00
|
|
|
binPath: "/usr/sbin",
|
2015-04-10 09:20:01 -05:00
|
|
|
configDir: "/etc/grafana",
|
|
|
|
etcDefaultPath: "/etc/default",
|
|
|
|
etcDefaultFilePath: "/etc/default/grafana-server",
|
|
|
|
initdScriptFilePath: "/etc/init.d/grafana-server",
|
|
|
|
systemdServiceFilePath: "/usr/lib/systemd/system/grafana-server.service",
|
|
|
|
|
|
|
|
postinstSrc: "packaging/deb/control/postinst",
|
|
|
|
initdScriptSrc: "packaging/deb/init.d/grafana-server",
|
|
|
|
defaultFileSrc: "packaging/deb/default/grafana-server",
|
|
|
|
systemdFileSrc: "packaging/deb/systemd/grafana-server.service",
|
|
|
|
|
|
|
|
depends: []string{"adduser", "libfontconfig"},
|
|
|
|
})
|
2015-12-04 15:36:38 -06:00
|
|
|
}
|
2015-04-10 09:20:01 -05:00
|
|
|
|
2015-12-04 15:36:38 -06:00
|
|
|
func createRpmPackages() {
|
2019-03-22 10:12:42 -05:00
|
|
|
rpmPkgArch := pkgArch
|
2018-05-23 16:53:59 -05:00
|
|
|
switch {
|
2018-05-28 03:39:42 -05:00
|
|
|
case pkgArch == "armv7":
|
2019-03-22 10:12:42 -05:00
|
|
|
rpmPkgArch = "armhfp"
|
2018-05-28 03:39:42 -05:00
|
|
|
case pkgArch == "arm64":
|
2019-03-22 10:12:42 -05:00
|
|
|
rpmPkgArch = "aarch64"
|
2018-05-23 16:53:59 -05:00
|
|
|
}
|
2015-04-10 09:20:01 -05:00
|
|
|
createPackage(linuxPackageOptions{
|
|
|
|
packageType: "rpm",
|
2019-03-22 10:12:42 -05:00
|
|
|
packageArch: rpmPkgArch,
|
2015-04-10 09:20:01 -05:00
|
|
|
homeDir: "/usr/share/grafana",
|
2016-02-15 08:22:03 -06:00
|
|
|
binPath: "/usr/sbin",
|
2015-04-10 09:20:01 -05:00
|
|
|
configDir: "/etc/grafana",
|
|
|
|
etcDefaultPath: "/etc/sysconfig",
|
|
|
|
etcDefaultFilePath: "/etc/sysconfig/grafana-server",
|
|
|
|
initdScriptFilePath: "/etc/init.d/grafana-server",
|
|
|
|
systemdServiceFilePath: "/usr/lib/systemd/system/grafana-server.service",
|
|
|
|
|
|
|
|
postinstSrc: "packaging/rpm/control/postinst",
|
|
|
|
initdScriptSrc: "packaging/rpm/init.d/grafana-server",
|
|
|
|
defaultFileSrc: "packaging/rpm/sysconfig/grafana-server",
|
|
|
|
systemdFileSrc: "packaging/rpm/systemd/grafana-server.service",
|
|
|
|
|
2017-05-23 06:53:03 -05:00
|
|
|
depends: []string{"/sbin/service", "fontconfig", "freetype", "urw-fonts"},
|
2015-04-10 09:20:01 -05:00
|
|
|
})
|
|
|
|
}
|
2015-04-08 09:58:05 -05:00
|
|
|
|
2015-12-04 15:36:38 -06:00
|
|
|
func createLinuxPackages() {
|
2019-01-18 04:36:04 -06:00
|
|
|
if !skipDebGen {
|
|
|
|
createDebPackages()
|
|
|
|
}
|
|
|
|
|
|
|
|
if !skipRpmGen {
|
|
|
|
createRpmPackages()
|
|
|
|
}
|
2015-12-04 15:36:38 -06:00
|
|
|
}
|
|
|
|
|
2015-04-10 09:20:01 -05:00
|
|
|
func createPackage(options linuxPackageOptions) {
|
|
|
|
packageRoot, _ := ioutil.TempDir("", "grafana-linux-pack")
|
2015-03-02 05:56:40 -06:00
|
|
|
|
2015-04-09 10:18:04 -05:00
|
|
|
// create directories
|
2015-04-10 09:20:01 -05:00
|
|
|
runPrint("mkdir", "-p", filepath.Join(packageRoot, options.homeDir))
|
|
|
|
runPrint("mkdir", "-p", filepath.Join(packageRoot, options.configDir))
|
2015-04-10 03:58:32 -05:00
|
|
|
runPrint("mkdir", "-p", filepath.Join(packageRoot, "/etc/init.d"))
|
2015-04-10 09:20:01 -05:00
|
|
|
runPrint("mkdir", "-p", filepath.Join(packageRoot, options.etcDefaultPath))
|
2015-04-10 03:58:32 -05:00
|
|
|
runPrint("mkdir", "-p", filepath.Join(packageRoot, "/usr/lib/systemd/system"))
|
|
|
|
runPrint("mkdir", "-p", filepath.Join(packageRoot, "/usr/sbin"))
|
2015-03-02 05:56:40 -06:00
|
|
|
|
2015-04-09 10:18:04 -05:00
|
|
|
// copy binary
|
2016-02-15 08:22:03 -06:00
|
|
|
for _, binary := range binaries {
|
|
|
|
runPrint("cp", "-p", filepath.Join(workingDir, "tmp/bin/"+binary), filepath.Join(packageRoot, "/usr/sbin/"+binary))
|
|
|
|
}
|
2015-04-08 07:10:04 -05:00
|
|
|
// copy init.d script
|
2015-04-10 09:20:01 -05:00
|
|
|
runPrint("cp", "-p", options.initdScriptSrc, filepath.Join(packageRoot, options.initdScriptFilePath))
|
2015-04-09 10:18:04 -05:00
|
|
|
// copy environment var file
|
2015-04-10 09:20:01 -05:00
|
|
|
runPrint("cp", "-p", options.defaultFileSrc, filepath.Join(packageRoot, options.etcDefaultFilePath))
|
2015-04-08 09:58:05 -05:00
|
|
|
// copy systemd file
|
2015-04-10 09:20:01 -05:00
|
|
|
runPrint("cp", "-p", options.systemdFileSrc, filepath.Join(packageRoot, options.systemdServiceFilePath))
|
2015-04-08 07:10:04 -05:00
|
|
|
// copy release files
|
2015-04-10 09:20:01 -05:00
|
|
|
runPrint("cp", "-a", filepath.Join(workingDir, "tmp")+"/.", filepath.Join(packageRoot, options.homeDir))
|
2015-04-15 08:41:56 -05:00
|
|
|
// remove bin path
|
|
|
|
runPrint("rm", "-rf", filepath.Join(packageRoot, options.homeDir, "bin"))
|
2015-03-02 05:56:40 -06:00
|
|
|
|
|
|
|
args := []string{
|
|
|
|
"-s", "dir",
|
|
|
|
"--description", "Grafana",
|
|
|
|
"-C", packageRoot,
|
2017-03-21 09:37:55 -05:00
|
|
|
"--url", "https://grafana.com",
|
|
|
|
"--maintainer", "contact@grafana.com",
|
2015-04-10 09:20:01 -05:00
|
|
|
"--config-files", options.initdScriptFilePath,
|
|
|
|
"--config-files", options.etcDefaultFilePath,
|
|
|
|
"--config-files", options.systemdServiceFilePath,
|
|
|
|
"--after-install", options.postinstSrc,
|
2018-04-27 06:41:58 -05:00
|
|
|
|
2015-04-21 11:46:44 -05:00
|
|
|
"--version", linuxPackageVersion,
|
2015-03-02 05:56:40 -06:00
|
|
|
"-p", "./dist",
|
|
|
|
}
|
|
|
|
|
2018-04-27 06:41:58 -05:00
|
|
|
name := "grafana"
|
|
|
|
if enterprise {
|
|
|
|
name += "-enterprise"
|
2018-07-18 08:40:30 -05:00
|
|
|
args = append(args, "--replaces", "grafana")
|
2018-04-27 06:41:58 -05:00
|
|
|
}
|
2019-03-22 10:12:42 -05:00
|
|
|
fmt.Printf("pkgArch is set to '%s', generated arch is '%s'\n", pkgArch, options.packageArch)
|
|
|
|
if pkgArch == "armv6" {
|
|
|
|
name += "-rpi"
|
|
|
|
}
|
2018-04-27 06:41:58 -05:00
|
|
|
args = append(args, "--name", name)
|
|
|
|
|
|
|
|
description := "Grafana"
|
|
|
|
if enterprise {
|
|
|
|
description += " Enterprise"
|
|
|
|
}
|
|
|
|
args = append(args, "--vendor", description)
|
|
|
|
|
|
|
|
if !enterprise {
|
|
|
|
args = append(args, "--license", "\"Apache 2.0\"")
|
|
|
|
}
|
|
|
|
|
2017-03-21 04:35:18 -05:00
|
|
|
if options.packageType == "rpm" {
|
|
|
|
args = append(args, "--rpm-posttrans", "packaging/rpm/control/posttrans")
|
|
|
|
}
|
|
|
|
|
|
|
|
if options.packageType == "deb" {
|
|
|
|
args = append(args, "--deb-no-default-config-files")
|
|
|
|
}
|
|
|
|
|
2019-03-22 10:12:42 -05:00
|
|
|
if options.packageArch != "" {
|
|
|
|
args = append(args, "-a", options.packageArch)
|
2016-09-18 05:07:12 -05:00
|
|
|
}
|
|
|
|
|
2015-04-21 11:46:44 -05:00
|
|
|
if linuxPackageIteration != "" {
|
|
|
|
args = append(args, "--iteration", linuxPackageIteration)
|
|
|
|
}
|
|
|
|
|
2015-04-10 09:20:01 -05:00
|
|
|
// add dependenciesj
|
|
|
|
for _, dep := range options.depends {
|
|
|
|
args = append(args, "--depends", dep)
|
|
|
|
}
|
|
|
|
|
|
|
|
args = append(args, ".")
|
|
|
|
|
|
|
|
fmt.Println("Creating package: ", options.packageType)
|
|
|
|
runPrint("fpm", append([]string{"-t", options.packageType}, args...)...)
|
2015-03-02 05:56:40 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func ensureGoPath() {
|
|
|
|
if os.Getenv("GOPATH") == "" {
|
|
|
|
cwd, err := os.Getwd()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
gopath := filepath.Clean(filepath.Join(cwd, "../../../../"))
|
|
|
|
log.Println("GOPATH is", gopath)
|
|
|
|
os.Setenv("GOPATH", gopath)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-04 00:09:59 -06:00
|
|
|
func grunt(params ...string) {
|
2018-09-22 03:50:00 -05:00
|
|
|
if runtime.GOOS == windows {
|
2018-01-19 03:25:15 -06:00
|
|
|
runPrint(`.\node_modules\.bin\grunt`, params...)
|
|
|
|
} else {
|
|
|
|
runPrint("./node_modules/.bin/grunt", params...)
|
|
|
|
}
|
2015-01-28 06:10:09 -06:00
|
|
|
}
|
|
|
|
|
2019-03-23 18:43:36 -05:00
|
|
|
func genPackageVersion() string {
|
2018-11-05 08:05:12 -06:00
|
|
|
if includeBuildId {
|
2019-03-23 18:43:36 -05:00
|
|
|
return fmt.Sprintf("%v-%v", linuxPackageVersion, linuxPackageIteration)
|
2017-01-30 08:21:39 -06:00
|
|
|
} else {
|
2019-03-23 18:43:36 -05:00
|
|
|
return version
|
2017-01-30 08:21:39 -06:00
|
|
|
}
|
2019-03-23 18:43:36 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func gruntBuildArg(task string) []string {
|
|
|
|
args := []string{task}
|
|
|
|
args = append(args, fmt.Sprintf("--pkgVer=%v", genPackageVersion()))
|
2016-09-18 05:07:12 -05:00
|
|
|
if pkgArch != "" {
|
|
|
|
args = append(args, fmt.Sprintf("--arch=%v", pkgArch))
|
|
|
|
}
|
|
|
|
if phjsToRelease != "" {
|
|
|
|
args = append(args, fmt.Sprintf("--phjsToRelease=%v", phjsToRelease))
|
|
|
|
}
|
2018-10-25 09:55:27 -05:00
|
|
|
if enterprise {
|
|
|
|
args = append(args, "--enterprise")
|
|
|
|
}
|
|
|
|
|
2018-08-21 02:33:48 -05:00
|
|
|
args = append(args, fmt.Sprintf("--platform=%v", goos))
|
|
|
|
|
2016-09-18 05:07:12 -05:00
|
|
|
return args
|
|
|
|
}
|
|
|
|
|
2015-01-05 03:46:58 -06:00
|
|
|
func setup() {
|
2018-01-19 03:25:15 -06:00
|
|
|
runPrint("go", "get", "-v", "github.com/golang/dep")
|
2016-09-22 03:33:43 -05:00
|
|
|
runPrint("go", "install", "-v", "./pkg/cmd/grafana-server")
|
2015-01-05 03:46:58 -06:00
|
|
|
}
|
|
|
|
|
2019-03-22 10:12:42 -05:00
|
|
|
func printGeneratedVersion() {
|
2019-03-23 18:43:36 -05:00
|
|
|
fmt.Print(genPackageVersion())
|
2019-03-22 10:12:42 -05:00
|
|
|
}
|
|
|
|
|
2015-01-05 03:46:58 -06:00
|
|
|
func test(pkg string) {
|
|
|
|
setBuildEnv()
|
|
|
|
runPrint("go", "test", "-short", "-timeout", "60s", pkg)
|
|
|
|
}
|
|
|
|
|
2016-02-15 07:09:34 -06:00
|
|
|
func build(binaryName, pkg string, tags []string) {
|
2018-05-08 02:42:20 -05:00
|
|
|
binary := fmt.Sprintf("./bin/%s-%s/%s", goos, goarch, binaryName)
|
2018-05-28 03:39:42 -05:00
|
|
|
if isDev {
|
2018-09-21 04:51:26 -05:00
|
|
|
//don't include os and arch in output path in dev environment
|
2018-05-28 03:39:42 -05:00
|
|
|
binary = fmt.Sprintf("./bin/%s", binaryName)
|
|
|
|
}
|
2018-05-08 02:42:20 -05:00
|
|
|
|
2018-09-22 03:50:00 -05:00
|
|
|
if goos == windows {
|
2015-01-05 03:46:58 -06:00
|
|
|
binary += ".exe"
|
|
|
|
}
|
|
|
|
|
2018-04-18 04:24:29 -05:00
|
|
|
if !isDev {
|
|
|
|
rmr(binary, binary+".md5")
|
|
|
|
}
|
2015-01-05 03:46:58 -06:00
|
|
|
args := []string{"build", "-ldflags", ldflags()}
|
|
|
|
if len(tags) > 0 {
|
|
|
|
args = append(args, "-tags", strings.Join(tags, ","))
|
|
|
|
}
|
|
|
|
if race {
|
|
|
|
args = append(args, "-race")
|
|
|
|
}
|
|
|
|
|
|
|
|
args = append(args, "-o", binary)
|
|
|
|
args = append(args, pkg)
|
2015-12-04 04:21:38 -06:00
|
|
|
|
2018-04-18 04:24:29 -05:00
|
|
|
if !isDev {
|
|
|
|
setBuildEnv()
|
|
|
|
runPrint("go", "version")
|
2018-05-08 02:42:20 -05:00
|
|
|
fmt.Printf("Targeting %s/%s\n", goos, goarch)
|
2018-04-18 04:24:29 -05:00
|
|
|
}
|
|
|
|
|
2015-01-05 03:46:58 -06:00
|
|
|
runPrint("go", args...)
|
|
|
|
|
2018-04-18 04:24:29 -05:00
|
|
|
if !isDev {
|
|
|
|
// Create an md5 checksum of the binary, to be included in the archive for
|
|
|
|
// automatic upgrades.
|
|
|
|
err := md5File(binary)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
2015-01-05 03:46:58 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ldflags() string {
|
|
|
|
var b bytes.Buffer
|
|
|
|
b.WriteString("-w")
|
2015-12-01 02:23:30 -06:00
|
|
|
b.WriteString(fmt.Sprintf(" -X main.version=%s", version))
|
|
|
|
b.WriteString(fmt.Sprintf(" -X main.commit=%s", getGitSha()))
|
|
|
|
b.WriteString(fmt.Sprintf(" -X main.buildstamp=%d", buildStamp()))
|
2018-10-29 07:27:29 -05:00
|
|
|
b.WriteString(fmt.Sprintf(" -X main.buildBranch=%s", getGitBranch()))
|
2015-01-05 03:46:58 -06:00
|
|
|
return b.String()
|
|
|
|
}
|
|
|
|
|
|
|
|
func rmr(paths ...string) {
|
|
|
|
for _, path := range paths {
|
|
|
|
log.Println("rm -r", path)
|
|
|
|
os.RemoveAll(path)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func clean() {
|
2018-04-18 04:24:29 -05:00
|
|
|
if isDev {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2015-03-02 11:26:43 -06:00
|
|
|
rmr("dist")
|
|
|
|
rmr("tmp")
|
2015-03-03 03:18:24 -06:00
|
|
|
rmr(filepath.Join(os.Getenv("GOPATH"), fmt.Sprintf("pkg/%s_%s/github.com/grafana", goos, goarch)))
|
2015-01-05 03:46:58 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func setBuildEnv() {
|
|
|
|
os.Setenv("GOOS", goos)
|
2018-09-22 03:50:00 -05:00
|
|
|
if goos == windows {
|
2018-05-08 02:42:20 -05:00
|
|
|
// require windows >=7
|
|
|
|
os.Setenv("CGO_CFLAGS", "-D_WIN32_WINNT=0x0601")
|
|
|
|
}
|
2018-09-22 03:50:00 -05:00
|
|
|
if goarch != "amd64" || goos != linux {
|
2018-05-08 02:42:20 -05:00
|
|
|
// needed for all other archs
|
|
|
|
cgo = true
|
|
|
|
}
|
2015-01-05 03:46:58 -06:00
|
|
|
if strings.HasPrefix(goarch, "armv") {
|
|
|
|
os.Setenv("GOARCH", "arm")
|
|
|
|
os.Setenv("GOARM", goarch[4:])
|
|
|
|
} else {
|
|
|
|
os.Setenv("GOARCH", goarch)
|
|
|
|
}
|
|
|
|
if goarch == "386" {
|
|
|
|
os.Setenv("GO386", "387")
|
|
|
|
}
|
2018-05-08 02:42:20 -05:00
|
|
|
if cgo {
|
|
|
|
os.Setenv("CGO_ENABLED", "1")
|
2016-09-18 05:07:12 -05:00
|
|
|
}
|
|
|
|
if gocc != "" {
|
|
|
|
os.Setenv("CC", gocc)
|
|
|
|
}
|
2015-01-05 03:46:58 -06:00
|
|
|
}
|
|
|
|
|
2018-10-29 07:27:29 -05:00
|
|
|
func getGitBranch() string {
|
|
|
|
v, err := runError("git", "rev-parse", "--abbrev-ref", "HEAD")
|
|
|
|
if err != nil {
|
|
|
|
return "master"
|
|
|
|
}
|
|
|
|
return string(v)
|
|
|
|
}
|
|
|
|
|
2015-01-05 03:46:58 -06:00
|
|
|
func getGitSha() string {
|
2017-01-30 01:08:37 -06:00
|
|
|
v, err := runError("git", "rev-parse", "--short", "HEAD")
|
2015-01-05 03:46:58 -06:00
|
|
|
if err != nil {
|
|
|
|
return "unknown-dev"
|
|
|
|
}
|
|
|
|
return string(v)
|
|
|
|
}
|
|
|
|
|
|
|
|
func buildStamp() int64 {
|
|
|
|
bs, err := runError("git", "show", "-s", "--format=%ct")
|
|
|
|
if err != nil {
|
|
|
|
return time.Now().Unix()
|
|
|
|
}
|
|
|
|
s, _ := strconv.ParseInt(string(bs), 10, 64)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
func runError(cmd string, args ...string) ([]byte, error) {
|
|
|
|
ecmd := exec.Command(cmd, args...)
|
|
|
|
bs, err := ecmd.CombinedOutput()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2015-03-04 09:23:21 -06:00
|
|
|
|
2015-01-05 03:46:58 -06:00
|
|
|
return bytes.TrimSpace(bs), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func runPrint(cmd string, args ...string) {
|
|
|
|
log.Println(cmd, strings.Join(args, " "))
|
|
|
|
ecmd := exec.Command(cmd, args...)
|
|
|
|
ecmd.Stdout = os.Stdout
|
|
|
|
ecmd.Stderr = os.Stderr
|
|
|
|
err := ecmd.Run()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func md5File(file string) error {
|
|
|
|
fd, err := os.Open(file)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer fd.Close()
|
|
|
|
|
|
|
|
h := md5.New()
|
|
|
|
_, err = io.Copy(h, fd)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
out, err := os.Create(file + ".md5")
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = fmt.Fprintf(out, "%x\n", h.Sum(nil))
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return out.Close()
|
|
|
|
}
|
2016-10-06 03:53:24 -05:00
|
|
|
|
2017-02-23 13:48:31 -06:00
|
|
|
func shaFilesInDist() {
|
2016-10-06 03:53:24 -05:00
|
|
|
filepath.Walk("./dist", func(path string, f os.FileInfo, err error) error {
|
2017-01-27 05:41:05 -06:00
|
|
|
if path == "./dist" {
|
2017-01-30 01:08:37 -06:00
|
|
|
return nil
|
|
|
|
}
|
2017-01-27 05:41:05 -06:00
|
|
|
|
Simplify comparison to bool constant (gosimple)
This fixes:
build.go:553:6: should omit comparison to bool constant, can be simplified to !strings.Contains(path, ".sha256") (S1002)
pkg/cmd/grafana-cli/commands/ls_command.go:27:5: should omit comparison to bool constant, can be simplified to !pluginDirInfo.IsDir() (S1002)
pkg/components/dynmap/dynmap_test.go:24:5: should omit comparison to bool constant, can be simplified to !value (S1002)
pkg/components/dynmap/dynmap_test.go:122:14: should omit comparison to bool constant, can be simplified to b (S1002)
pkg/components/dynmap/dynmap_test.go:125:14: should omit comparison to bool constant, can be simplified to !b (S1002)
pkg/components/dynmap/dynmap_test.go:128:14: should omit comparison to bool constant, can be simplified to !b (S1002)
pkg/models/org_user.go:51:5: should omit comparison to bool constant, can be simplified to !(*r).IsValid() (S1002)
pkg/plugins/datasource/wrapper/datasource_plugin_wrapper_test.go:77:12: should omit comparison to bool constant, can be simplified to !haveBool (S1002)
pkg/services/alerting/conditions/evaluator.go:23:9: should omit comparison to bool constant, can be simplified to !reducedValue.Valid (S1002)
pkg/services/alerting/conditions/evaluator.go:48:5: should omit comparison to bool constant, can be simplified to !reducedValue.Valid (S1002)
pkg/services/alerting/conditions/evaluator.go:91:5: should omit comparison to bool constant, can be simplified to !reducedValue.Valid (S1002)
pkg/services/alerting/conditions/query.go:56:6: should omit comparison to bool constant, can be simplified to !reducedValue.Valid (S1002)
pkg/services/alerting/extractor.go:107:20: should omit comparison to bool constant, can be simplified to !enabled.MustBool() (S1002)
pkg/services/alerting/notifiers/telegram.go:222:41: should omit comparison to bool constant, can be simplified to this.UploadImage (S1002)
pkg/services/sqlstore/apikey.go:58:12: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/apikey.go:72:12: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/dashboard.go:66:33: should omit comparison to bool constant, can be simplified to !cmd.Overwrite (S1002)
pkg/services/sqlstore/dashboard.go:175:12: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/dashboard.go:311:13: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/dashboard.go:444:12: should omit comparison to bool constant, can be simplified to !exists (S1002)
pkg/services/sqlstore/dashboard.go:472:12: should omit comparison to bool constant, can be simplified to !exists (S1002)
pkg/services/sqlstore/dashboard.go:554:32: should omit comparison to bool constant, can be simplified to !cmd.Overwrite (S1002)
pkg/services/sqlstore/dashboard_snapshot.go:83:12: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/plugin_setting.go:39:12: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/quota.go:34:12: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/quota.go:111:6: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/quota.go:136:12: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/quota.go:213:6: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/temp_user.go:129:12: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/user.go:157:12: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/user.go:182:5: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/user.go:191:12: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/user.go:212:12: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/services/sqlstore/user.go:307:12: should omit comparison to bool constant, can be simplified to !has (S1002)
pkg/social/generic_oauth.go:185:5: should omit comparison to bool constant, can be simplified to !s.extractToken(&data, token) (S1002)
pkg/tsdb/mssql/mssql.go:148:39: should omit comparison to bool constant, can be simplified to ok (S1002)
pkg/tsdb/mssql/mssql.go:212:6: should omit comparison to bool constant, can be simplified to !query.Model.Get("fillNull").MustBool(false) (S1002)
pkg/tsdb/mssql/mssql.go:247:56: should omit comparison to bool constant, can be simplified to ok (S1002)
pkg/tsdb/mssql/mssql.go:274:7: should omit comparison to bool constant, can be simplified to !exist (S1002)
pkg/tsdb/mssql/mssql.go:282:8: should omit comparison to bool constant, can be simplified to !exist (S1002)
pkg/tsdb/mysql/mysql.go:221:6: should omit comparison to bool constant, can be simplified to !query.Model.Get("fillNull").MustBool(false) (S1002)
pkg/tsdb/mysql/mysql.go:256:56: should omit comparison to bool constant, can be simplified to ok (S1002)
pkg/tsdb/mysql/mysql.go:283:7: should omit comparison to bool constant, can be simplified to !exist (S1002)
pkg/tsdb/mysql/mysql.go:291:8: should omit comparison to bool constant, can be simplified to !exist (S1002)
pkg/tsdb/postgres/postgres.go:134:39: should omit comparison to bool constant, can be simplified to ok (S1002)
pkg/tsdb/postgres/postgres.go:201:6: should omit comparison to bool constant, can be simplified to !query.Model.Get("fillNull").MustBool(false) (S1002)
pkg/tsdb/postgres/postgres.go:236:56: should omit comparison to bool constant, can be simplified to ok (S1002)
pkg/tsdb/postgres/postgres.go:263:7: should omit comparison to bool constant, can be simplified to !exist (S1002)
pkg/tsdb/postgres/postgres.go:271:8: should omit comparison to bool constant, can be simplified to !exist (S1002)
2018-04-16 13:12:59 -05:00
|
|
|
if !strings.Contains(path, ".sha256") {
|
2017-02-23 13:48:31 -06:00
|
|
|
err := shaFile(path)
|
2017-01-30 01:08:37 -06:00
|
|
|
if err != nil {
|
|
|
|
log.Printf("Failed to create sha file. error: %v\n", err)
|
|
|
|
}
|
2016-10-06 03:53:24 -05:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2017-02-23 13:48:31 -06:00
|
|
|
func shaFile(file string) error {
|
2016-10-06 03:53:24 -05:00
|
|
|
fd, err := os.Open(file)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer fd.Close()
|
|
|
|
|
2017-02-23 13:48:31 -06:00
|
|
|
h := sha256.New()
|
2016-10-06 03:53:24 -05:00
|
|
|
_, err = io.Copy(h, fd)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-02-23 13:48:31 -06:00
|
|
|
out, err := os.Create(file + ".sha256")
|
2016-10-06 03:53:24 -05:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = fmt.Fprintf(out, "%x\n", h.Sum(nil))
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return out.Close()
|
|
|
|
}
|
2018-11-05 08:05:12 -06:00
|
|
|
|
|
|
|
func shortenBuildId(buildId string) string {
|
|
|
|
buildId = strings.Replace(buildId, "-", "", -1)
|
2018-11-12 03:47:27 -06:00
|
|
|
if len(buildId) < 9 {
|
2018-11-05 08:05:12 -06:00
|
|
|
return buildId
|
|
|
|
}
|
|
|
|
return buildId[0:8]
|
|
|
|
}
|