func Main()

in lib/notifiers/notifiers.go [184:295]


func Main(notifier Notifier) error {
	// TODO(ljr): Refactor/separate this flagged logic from the main logic via a Main/doMain refactor.
	ctx := context.Background()

	if !flag.Parsed() {
		flag.Parse()
	}
	if *smoketest {
		log.V(0).Infof("notifier smoketest: %T", notifier)
		return nil
	}

	if *setupCheck {
		log.V(2).Info("starting setup check")
		cfg, err := decodeConfig(os.Stdin)
		if err != nil {
			return fmt.Errorf("failed to decode YAML config from stdin: %w", err)
		}

		if out, err := yaml.Marshal(cfg); err != nil {
			log.Warningf("failed to re-encode config YAML: %v", err)
		} else {
			log.V(2).Infof("got re-encoded YAML from stdin:\n%s", string(out))
		}

		if err := validateConfig(cfg); err != nil {
			return fmt.Errorf("failed to validate config during setup check: %w", err)
		}

		br, err := newResolver(cfg)
		if err != nil {
			return fmt.Errorf("failed to create BindingResolver during setup check: %w", err)
		}

		if err := notifier.SetUp(ctx, cfg, "", new(setupCheckSecretGetter), br); err != nil {
			return fmt.Errorf("failed to run notifier.SetUp during setup check: %w", err)
		}

		log.V(2).Infof("setup check successful")
		return nil
	}

	cfgPath, ok := GetEnv("CONFIG_PATH")
	if !ok {
		return errors.New("expected CONFIG_PATH to be non-empty")
	}

	sc, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("failed to create new GCS client: %w", err)
	}
	defer sc.Close()

	smc, err := secretmanager.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("failed to create new SecretManager client: %w", err)
	}
	defer smc.Close()

	cfg, err := getGCSConfig(ctx, &actualGCSReaderFactory{sc}, cfgPath)
	if err != nil {
		return fmt.Errorf("failed to get config from GCS: %w", err)
	}

	if err := validateConfig(cfg); err != nil {
		return fmt.Errorf("got invalid config from path %q: %w", cfgPath, err)
	}
	log.V(2).Infof("got config from GCS (%q): %+v\n", cfgPath, cfg)

	tmpl, err := parseTemplate(ctx, cfg.Spec.Notification.Template, &actualGCSReaderFactory{sc})
	if err != nil {
		return fmt.Errorf("failed to parse template from notiifer spec %q: %w", cfg.Spec.Notification.Template, err)
	}

	sm := &actualSecretManager{client: smc}

	br, err := newResolver(cfg)
	if err != nil {
		return fmt.Errorf("failed to construct a binding resolver: %v", err)
	}

	if err := notifier.SetUp(ctx, cfg, tmpl, sm, br); err != nil {
		return fmt.Errorf("failed to call SetUp on notifier: %w", err)
	}

	_, ignoreBadMessages := GetEnv("IGNORE_BAD_MESSAGES")

	log.V(2).Infoln("starting HTTP server...")

	// Our Pub/Sub push receiver.
	http.HandleFunc("/", newReceiver(notifier, &receiverParams{ignoreBadMessages}))

	// An auxilliary, healthz-style receiver.
	// You can call this endpoint using the curl command here:
	// https://cloud.google.com/run/docs/triggering/https-request#creating_private_services.
	startTime := time.Now()
	http.HandleFunc("/helloz", func(w http.ResponseWriter, _ *http.Request) {
		fmt.Fprintf(w, "Greetings from a Google Cloud Build notifier: %T!\nStart Time: %s\nCurrent Time: %s\n",
			notifier, startTime.Format(time.RFC1123), time.Now().Format(time.RFC1123))
	})

	var port string
	if p, ok := GetEnv("PORT"); ok {
		port = p
	} else {
		log.Warningf("PORT environment variable was not present, using %s instead", defaultHTTPPort)
		port = defaultHTTPPort
	}

	// Block on the HTTP's health.
	return http.ListenAndServe(":"+port, nil)
}