Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .github/workflows/issue-classifier.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions .github/workflows/release.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .github/workflows/stale-repo-identifier.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .github/workflows/super-linter.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 12 additions & 14 deletions pkg/workflow/action_mode.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,13 @@ func (m ActionMode) UsesExternalActions() bool {
return true
}

// DetectActionMode determines the appropriate action mode based on environment and version.
// Returns ActionModeRelease if the binary version is a release tag,
// otherwise returns ActionModeDev as the default.
// Can be overridden with GH_AW_ACTION_MODE environment variable.
// If version parameter is provided, it will be used to determine release mode.
// Never uses dirty SHA - only clean version tags or dev mode with local paths.
// DetectActionMode determines the appropriate action mode based on the release flag.
// Returns ActionModeRelease if this binary was built as a release (controlled by the
// isReleaseBuild flag set via -X linker flag at build time), otherwise returns ActionModeDev.
// Can be overridden with GH_AW_ACTION_MODE environment variable or GitHub Actions context.
// The version parameter is kept for backward compatibility but is no longer used for detection.
func DetectActionMode(version string) ActionMode {
actionModeLog.Printf("Detecting action mode: version=%s", version)
actionModeLog.Printf("Detecting action mode: version=%s, isRelease=%v", version, IsRelease())

// Check for explicit override via environment variable
if envMode := os.Getenv("GH_AW_ACTION_MODE"); envMode != "" {
Expand All @@ -64,11 +63,10 @@ func DetectActionMode(version string) ActionMode {
actionModeLog.Printf("Invalid action mode in environment: %s, falling back to auto-detection", envMode)
}

// Check if version indicates a release build
// Release tags are clean version strings (not "dev", not empty, no "-dirty" suffix, and start with "v")
if version != "" && version != "dev" && !strings.Contains(version, "-dirty") && strings.HasPrefix(version, "v") {
// Version is a clean release tag, use release mode
actionModeLog.Printf("Detected release mode from binary version: %s", version)
// Check if this binary was built as a release using the release flag
// This flag is set at build time via -X linker flag and does not rely on version string heuristics
if IsRelease() {
actionModeLog.Printf("Detected release mode from build flag (isReleaseBuild=true)")
return ActionModeRelease
}

Expand All @@ -92,7 +90,7 @@ func DetectActionMode(version string) ActionMode {
// 1. Running on a PR (refs/pull/*)
// 2. Running locally (no GITHUB_REF)
// 3. Running on any other branch (including main)
// 4. Version is "dev" or empty
actionModeLog.Printf("Detected dev mode (default): version=%s, ref=%s", version, githubRef)
// 4. Non-release builds (isReleaseBuild=false)
actionModeLog.Printf("Detected dev mode (default): isRelease=%v, ref=%s", IsRelease(), githubRef)
return ActionModeDev
}
114 changes: 114 additions & 0 deletions pkg/workflow/compiler_action_mode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,120 @@ func TestActionModeReleaseValidation(t *testing.T) {
}
}

// TestActionModeDetectionWithReleaseFlag tests that DetectActionMode uses the release flag
func TestActionModeDetectionWithReleaseFlag(t *testing.T) {
tests := []struct {
name string
isRelease bool
githubRef string
githubEvent string
envOverride string
expectedMode ActionMode
description string
}{
{
name: "release flag true",
isRelease: true,
githubRef: "",
githubEvent: "",
expectedMode: ActionModeRelease,
description: "Release flag set to true should use release mode",
},
{
name: "release flag false",
isRelease: false,
githubRef: "",
githubEvent: "",
expectedMode: ActionModeDev,
description: "Release flag set to false should use dev mode",
},
{
name: "release flag true with main branch",
isRelease: true,
githubRef: "refs/heads/main",
githubEvent: "push",
expectedMode: ActionModeRelease,
description: "Release flag should take precedence over branch",
},
{
name: "release flag false with release tag",
isRelease: false,
githubRef: "refs/tags/v1.0.0",
githubEvent: "push",
expectedMode: ActionModeRelease,
description: "GitHub release tag should still work when release flag is false",
},
{
name: "env override with release flag",
isRelease: true,
githubRef: "",
githubEvent: "",
envOverride: "dev",
expectedMode: ActionModeDev,
description: "Environment variable should override release flag",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Save original environment and release flag
origRef := os.Getenv("GITHUB_REF")
origEvent := os.Getenv("GITHUB_EVENT_NAME")
origMode := os.Getenv("GH_AW_ACTION_MODE")
origRelease := IsRelease()

defer func() {
// Restore environment variables
if origRef != "" {
os.Setenv("GITHUB_REF", origRef)
} else {
os.Unsetenv("GITHUB_REF")
}
if origEvent != "" {
os.Setenv("GITHUB_EVENT_NAME", origEvent)
} else {
os.Unsetenv("GITHUB_EVENT_NAME")
}
if origMode != "" {
os.Setenv("GH_AW_ACTION_MODE", origMode)
} else {
os.Unsetenv("GH_AW_ACTION_MODE")
}
// Restore release flag
SetIsRelease(origRelease)
}()

// Set test environment
if tt.githubRef != "" {
os.Setenv("GITHUB_REF", tt.githubRef)
} else {
os.Unsetenv("GITHUB_REF")
}

if tt.githubEvent != "" {
os.Setenv("GITHUB_EVENT_NAME", tt.githubEvent)
} else {
os.Unsetenv("GITHUB_EVENT_NAME")
}

if tt.envOverride != "" {
os.Setenv("GH_AW_ACTION_MODE", tt.envOverride)
} else {
os.Unsetenv("GH_AW_ACTION_MODE")
}

// Set release flag
SetIsRelease(tt.isRelease)

// Test detection (version parameter is ignored now)
mode := DetectActionMode("ignored-version")
if mode != tt.expectedMode {
t.Errorf("%s: expected mode %s, got %s", tt.description, tt.expectedMode, mode)
}
})
}
}

// TestReleaseModeCompilation tests workflow compilation in release mode
// Note: This test uses create_issue which already has ScriptName set.
// Other safe outputs (add_labels, etc.) don't have ScriptName yet and will use inline mode.
Expand Down