package main import ( "bufio" "context" "fmt" "log" "os" "secretsmanager/config" "secretsmanager/secretsmanager" "sort" "strings" "github.com/caarlos0/env/v11" "github.com/joho/godotenv" ) func main() { err := godotenv.Load() if err != nil { log.Println(".env file not found, using regular environment variables") } ctx := context.TODO() var cfg config.Config err = env.Parse(&cfg) if err != nil { log.Fatalf("Error parsing environment variables %s", err) } cfg = config.ValidateConfig(cfg) s, err := secretsmanager.New(ctx, cfg) if err != nil { log.Fatalf("Error initializing secrets manager client: %s", err) } data, err := s.GetSecrets(ctx, cfg) if err != nil { log.Fatalf("Error retrieving secrets: %s", err) } err = exportToPipeline(data) if err != nil { log.Fatalf("error exporting secret to pipeline: %s", err) } } 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_WRONLY, 0644) if err != nil { return fmt.Errorf("error opening GITHUB_OUTPUT: %w", err) } defer f.Close() w := bufio.NewWriter(f) keys := make([]string, 0, len(data)) for k := range data { keys = append(keys, k) } sort.Strings(keys) for _, key := range keys { value := data[key] 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) } } err = w.Flush() if err != nil { return err } return nil }