build: support for publishing armv6.
This commit is contained in:
@@ -340,7 +340,9 @@ jobs:
|
|||||||
command: '/opt/google-cloud-sdk/bin/gsutil cp ./enterprise-dist/* gs://$GCP_BUCKET_NAME/enterprise/master'
|
command: '/opt/google-cloud-sdk/bin/gsutil cp ./enterprise-dist/* gs://$GCP_BUCKET_NAME/enterprise/master'
|
||||||
- run:
|
- run:
|
||||||
name: Deploy to grafana.com
|
name: Deploy to grafana.com
|
||||||
command: 'cd enterprise-dist && ../scripts/build/release_publisher/release_publisher -apikey ${GRAFANA_COM_API_KEY} -enterprise -from-local'
|
command: |
|
||||||
|
cd enterprise-dist
|
||||||
|
../scripts/build/release_publisher/release_publisher -apikey ${GRAFANA_COM_API_KEY} -enterprise -version "$(cat grafana.version)"' --nightly
|
||||||
|
|
||||||
|
|
||||||
deploy-enterprise-release:
|
deploy-enterprise-release:
|
||||||
@@ -405,7 +407,7 @@ jobs:
|
|||||||
command: |
|
command: |
|
||||||
rm dist/grafana-master-$(echo "${CIRCLE_SHA1}" | cut -b1-7).linux-x64.tar.gz
|
rm dist/grafana-master-$(echo "${CIRCLE_SHA1}" | cut -b1-7).linux-x64.tar.gz
|
||||||
rm dist/*latest*
|
rm dist/*latest*
|
||||||
cd dist && ../scripts/build/release_publisher/release_publisher -apikey ${GRAFANA_COM_API_KEY} -from-local
|
cd dist && ../scripts/build/release_publisher/release_publisher -apikey ${GRAFANA_COM_API_KEY} -version "$(cat grafana.version)" --nightly
|
||||||
|
|
||||||
deploy-release:
|
deploy-release:
|
||||||
docker:
|
docker:
|
||||||
|
|||||||
@@ -1,95 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
type releaseLocalSources struct {
|
|
||||||
path string
|
|
||||||
artifactConfigurations []buildArtifact
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r releaseLocalSources) prepareRelease(baseArchiveURL, whatsNewURL string, releaseNotesURL string, nightly bool) (*release, error) {
|
|
||||||
if !nightly {
|
|
||||||
return nil, errors.New("Local releases only supported for nightly builds")
|
|
||||||
}
|
|
||||||
buildData := r.findBuilds(baseArchiveURL)
|
|
||||||
|
|
||||||
rel := release{
|
|
||||||
Version: buildData.version,
|
|
||||||
ReleaseDate: time.Now().UTC(),
|
|
||||||
Stable: false,
|
|
||||||
Beta: false,
|
|
||||||
Nightly: nightly,
|
|
||||||
WhatsNewURL: whatsNewURL,
|
|
||||||
ReleaseNotesURL: releaseNotesURL,
|
|
||||||
Builds: buildData.builds,
|
|
||||||
}
|
|
||||||
|
|
||||||
return &rel, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type buildData struct {
|
|
||||||
version string
|
|
||||||
builds []build
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r releaseLocalSources) findBuilds(baseArchiveURL string) buildData {
|
|
||||||
data := buildData{}
|
|
||||||
filepath.Walk(r.path, createBuildWalker(r.path, &data, r.artifactConfigurations, baseArchiveURL))
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
|
|
||||||
func createBuildWalker(path string, data *buildData, archiveTypes []buildArtifact, baseArchiveURL string) func(path string, f os.FileInfo, err error) error {
|
|
||||||
return func(path string, f os.FileInfo, err error) error {
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("error: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if f.Name() == path || strings.HasSuffix(f.Name(), ".sha256") {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, archive := range archiveTypes {
|
|
||||||
if strings.HasSuffix(f.Name(), archive.urlPostfix) {
|
|
||||||
shaBytes, err := ioutil.ReadFile(path + ".sha256")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to read sha256 file %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
version, err := grabVersion(f.Name(), archive.urlPostfix)
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
data.version = version
|
|
||||||
data.builds = append(data.builds, build{
|
|
||||||
Os: archive.os,
|
|
||||||
URL: archive.getURL(baseArchiveURL, version, NIGHTLY),
|
|
||||||
Sha256: string(shaBytes),
|
|
||||||
Arch: archive.arch,
|
|
||||||
})
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
func grabVersion(name string, suffix string) (string, error) {
|
|
||||||
match := regexp.MustCompile(fmt.Sprintf(`grafana(-enterprise)?[-_](.*)%s`, suffix)).FindSubmatch([]byte(name))
|
|
||||||
if len(match) > 0 {
|
|
||||||
return string(match[2]), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", errors.New("No version found")
|
|
||||||
}
|
|
||||||
@@ -13,7 +13,6 @@ func main() {
|
|||||||
var releaseNotesURL string
|
var releaseNotesURL string
|
||||||
var dryRun bool
|
var dryRun bool
|
||||||
var enterprise bool
|
var enterprise bool
|
||||||
var fromLocal bool
|
|
||||||
var nightly bool
|
var nightly bool
|
||||||
var apiKey string
|
var apiKey string
|
||||||
|
|
||||||
@@ -23,11 +22,9 @@ func main() {
|
|||||||
flag.StringVar(&apiKey, "apikey", "", "Grafana.com API key (ex: --apikey ABCDEF)")
|
flag.StringVar(&apiKey, "apikey", "", "Grafana.com API key (ex: --apikey ABCDEF)")
|
||||||
flag.BoolVar(&dryRun, "dry-run", false, "--dry-run")
|
flag.BoolVar(&dryRun, "dry-run", false, "--dry-run")
|
||||||
flag.BoolVar(&enterprise, "enterprise", false, "--enterprise")
|
flag.BoolVar(&enterprise, "enterprise", false, "--enterprise")
|
||||||
flag.BoolVar(&fromLocal, "from-local", false, "--from-local (builds will be tagged as nightly)")
|
flag.BoolVar(&nightly, "nightly", false, "--nightly (default: false)")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
nightly = fromLocal
|
|
||||||
|
|
||||||
if len(os.Args) == 1 {
|
if len(os.Args) == 1 {
|
||||||
fmt.Println("Usage: go run publisher.go main.go --version <v> --wn <what's new url> --rn <release notes url> --apikey <api key> --dry-run false --enterprise false --nightly false")
|
fmt.Println("Usage: go run publisher.go main.go --version <v> --wn <what's new url> --rn <release notes url> --apikey <api key> --dry-run false --enterprise false --nightly false")
|
||||||
fmt.Println("example: go run publisher.go main.go --version v5.2.0-beta2 --wn http://docs.grafana.org/guides/whats-new-in-v5-2/ --rn https://community.grafana.com/t/release-notes-v5-2-x/7894 --apikey ASDF123 --dry-run --enterprise")
|
fmt.Println("example: go run publisher.go main.go --version v5.2.0-beta2 --wn http://docs.grafana.org/guides/whats-new-in-v5-2/ --rn https://community.grafana.com/t/release-notes-v5-2-x/7894 --apikey ASDF123 --dry-run --enterprise")
|
||||||
@@ -64,18 +61,10 @@ func main() {
|
|||||||
baseURL = createBaseURL(archiveProviderRoot, "oss", product, nightly)
|
baseURL = createBaseURL(archiveProviderRoot, "oss", product, nightly)
|
||||||
}
|
}
|
||||||
|
|
||||||
if fromLocal {
|
builder = releaseFromExternalContent{
|
||||||
path, _ := os.Getwd()
|
getter: getHTTPContents{},
|
||||||
builder = releaseLocalSources{
|
rawVersion: version,
|
||||||
path: path,
|
artifactConfigurations: buildArtifacts,
|
||||||
artifactConfigurations: buildArtifacts,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
builder = releaseFromExternalContent{
|
|
||||||
getter: getHTTPContents{},
|
|
||||||
rawVersion: version,
|
|
||||||
artifactConfigurations: buildArtifacts,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
p := publisher{
|
p := publisher{
|
||||||
|
|||||||
@@ -85,9 +85,10 @@ func (rt releaseType) nightly() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type buildArtifact struct {
|
type buildArtifact struct {
|
||||||
os string
|
os string
|
||||||
arch string
|
arch string
|
||||||
urlPostfix string
|
urlPostfix string
|
||||||
|
packagePostfix string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t buildArtifact) getURL(baseArchiveURL, version string, releaseType releaseType) string {
|
func (t buildArtifact) getURL(baseArchiveURL, version string, releaseType releaseType) string {
|
||||||
@@ -102,7 +103,7 @@ func (t buildArtifact) getURL(baseArchiveURL, version string, releaseType releas
|
|||||||
rhelReleaseExtra = "-1"
|
rhelReleaseExtra = "-1"
|
||||||
}
|
}
|
||||||
|
|
||||||
url := strings.Join([]string{baseArchiveURL, prefix, version, rhelReleaseExtra, t.urlPostfix}, "")
|
url := strings.Join([]string{baseArchiveURL, t.packagePostfix, prefix, version, rhelReleaseExtra, t.urlPostfix}, "")
|
||||||
return url
|
return url
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,9 +129,10 @@ var completeBuildArtifactConfigurations = []buildArtifact{
|
|||||||
urlPostfix: "_armhf.deb",
|
urlPostfix: "_armhf.deb",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
os: "deb",
|
os: "deb",
|
||||||
arch: "armv6",
|
arch: "armv6",
|
||||||
urlPostfix: "_armel.deb",
|
packagePostfix: "-rpi",
|
||||||
|
urlPostfix: "_armhf.deb",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
os: "rhel",
|
os: "rhel",
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ func TestPreparingReleaseFromRemote(t *testing.T) {
|
|||||||
expectedOs: "linux",
|
expectedOs: "linux",
|
||||||
expectedURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.0-beta1.linux-amd64.tar.gz",
|
expectedURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.0-beta1.linux-amd64.tar.gz",
|
||||||
baseArchiveURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana",
|
baseArchiveURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana",
|
||||||
buildArtifacts: []buildArtifact{{"linux", "amd64", ".linux-amd64.tar.gz"}},
|
buildArtifacts: []buildArtifact{{"linux", "amd64", ".linux-amd64.tar.gz", ""}},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
version: "v5.2.3",
|
version: "v5.2.3",
|
||||||
@@ -44,7 +44,7 @@ func TestPreparingReleaseFromRemote(t *testing.T) {
|
|||||||
expectedOs: "rhel",
|
expectedOs: "rhel",
|
||||||
expectedURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.3-1.x86_64.rpm",
|
expectedURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.3-1.x86_64.rpm",
|
||||||
baseArchiveURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana",
|
baseArchiveURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana",
|
||||||
buildArtifacts: []buildArtifact{{"rhel", "amd64", ".x86_64.rpm"}},
|
buildArtifacts: []buildArtifact{{"rhel", "amd64", ".x86_64.rpm", ""}},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
version: "v5.4.0-pre1asdf",
|
version: "v5.4.0-pre1asdf",
|
||||||
@@ -58,7 +58,21 @@ func TestPreparingReleaseFromRemote(t *testing.T) {
|
|||||||
expectedOs: "rhel",
|
expectedOs: "rhel",
|
||||||
expectedURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.4.0-pre1asdf.x86_64.rpm",
|
expectedURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.4.0-pre1asdf.x86_64.rpm",
|
||||||
baseArchiveURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana",
|
baseArchiveURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana",
|
||||||
buildArtifacts: []buildArtifact{{"rhel", "amd64", ".x86_64.rpm"}},
|
buildArtifacts: []buildArtifact{{"rhel", "amd64", ".x86_64.rpm", ""}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "v5.4.0-pre1asdf",
|
||||||
|
expectedVersion: "5.4.0-pre1asdf",
|
||||||
|
whatsNewURL: "https://whatsnews.foo/",
|
||||||
|
relNotesURL: "https://relnotes.foo/",
|
||||||
|
nightly: true,
|
||||||
|
expectedBeta: false,
|
||||||
|
expectedStable: false,
|
||||||
|
expectedArch: "armv6",
|
||||||
|
expectedOs: "linux",
|
||||||
|
expectedURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-rpi-5.4.0-pre1asdf_armhf.deb",
|
||||||
|
baseArchiveURL: "https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana",
|
||||||
|
buildArtifacts: []buildArtifact{{"linux", "armv6", "_armhf.deb", "-rpi"}},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,78 +119,6 @@ func (mockHTTPGetter) getContents(url string) (string, error) {
|
|||||||
return url, nil
|
return url, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPreparingReleaseFromLocal(t *testing.T) {
|
|
||||||
whatsNewURL := "https://whatsnews.foo/"
|
|
||||||
relNotesURL := "https://relnotes.foo/"
|
|
||||||
expectedVersion := "5.4.0-123pre1"
|
|
||||||
expectedBuilds := 4
|
|
||||||
|
|
||||||
var builder releaseBuilder
|
|
||||||
testDataPath := "testdata"
|
|
||||||
builder = releaseLocalSources{
|
|
||||||
path: testDataPath,
|
|
||||||
artifactConfigurations: completeBuildArtifactConfigurations,
|
|
||||||
}
|
|
||||||
|
|
||||||
relAll, _ := builder.prepareRelease("https://s3-us-west-2.amazonaws.com/grafana-enterprise-releases/master/grafana-enterprise", whatsNewURL, relNotesURL, true)
|
|
||||||
|
|
||||||
if relAll.Stable || !relAll.Nightly {
|
|
||||||
t.Error("Expected a nightly release but wasn't.")
|
|
||||||
}
|
|
||||||
|
|
||||||
if relAll.ReleaseNotesURL != relNotesURL {
|
|
||||||
t.Errorf("expected releaseNotesURL to be %s, but it was %s", relNotesURL, relAll.ReleaseNotesURL)
|
|
||||||
}
|
|
||||||
if relAll.WhatsNewURL != whatsNewURL {
|
|
||||||
t.Errorf("expected whatsNewURL to be %s, but it was %s", whatsNewURL, relAll.WhatsNewURL)
|
|
||||||
}
|
|
||||||
|
|
||||||
if relAll.Beta {
|
|
||||||
t.Errorf("Expected release to be nightly, not beta.")
|
|
||||||
}
|
|
||||||
|
|
||||||
if relAll.Version != expectedVersion {
|
|
||||||
t.Errorf("Expected version=%s, but got=%s", expectedVersion, relAll.Version)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(relAll.Builds) != expectedBuilds {
|
|
||||||
t.Errorf("Expected %v builds, but was %v", expectedBuilds, len(relAll.Builds))
|
|
||||||
}
|
|
||||||
|
|
||||||
expectedArch := "amd64"
|
|
||||||
expectedOs := "win"
|
|
||||||
|
|
||||||
builder = releaseLocalSources{
|
|
||||||
path: testDataPath,
|
|
||||||
artifactConfigurations: []buildArtifact{{
|
|
||||||
os: expectedOs,
|
|
||||||
arch: expectedArch,
|
|
||||||
urlPostfix: ".windows-amd64.zip",
|
|
||||||
}},
|
|
||||||
}
|
|
||||||
|
|
||||||
relOne, _ := builder.prepareRelease("https://s3-us-west-2.amazonaws.com/grafana-enterprise-releases/master/grafana-enterprise", whatsNewURL, relNotesURL, true)
|
|
||||||
|
|
||||||
if len(relOne.Builds) != 1 {
|
|
||||||
t.Errorf("Expected 1 artifact, but was %v", len(relOne.Builds))
|
|
||||||
}
|
|
||||||
|
|
||||||
build := relOne.Builds[0]
|
|
||||||
|
|
||||||
if build.Arch != expectedArch {
|
|
||||||
t.Fatalf("Expected arch to be %s, but was %s", expectedArch, build.Arch)
|
|
||||||
}
|
|
||||||
|
|
||||||
if build.Os != expectedOs {
|
|
||||||
t.Fatalf("Expected os to be %s, but was %s", expectedOs, build.Os)
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := builder.prepareRelease("", "", "", false)
|
|
||||||
if err == nil {
|
|
||||||
t.Error("Error was nil, but expected an error as the local releaser only supports nightly builds.")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFilterBuildArtifacts(t *testing.T) {
|
func TestFilterBuildArtifacts(t *testing.T) {
|
||||||
buildArtifacts, _ := filterBuildArtifacts([]artifactFilter{
|
buildArtifacts, _ := filterBuildArtifacts([]artifactFilter{
|
||||||
{os: "deb", arch: "amd64"},
|
{os: "deb", arch: "amd64"},
|
||||||
|
|||||||
Reference in New Issue
Block a user