From dbae38d88486268e96133cc217aa321509aae5dd Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 13 May 2026 13:04:55 +0200 Subject: [PATCH] fix: context handling --- main.go | 65 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/main.go b/main.go index c9b240f..d123136 100644 --- a/main.go +++ b/main.go @@ -1,14 +1,15 @@ package main import ( + "bufio" "context" "fmt" "log" "os" - "strings" - "secretsmanager/config" "secretsmanager/secretsmanager" + "sort" + "strings" "github.com/caarlos0/env/v11" "github.com/joho/godotenv" @@ -38,37 +39,65 @@ func main() { log.Fatalf("Error retrieving secrets: %s", err) } - for key, value := range data { - err = exportToPipeline(key, value) - if err != nil { - log.Fatalf("error exporting secret to pipeline: %s", err) - } + dataSorted, err := sortMap(data) + if err != nil { + log.Fatalf("Error sorting secrets: %s", err) + } + + err = exportToPipeline(dataSorted) + if err != nil { + log.Fatalf("error exporting secret to pipeline: %s", err) } } -func exportToPipeline(key string, value interface{}) error { +func sortMap(data map[string]interface{}) (map[string]interface{}, error) { + keys := make([]string, len(data)) + for k := range data { + keys = append(keys, k) + } + sort.Strings(keys) + result := make(map[string]interface{}) + for _, k := range keys { + result[k] = data[k] + } + return result, nil +} + +func exportToPipeline(data map[string]interface{}) error { outputFile := os.Getenv("GITHUB_OUTPUT") if outputFile == "" { return fmt.Errorf("env var GITHUB_OUTPUT not found (are we running in a pipeline?)") } - f, err := os.OpenFile(outputFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + f, err := os.OpenFile(outputFile, os.O_APPEND|os.O_WRONLY, 0644) if err != nil { return fmt.Errorf("error opening GITHUB_OUTPUT: %w", err) } defer f.Close() - var outputString string - if s, ok := value.(string); ok { - outputString = fmt.Sprintf("%s=%s\n", key, value) - if strings.Contains(s, "\n") { - delimiter := "EOF" - outputString = fmt.Sprintf("%s=<<%s\n%s\n%s\n", key, delimiter, value, delimiter) + w := bufio.NewWriter(f) + + for key, value := range data { + if key == "" || value == nil { + continue + } + var outputString string + outputString = fmt.Sprintf("%s=%v\n", key, value) + + if s, ok := value.(string); ok { + if strings.Contains(s, "\n") { + delimiter := "EOF" + outputString = fmt.Sprintf("%s=<<%s\n%s\n%s\n", key, delimiter, value, delimiter) + } + } + + if _, err := w.WriteString(outputString); err != nil { + return fmt.Errorf("failed writing to GITHUB_OUTPUT: %w", err) } } - - if _, err := f.WriteString(outputString); err != nil { - return fmt.Errorf("failed writing to GITHUB_OUTPUT: %w", err) + err = w.Flush() + if err != nil { + return err } return nil }