magefile.go (182 lines of code) (raw):

// Licensed to Elasticsearch B.V. under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Elasticsearch B.V. licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. //go:build mage // +build mage package main import ( "context" "fmt" "os" "runtime" "github.com/common-nighthawk/go-figure" "github.com/fatih/color" "github.com/magefile/mage/mg" "github.com/magefile/mage/sh" "github.com/elastic/harp/build/artifact" "github.com/elastic/harp/build/mage/docker" "github.com/elastic/harp/build/mage/git" "github.com/elastic/harp/build/mage/golang" "github.com/elastic/harp/build/mage/release" ) // ----------------------------------------------------------------------------- type Code mg.Namespace // Lint code using golangci-lint. func (Code) Lint() { mg.Deps(Code.Format) color.Red("## Lint source") mg.Deps(golang.Lint(".")) } // Format source code and process imports. func (Code) Format() { color.Red("## Formatting all sources") mg.SerialDeps(golang.Format, golang.Import) } // Licenser apply copyright banner to source code. func (Code) Licenser() error { mg.SerialDeps(golang.Format, golang.Import) color.Red("## Add license banner") return sh.RunV("go-licenser") } // Generate SDK code (mocks, tests, etc.) func (Code) Generate() { color.Cyan("## Generate code") mg.SerialDeps( func() error { return golang.Generate("SDK", "github.com/elastic/harp/pkg/...")() }, ) } // ----------------------------------------------------------------------------- type API mg.Namespace // Generate protobuf objects from proto definitions. func (API) Generate() error { color.Blue("### Regenerate API") if err := sh.RunV("task", "-d", "api"); err != nil { return err } mg.SerialDeps(Code.Licenser) return nil } // ----------------------------------------------------------------------------- var Default = Build var ( harpCli = &artifact.Command{ Package: "github.com/elastic/harp", Name: "Harp", Description: "Secret management toolchain", } ) // Build harp executable. func Build() error { banner := figure.NewFigure("Harpocrates", "", true) banner.Print() fmt.Println("") color.Red("# Build Info ---------------------------------------------------------------") fmt.Printf("Go version : %s\n", runtime.Version()) version, err := git.TagMatch("cmd/harp/v*") if err != nil { return err } fmt.Printf("Git tag : %s\n", version) color.Red("# Pipeline -----------------------------------------------------------------") mg.SerialDeps(golang.Vendor, golang.License("."), Code.Generate, golang.Lint("."), Test.Unit) color.Red("# Artifact(s) --------------------------------------------------------------") mg.Deps(Compile) // No error return nil } type Test mg.Namespace // Test harp application. func (Test) Unit() { color.Cyan("## Unit Tests") mg.SerialDeps( func() error { return golang.UnitTest("github.com/elastic/harp/pkg/...")() }, func() error { return golang.UnitTest("github.com/elastic/harp/cmd/harp/...")() }, ) } // Test harp application. func (Test) CLI() { color.Cyan("## CLI Tests") fmt.Printf("cmd Test disabled\n") mg.SerialDeps( func() error { return nil }, ) } // Compile harp code to create an executable. func Compile() error { // Extract git version version, err := git.TagMatch("cmd/harp/v*") if err != nil { return err } // Build artifact return golang.Build("harp", "github.com/elastic/harp/cmd/harp", version)() } // Release harp version and cross-compile code to produce all artifacts. // RELEASE environment variable must be set to matching git tag. func Release(ctx context.Context) error { color.Red(fmt.Sprintf("# Releasing (%s) ---------------------------------------------------", os.Getenv("RELEASE"))) // Extract git version version, err := git.TagMatch("cmd/harp/v*") if err != nil { return err } color.Cyan("## Cross compiling artifact") mg.CtxDeps(ctx, func() error { return golang.Release( "harp", "github.com/elastic/harp/cmd/harp", version, golang.GOOS("darwin"), golang.GOARCH("amd64"), )() }, func() error { return golang.Release( "harp", "github.com/elastic/harp/cmd/harp", version, golang.GOOS("darwin"), golang.GOARCH("arm64"), )() }, func() error { return golang.Release( "harp", "github.com/elastic/harp/cmd/harp", version, golang.GOOS("linux"), golang.GOARCH("amd64"), )() }, func() error { return golang.Release( "harp", "github.com/elastic/harp/cmd/harp", version, golang.GOOS("linux"), golang.GOARCH("arm"), golang.GOARM("7"), )() }, func() error { return golang.Release( "harp", "github.com/elastic/harp/cmd/harp", version, golang.GOOS("linux"), golang.GOARCH("arm64"), )() }, func() error { return golang.Release( "harp", "github.com/elastic/harp/cmd/harp", version, golang.GOOS("windows"), golang.GOARCH("amd64"), )() }, func() error { return golang.Release( "harp", "github.com/elastic/harp/cmd/harp", version, golang.GOOS("windows"), golang.GOARCH("arm64"), )() }, ) return ctx.Err() } // Homebrew generates homebrew formula from compiled artifacts. func Homebrew() error { return release.HomebrewFormula(harpCli)() } // ----------------------------------------------------------------------------- type Docker mg.Namespace // Tools prepares docker images with go toolchain and project tools. func (Docker) Tools() error { return docker.Tools() } // Harp build harp docker image func (Docker) Harp() error { return docker.Build(harpCli)() } // ----------------------------------------------------------------------------- type Releaser mg.Namespace // Harp releases harp artifacts using docker pipeline. func (Releaser) Harp() error { return docker.Release(harpCli)() }