diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 53f005d..27fc7c6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -112,6 +112,7 @@ jobs: "terraform", "timezone", "vault-cli", + "waza", "zig" ] runs-on: ubuntu-latest diff --git a/build/build.go b/build/build.go index 1ead11a..24a61f6 100644 --- a/build/build.go +++ b/build/build.go @@ -218,6 +218,10 @@ func init() { gotaskr.Task("Feature:vault-cli:Package", func() error { return packageFeature("vault-cli") }) gotaskr.Task("Feature:vault-cli:Test", func() error { return testFeature("vault-cli") }) + ////////// waza + gotaskr.Task("Feature:waza:Package", func() error { return packageFeature("waza") }) + gotaskr.Task("Feature:waza:Test", func() error { return testFeature("waza") }) + ////////// zig gotaskr.Task("Feature:zig:Package", func() error { return packageFeature("zig") }) gotaskr.Task("Feature:zig:Test", func() error { return testFeature("zig") }) diff --git a/features/src/waza/devcontainer-feature.json b/features/src/waza/devcontainer-feature.json new file mode 100644 index 0000000..02f3aef --- /dev/null +++ b/features/src/waza/devcontainer-feature.json @@ -0,0 +1,28 @@ +{ + "id": "waza", + "version": "1.0.0", + "name": "Waza", + "description": "Installs Waza, the AI-powered development agent from Microsoft.", + "options": { + "version": { + "type": "string", + "proposals": [ + "latest", + "0.38.5" + ], + "default": "latest", + "description": "The version of Waza to install." + }, + "downloadUrl": { + "type": "string", + "default": "", + "proposals": [ + "https://mycompany.com/artifactory/github-releases-remote" + ], + "description": "The download URL to use for Waza binaries." + } + }, + "containerEnv": { + "WAZA_NO_UPDATE_CHECK": "1" + } +} diff --git a/features/src/waza/install.sh b/features/src/waza/install.sh new file mode 100644 index 0000000..13b2b54 --- /dev/null +++ b/features/src/waza/install.sh @@ -0,0 +1,5 @@ +. ./functions.sh + +"./installer_$(detect_arch)" \ + -version="${VERSION:-"latest"}" \ + -downloadUrl="${DOWNLOADURL:-""}" diff --git a/features/src/waza/installer.go b/features/src/waza/installer.go new file mode 100644 index 0000000..91e4165 --- /dev/null +++ b/features/src/waza/installer.go @@ -0,0 +1,91 @@ +package main + +import ( + "builder/installer" + "flag" + "fmt" + "os" + "regexp" + + "github.com/roemer/gover" +) + +////////// +// Configuration +////////// + +var versionRegex *regexp.Regexp = regexp.MustCompile(`(?m)^v(?P(\d+)\.(\d+)\.(\d+))$`) + +////////// +// Main +////////// + +func main() { + if err := runMain(); err != nil { + fmt.Printf("Error: %v\n", err) + os.Exit(1) + } +} + +func runMain() error { + // Handle the flags + version := flag.String("version", "latest", "") + downloadUrl := flag.String("downloadUrl", "", "") + flag.Parse() + + // Load settings from an external file + if err := installer.LoadOverrides(); err != nil { + return err + } + + // Apply override logic for URLs + installer.HandleGitHubOverride(downloadUrl, "microsoft/waza", "waza-download-url") + + // Create and process the feature + feature := installer.NewFeature("Waza", false, + &wazaComponent{ + ComponentBase: installer.NewComponentBase("Waza", *version), + DownloadUrl: *downloadUrl, + }) + return feature.Process() +} + +////////// +// Implementation +////////// + +type wazaComponent struct { + *installer.ComponentBase + DownloadUrl string +} + +func (c *wazaComponent) GetAllVersions() ([]*gover.Version, error) { + tags, err := installer.Tools.GitHub.GetTags("microsoft", "waza") + if err != nil { + return nil, err + } + return installer.Tools.Versioning.ParseVersionsFromList(tags, versionRegex, true) +} + +func (c *wazaComponent) InstallVersion(version *gover.Version) error { + archPart, err := installer.Tools.System.MapArchitecture(map[string]string{ + installer.AMD64: "amd64", + installer.ARM64: "arm64", + }) + if err != nil { + return err + } + // Download the binary directly (no archive) + fileName := fmt.Sprintf("waza-linux-%s", archPart) + downloadUrl, err := installer.Tools.Http.BuildUrl(c.DownloadUrl, "v"+version.Raw, fileName) + if err != nil { + return err + } + downloadErr := installer.Tools.Download.ToFile(downloadUrl, fileName, "waza") + defer os.Remove(fileName) + if downloadErr != nil { + return downloadErr + } + // Install the binary + return installer.Tools.System.InstallBinaryToUsrLocalBin(fileName, "waza") +} diff --git a/features/test/waza/install.sh b/features/test/waza/install.sh new file mode 100644 index 0000000..3cd3324 --- /dev/null +++ b/features/test/waza/install.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -e + +[[ -f "$(dirname "$0")/../functions.sh" ]] && source "$(dirname "$0")/../functions.sh" +[[ -f "$(dirname "$0")/functions.sh" ]] && source "$(dirname "$0")/functions.sh" + +check_file_exists "/usr/local/bin/waza" +check_version "$(waza --version 2>&1)" "0.38.5" diff --git a/features/test/waza/scenarios.json b/features/test/waza/scenarios.json new file mode 100644 index 0000000..146f286 --- /dev/null +++ b/features/test/waza/scenarios.json @@ -0,0 +1,12 @@ +{ + "install": { + "build": { + "dockerfile": "Dockerfile" + }, + "features": { + "./waza": { + "version": "0.38.5" + } + } + } +} diff --git a/features/test/waza/test-images.json b/features/test/waza/test-images.json new file mode 100644 index 0000000..7e091f0 --- /dev/null +++ b/features/test/waza/test-images.json @@ -0,0 +1,6 @@ +[ + "mcr.microsoft.com/devcontainers/base:debian12", + "mcr.microsoft.com/devcontainers/base:debian13", + "mcr.microsoft.com/devcontainers/base:ubuntu24.04", + "mcr.microsoft.com/devcontainers/base:ubuntu26.04" +] diff --git a/override-all.env b/override-all.env index fcaee5e..ea151d2 100644 --- a/override-all.env +++ b/override-all.env @@ -102,6 +102,9 @@ TERRAFORM_VERSIONS_URL="" VAULT_CLI_DOWNLOAD_URL="" VAULT_CLI_VERSIONS_URL="" +# waza +WAZA_DOWNLOAD_URL="" + # zig ZIG_DOWNLOAD_URL="" ZIG_VERSIONS_URL=""