Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ability to generate buildkite pipelines from integration testing framework #5391

Merged
merged 32 commits into from
Sep 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
e9548d6
Working on buildkite integration runner.
blakerouse Aug 30, 2024
3eadef2
Use correct image for upload pipeline.
blakerouse Aug 31, 2024
bbcd41c
Output pipeline for debug.
blakerouse Aug 31, 2024
d77c35b
Merge branch 'main' into integration-buildkite
blakerouse Sep 10, 2024
07b355b
Use script to perform pipeline work.
blakerouse Sep 10, 2024
9e6d99d
Remove todo code.
blakerouse Sep 10, 2024
ad8e658
Merge remote-tracking branch 'upstream/main' into integration-buildkite
blakerouse Sep 13, 2024
8296324
Fix YAML structure.
blakerouse Sep 13, 2024
9eaecd2
Top-level steps.
blakerouse Sep 16, 2024
f9ae937
Make agents an array.
blakerouse Sep 16, 2024
73b86c2
Try YAML v3.
blakerouse Sep 16, 2024
9e7fc99
Switch to JSON.
blakerouse Sep 16, 2024
50878e6
Add json struct tags.
blakerouse Sep 16, 2024
9ccdb9b
Revert JSON and add debug
pazone Sep 17, 2024
dd735d6
Renamed the yaml file
pazone Sep 17, 2024
b4727c1
Direct pipe upload
pazone Sep 17, 2024
b9cd6bb
Direct pipe upload
pazone Sep 17, 2024
22ed6d4
Direct file output from go
pazone Sep 17, 2024
5c4fd37
Merge remote-tracking branch 'origin/integration-buildkite' into inte…
blakerouse Sep 19, 2024
5d93a99
Cleanups.
blakerouse Sep 20, 2024
cee4744
mage check
blakerouse Sep 20, 2024
53d6f66
Merge remote-tracking branch 'upstream/main' into integration-buildkite
blakerouse Sep 20, 2024
e847415
Cleanup for merge.
blakerouse Sep 20, 2024
f5650f8
Refactor all of pkg/testing.
blakerouse Sep 20, 2024
8a1d146
Merge remote-tracking branch 'upstream/main' into integration-buildkite
blakerouse Sep 20, 2024
73f921a
Rename.
blakerouse Sep 20, 2024
4689f18
Cleanup imports.
blakerouse Sep 20, 2024
9cb959d
Fix bad merge.
blakerouse Sep 20, 2024
d96f51a
Merge remote-tracking branch 'upstream/main' into integration-buildkite
blakerouse Sep 24, 2024
3ce2196
Fix licensing and imports.
blakerouse Sep 24, 2024
26c72ac
Merge branch 'main' into integration-buildkite
blakerouse Sep 27, 2024
40006ae
Merge branch 'main' into integration-buildkite
blakerouse Sep 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 79 additions & 17 deletions magefile.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ import (
"github.com/elastic/elastic-agent/dev-tools/mage/downloads"
"github.com/elastic/elastic-agent/dev-tools/mage/manifest"
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/artifact/download"
"github.com/elastic/elastic-agent/pkg/testing/buildkite"
tcommon "github.com/elastic/elastic-agent/pkg/testing/common"
"github.com/elastic/elastic-agent/pkg/testing/define"
"github.com/elastic/elastic-agent/pkg/testing/ess"
"github.com/elastic/elastic-agent/pkg/testing/kubernetes/kind"
Expand Down Expand Up @@ -2134,12 +2136,12 @@ func askForVM() (runner.StateInstance, error) {
return instances[id], nil
}

func askForStack() (runner.Stack, error) {
func askForStack() (tcommon.Stack, error) {
mg.Deps(Integration.Stacks)

state, err := readFrameworkState()
if err != nil {
return runner.Stack{}, fmt.Errorf("could not read state file: %w", err)
return tcommon.Stack{}, fmt.Errorf("could not read state file: %w", err)
}

if len(state.Stacks) == 1 {
Expand All @@ -2150,17 +2152,17 @@ func askForStack() (runner.Stack, error) {
id := 0
fmt.Print("Stack number: ")
if _, err := fmt.Scanf("%d", &id); err != nil {
return runner.Stack{}, fmt.Errorf("cannot read Stack number: %w", err)
return tcommon.Stack{}, fmt.Errorf("cannot read Stack number: %w", err)
}

if id >= len(state.Stacks) {
return runner.Stack{}, fmt.Errorf("Invalid Stack number, it must be between 0 and %d", len(state.Stacks)-1)
return tcommon.Stack{}, fmt.Errorf("Invalid Stack number, it must be between 0 and %d", len(state.Stacks)-1)
}

return state.Stacks[id], nil
}

func generateEnvFile(stack runner.Stack) error {
func generateEnvFile(stack tcommon.Stack) error {
fileExists := true
stat, err := os.Stat("./env.sh")
if err != nil {
Expand Down Expand Up @@ -2471,6 +2473,57 @@ func (Integration) TestOnRemote(ctx context.Context) error {
return nil
}

func (Integration) Buildkite() error {
goTestFlags := os.Getenv("GOTEST_FLAGS")
batches, err := define.DetermineBatches("testing/integration", goTestFlags, "integration")
if err != nil {
return fmt.Errorf("failed to determine batches: %w", err)
}
agentVersion, agentStackVersion, err := getTestRunnerVersions()
if err != nil {
return fmt.Errorf("failed to get agent versions: %w", err)
}
goVersion, err := mage.DefaultBeatBuildVariableSources.GetGoVersion()
if err != nil {
return fmt.Errorf("failed to get go versions: %w", err)
}

cfg := tcommon.Config{
AgentVersion: agentVersion,
StackVersion: agentStackVersion,
GOVersion: goVersion,
Platforms: testPlatforms(),
Packages: testPackages(),
Groups: testGroups(),
Matrix: false,
VerboseMode: mg.Verbose(),
TestFlags: goTestFlags,
}

steps, err := buildkite.GenerateSteps(cfg, batches...)
if err != nil {
return fmt.Errorf("error generating buildkite steps: %w", err)
}

// write output to steps.yaml
cwd, err := os.Getwd()
if err != nil {
return fmt.Errorf("error getting current working directory: %w", err)
}
ymlFilePath := filepath.Join(cwd, "steps.yml")
file, err := os.Create(ymlFilePath)
if err != nil {
return fmt.Errorf("error creating file: %w", err)
}
defer file.Close()
if _, err := file.WriteString(steps); err != nil {
return fmt.Errorf("error writing to file: %w", err)
}

fmt.Printf(">>> Generated buildkite steps written to: %s\n", ymlFilePath)
return nil
}

func integRunner(ctx context.Context, matrix bool, singleTest string) error {
if _, ok := ctx.Deadline(); !ok {
// If the context doesn't have a timeout (usually via the mage -t option), give it one.
Expand Down Expand Up @@ -2541,18 +2594,14 @@ func integRunnerOnce(ctx context.Context, matrix bool, singleTest string) (int,
return results.Failures, nil
}

func createTestRunner(matrix bool, singleTest string, goTestFlags string, batches ...define.Batch) (*runner.Runner, error) {
goVersion, err := mage.DefaultBeatBuildVariableSources.GetGoVersion()
if err != nil {
return nil, err
}

func getTestRunnerVersions() (string, string, error) {
var err error
agentStackVersion := os.Getenv("AGENT_STACK_VERSION")
agentVersion := os.Getenv("AGENT_VERSION")
if agentVersion == "" {
agentVersion, err = mage.DefaultBeatBuildVariableSources.GetBeatVersion()
if err != nil {
return nil, err
return "", "", err
}
if agentStackVersion == "" {
// always use snapshot for stack version
Expand All @@ -2568,6 +2617,21 @@ func createTestRunner(matrix bool, singleTest string, goTestFlags string, batche
if agentStackVersion == "" {
agentStackVersion = agentVersion
}

return agentVersion, agentStackVersion, nil
}

func createTestRunner(matrix bool, singleTest string, goTestFlags string, batches ...define.Batch) (*runner.Runner, error) {
goVersion, err := mage.DefaultBeatBuildVariableSources.GetGoVersion()
if err != nil {
return nil, err
}

agentVersion, agentStackVersion, err := getTestRunnerVersions()
if err != nil {
return nil, err
}

agentBuildDir := os.Getenv("AGENT_BUILD_DIR")
if agentBuildDir == "" {
agentBuildDir = filepath.Join("build", "distributions")
Expand Down Expand Up @@ -2606,7 +2670,7 @@ func createTestRunner(matrix bool, singleTest string, goTestFlags string, batche
Datacenter: datacenter,
}

var instanceProvisioner runner.InstanceProvisioner
var instanceProvisioner tcommon.InstanceProvisioner
instanceProvisionerMode := os.Getenv("INSTANCE_PROVISIONER")
switch instanceProvisionerMode {
case "", ogc.Name:
Expand All @@ -2619,7 +2683,6 @@ func createTestRunner(matrix bool, singleTest string, goTestFlags string, batche
default:
return nil, fmt.Errorf("INSTANCE_PROVISIONER environment variable must be one of 'ogc' or 'multipass', not %s", instanceProvisionerMode)
}
fmt.Printf(">>>> Using %s instance provisioner\n", instanceProvisionerMode)

email, err := ogcCfg.ClientEmail()
if err != nil {
Expand All @@ -2632,7 +2695,7 @@ func createTestRunner(matrix bool, singleTest string, goTestFlags string, batche
Region: essRegion,
}

var stackProvisioner runner.StackProvisioner
var stackProvisioner tcommon.StackProvisioner
stackProvisionerMode := os.Getenv("STACK_PROVISIONER")
switch stackProvisionerMode {
case "", ess.ProvisionerStateful:
Expand All @@ -2654,7 +2717,6 @@ func createTestRunner(matrix bool, singleTest string, goTestFlags string, batche
ess.ProvisionerServerless,
stackProvisionerMode)
}
fmt.Printf(">>>> Using %s stack provisioner\n", stackProvisionerMode)

timestamp := timestampEnabled()

Expand Down Expand Up @@ -2684,7 +2746,7 @@ func createTestRunner(matrix bool, singleTest string, goTestFlags string, batche
diagDir := filepath.Join("build", "diagnostics")
_ = os.MkdirAll(diagDir, 0755)

cfg := runner.Config{
cfg := tcommon.Config{
AgentVersion: agentVersion,
StackVersion: agentStackVersion,
BuildDir: agentBuildDir,
Expand Down
Loading