mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			117 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"log"
 | |
| 	"os/exec"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/grafana/grafana/pkg/build/config"
 | |
| 	"github.com/grafana/grafana/pkg/build/docker"
 | |
| 	"github.com/grafana/grafana/pkg/build/gcloud"
 | |
| 	"github.com/urfave/cli/v2"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	alpine = "alpine"
 | |
| 	ubuntu = "ubuntu"
 | |
| )
 | |
| 
 | |
| func FetchImages(c *cli.Context) error {
 | |
| 	if c.NArg() > 0 {
 | |
| 		if err := cli.ShowSubcommandHelp(c); err != nil {
 | |
| 			return cli.NewExitError(err.Error(), 1)
 | |
| 		}
 | |
| 		return cli.NewExitError("", 1)
 | |
| 	}
 | |
| 
 | |
| 	metadata, err := GenerateMetadata(c)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	buildConfig, err := config.GetBuildConfig(metadata.ReleaseMode.Mode)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	cfg := docker.Config{
 | |
| 		Archs:        buildConfig.Docker.Architectures,
 | |
| 		Distribution: buildConfig.Docker.Distribution,
 | |
| 		Bucket:       buildConfig.Docker.PrereleaseBucket,
 | |
| 		Edition:      c.String("edition"),
 | |
| 		Tag:          metadata.GrafanaVersion,
 | |
| 	}
 | |
| 
 | |
| 	edition := fmt.Sprintf("-%s", cfg.Edition)
 | |
| 
 | |
| 	err = gcloud.ActivateServiceAccount()
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	var basesStr []string
 | |
| 	for _, base := range cfg.Distribution {
 | |
| 		switch base {
 | |
| 		case alpine:
 | |
| 			basesStr = append(basesStr, "")
 | |
| 		case ubuntu:
 | |
| 			basesStr = append(basesStr, "-ubuntu")
 | |
| 		default:
 | |
| 			return fmt.Errorf("unrecognized base %q", base)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	err = downloadFromGCS(cfg, basesStr, edition)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	err = loadImages(cfg, basesStr, edition)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func loadImages(cfg docker.Config, basesStr []string, edition string) error {
 | |
| 	log.Println("Loading fetched image files to local docker registry...")
 | |
| 	log.Printf("Number of images to be loaded: %d\n", len(basesStr)*len(cfg.Archs))
 | |
| 	for _, base := range basesStr {
 | |
| 		for _, arch := range cfg.Archs {
 | |
| 			imageFilename := fmt.Sprintf("grafana%s-%s%s-%s.img", edition, cfg.Tag, base, arch)
 | |
| 			log.Printf("image file name: %s\n", imageFilename)
 | |
| 			//nolint:gosec
 | |
| 			cmd := exec.Command("docker", "load", "-i", imageFilename)
 | |
| 			cmd.Dir = "."
 | |
| 			out, err := cmd.CombinedOutput()
 | |
| 			if err != nil {
 | |
| 				log.Printf("out: %s\n", out)
 | |
| 				return fmt.Errorf("error loading image: %q", err)
 | |
| 			}
 | |
| 			log.Printf("Successfully loaded %s!\n %s\n", fmt.Sprintf("grafana%s-%s%s-%s", edition, cfg.Tag, base, arch), out)
 | |
| 		}
 | |
| 	}
 | |
| 	log.Println("Images successfully loaded!")
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func downloadFromGCS(cfg docker.Config, basesStr []string, edition string) error {
 | |
| 	log.Printf("Downloading Docker images from GCS bucket: %s\n", cfg.Bucket)
 | |
| 
 | |
| 	for _, base := range basesStr {
 | |
| 		for _, arch := range cfg.Archs {
 | |
| 			src := fmt.Sprintf("gs://%s/%s/grafana%s-%s%s-%s.img", cfg.Bucket, cfg.Tag, edition, cfg.Tag, base, arch)
 | |
| 			args := strings.Split(fmt.Sprintf("-m cp -r %s .", src), " ")
 | |
| 			//nolint:gosec
 | |
| 			cmd := exec.Command("gsutil", args...)
 | |
| 			out, err := cmd.CombinedOutput()
 | |
| 			if err != nil {
 | |
| 				return fmt.Errorf("failed to download: %w\n%s", err, out)
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	log.Printf("Successfully fetched image files from %s bucket!\n", cfg.Bucket)
 | |
| 	return nil
 | |
| }
 |