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
46 changes: 22 additions & 24 deletions pkg/cli/actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ var actionsLog = logger.New("cli:actions")
// convertToGitHubActionsEnv converts environment variables from shell syntax to GitHub Actions syntax
// Uses IsSecret field to determine between secrets.* and env.* syntax
// Leaves existing GitHub Actions syntax unchanged
func convertToGitHubActionsEnv(env any, envVarMetadata []EnvironmentVariable) map[string]string {
func convertToGitHubActionsEnv(env map[string]any, envVarMetadata []EnvironmentVariable) map[string]string {
actionsLog.Printf("Converting environment variables: metadata_count=%d", len(envVarMetadata))
result := make(map[string]string)

Expand All @@ -22,36 +22,34 @@ func convertToGitHubActionsEnv(env any, envVarMetadata []EnvironmentVariable) ma
envMetaMap[envVar.Name] = envVar
}

if envMap, ok := env.(map[string]any); ok {
convertedCount := 0
unchangedCount := 0
for key, value := range envMap {
if valueStr, ok := value.(string); ok {
// Only convert shell syntax ${TOKEN_NAME}, leave GitHub Actions syntax unchanged
if strings.HasPrefix(valueStr, "${") && strings.HasSuffix(valueStr, "}") && !strings.Contains(valueStr, "{{") {
tokenName := valueStr[2 : len(valueStr)-1] // Remove ${ and }

// Check if we have metadata for this environment variable
if envMeta, exists := envMetaMap[tokenName]; exists {
if envMeta.IsSecret {
result[key] = fmt.Sprintf("${{ secrets.%s }}", tokenName)
} else {
result[key] = fmt.Sprintf("${{ env.%s }}", tokenName)
}
} else {
// Default to secrets if no metadata found (backward compatibility)
convertedCount := 0
unchangedCount := 0
for key, value := range env {
if valueStr, ok := value.(string); ok {
// Only convert shell syntax ${TOKEN_NAME}, leave GitHub Actions syntax unchanged
if strings.HasPrefix(valueStr, "${") && strings.HasSuffix(valueStr, "}") && !strings.Contains(valueStr, "{{") {
tokenName := valueStr[2 : len(valueStr)-1] // Remove ${ and }

// Check if we have metadata for this environment variable
if envMeta, exists := envMetaMap[tokenName]; exists {
if envMeta.IsSecret {
result[key] = fmt.Sprintf("${{ secrets.%s }}", tokenName)
} else {
result[key] = fmt.Sprintf("${{ env.%s }}", tokenName)
}
convertedCount++
} else {
// Keep as-is if not shell syntax or already GitHub Actions syntax
result[key] = valueStr
unchangedCount++
// Default to secrets if no metadata found (backward compatibility)
result[key] = fmt.Sprintf("${{ secrets.%s }}", tokenName)
}
convertedCount++
} else {
// Keep as-is if not shell syntax or already GitHub Actions syntax
result[key] = valueStr
unchangedCount++
}
}
actionsLog.Printf("Environment variable conversion complete: converted=%d, unchanged=%d", convertedCount, unchangedCount)
}
actionsLog.Printf("Environment variable conversion complete: converted=%d, unchanged=%d", convertedCount, unchangedCount)

return result
}
10 changes: 1 addition & 9 deletions pkg/cli/actions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
func TestConvertToGitHubActionsEnv(t *testing.T) {
tests := []struct {
name string
input any
input map[string]any
envMetadata []EnvironmentVariable
expected map[string]string
}{
Expand Down Expand Up @@ -111,14 +111,6 @@ func TestConvertToGitHubActionsEnv(t *testing.T) {
"STRING_VAR": "${{ secrets.TOKEN }}",
},
},
{
name: "non-map input returns empty map",
input: []string{
"${API_TOKEN}",
},
envMetadata: []EnvironmentVariable{},
expected: map[string]string{},
},
{
name: "env variable not in metadata and key differs from token name",
input: map[string]any{
Expand Down
18 changes: 12 additions & 6 deletions pkg/cli/mcp_add.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,8 +196,10 @@ func createMCPToolConfig(server *MCPRegistryServerForProcessing, preferredTransp
mcpSection["container"] = containerStr

// Add environment variables for Docker container
if env, hasEnv := server.Config["env"]; hasEnv {
mcpSection["env"] = convertToGitHubActionsEnv(env, server.EnvironmentVariables)
if envRaw, hasEnv := server.Config["env"]; hasEnv {
if envMap, ok := envRaw.(map[string]any); ok {
mcpSection["env"] = convertToGitHubActionsEnv(envMap, server.EnvironmentVariables)
}
}
}
} else {
Expand All @@ -218,8 +220,10 @@ func createMCPToolConfig(server *MCPRegistryServerForProcessing, preferredTransp
}

// Add environment variables if present
if env, hasEnv := server.Config["env"]; hasEnv {
mcpSection["env"] = convertToGitHubActionsEnv(env, server.EnvironmentVariables)
if envRaw, hasEnv := server.Config["env"]; hasEnv {
if envMap, ok := envRaw.(map[string]any); ok {
mcpSection["env"] = convertToGitHubActionsEnv(envMap, server.EnvironmentVariables)
}
}
}
} else {
Expand Down Expand Up @@ -267,8 +271,10 @@ func createMCPToolConfig(server *MCPRegistryServerForProcessing, preferredTransp
}

// Add environment variables if present
if env, hasEnv := server.Config["env"]; hasEnv {
mcpSection["env"] = convertToGitHubActionsEnv(env, server.EnvironmentVariables)
if envRaw, hasEnv := server.Config["env"]; hasEnv {
if envMap, ok := envRaw.(map[string]any); ok {
mcpSection["env"] = convertToGitHubActionsEnv(envMap, server.EnvironmentVariables)
}
}
} else {
return nil, errors.New("docker transport requires configuration")
Expand Down
Loading