diff --git a/internal/dagger/binaries/binaries.go b/internal/dagger/binaries/binaries.go index 92f96a08..a3a11b5a 100644 --- a/internal/dagger/binaries/binaries.go +++ b/internal/dagger/binaries/binaries.go @@ -12,6 +12,7 @@ import ( ) // Ghx returns a dagger file for the ghx binary. It'll return an error if the binary is not available. +// DEPRECATED: will be removed in the with followup commits func Ghx(ctx context.Context, client *dagger.Client, version string) (*dagger.File, error) { var file *dagger.File diff --git a/internal/dagger/tools/ghx.go b/internal/dagger/tools/ghx.go new file mode 100644 index 00000000..21d604d5 --- /dev/null +++ b/internal/dagger/tools/ghx.go @@ -0,0 +1,31 @@ +package tools + +import ( + "context" + "fmt" + + "dagger.io/dagger" + + "github.com/aweris/gale/internal/version" +) + +// Ghx returns a dagger file for the ghx binary. It'll return an error if the binary is not available. +func Ghx(ctx context.Context, client *dagger.Client) (*dagger.File, error) { + v := version.GetVersion() + + tag := v.GitVersion + + // If the tag is a dev tag, we'll use the main branch. + if tag == "v0.0.0-dev" { + tag = "main" + } + + file := client.Container().From("ghcr.io/aweris/gale/tools/ghx:" + tag).File("/ghx") + + // check, if the file doesn't exist or is empty + if size, err := file.Size(ctx); size == 0 || err != nil { + return nil, fmt.Errorf("ghx@%s binary not available", tag) + } + + return file, nil +} diff --git a/internal/mage/go.mod b/internal/mage/go.mod index bc562927..703a56e7 100644 --- a/internal/mage/go.mod +++ b/internal/mage/go.mod @@ -14,7 +14,7 @@ require ( github.com/adrg/xdg v0.4.0 // indirect github.com/iancoleman/strcase v0.2.0 // indirect github.com/stretchr/testify v1.8.3 // indirect - github.com/vektah/gqlparser/v2 v2.5.3 // indirect + github.com/vektah/gqlparser/v2 v2.5.6 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.9.0 // indirect golang.org/x/tools v0.10.0 // indirect diff --git a/internal/mage/go.sum b/internal/mage/go.sum index 39781a29..5fbd9846 100644 --- a/internal/mage/go.sum +++ b/internal/mage/go.sum @@ -30,8 +30,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/vektah/gqlparser/v2 v2.5.3 h1:goUwv4+blhtwR3GwefadPVI4ubYc/WZSypljWMQa6IE= -github.com/vektah/gqlparser/v2 v2.5.3/go.mod h1:z8xXUff237NntSuH8mLFijZ+1tjV1swDbpDqjJmk6ME= +github.com/vektah/gqlparser/v2 v2.5.6 h1:Ou14T0N1s191eRMZ1gARVqohcbe1e8FrcONScsq8cRU= golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= diff --git a/internal/mage/magefile.go b/internal/mage/magefile.go index 47c1b34d..4ced4feb 100644 --- a/internal/mage/magefile.go +++ b/internal/mage/magefile.go @@ -5,4 +5,7 @@ package main import ( //mage:import services _ "github.com/aweris/gale/internal/mage/services" + + //mage:import tools + _ "github.com/aweris/gale/internal/mage/tools" ) diff --git a/internal/mage/tools/ghx.go b/internal/mage/tools/ghx.go new file mode 100644 index 00000000..13b00f46 --- /dev/null +++ b/internal/mage/tools/ghx.go @@ -0,0 +1,53 @@ +package tools + +import ( + "context" + "fmt" + "os" + + "dagger.io/dagger" + + "golang.org/x/mod/semver" + + "github.com/magefile/mage/mg" + + "github.com/aweris/gale/internal/dagger/images" +) + +type Ghx mg.Namespace + +// Publish publishes the artifact service to ghcr.io/aweris/gale/services/artifact with the given version. +func (_ Ghx) Publish(ctx context.Context, version string) error { + if version != "main" { + if ok := semver.IsValid(version); !ok { + return fmt.Errorf("invalid semver tag: %s", version) + } + } + + image := fmt.Sprintf("ghcr.io/aweris/gale/tools/ghx:%s", version) + + client, err := dagger.Connect(ctx, dagger.WithLogOutput(os.Stdout)) + if err != nil { + return err + } + + file := images.GoBase(client). + WithMountedDirectory("/src", client.Host().Directory(".")). + WithWorkdir("/src/tools/ghx"). + WithEnvVariable("CGO_ENABLED", "0"). + WithExec([]string{"go", "build", "-o", "/src/out/ghx", "."}). + File("/src/out/ghx") + + addr, err := client.Container(). + From("gcr.io/distroless/static"). + WithFile("/ghx", file). + WithEntrypoint([]string{"/ghx"}). + Publish(ctx, image) + if err != nil { + return err + } + + fmt.Printf("Artifact service published to %s\n", addr) + + return nil +}