main.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "os"
  7. "text/template"
  8. "github.com/google/go-github/v50/github"
  9. "golang.org/x/oauth2"
  10. )
  11. var (
  12. ghClient *github.Client
  13. )
  14. type Tag struct {
  15. TagName string
  16. }
  17. func getLatestCLIRelease() (string, error) {
  18. rel, _, err := ghClient.Repositories.GetLatestRelease(context.Background(), "porter-dev", "porter")
  19. if err != nil {
  20. return "", err
  21. }
  22. return rel.GetTagName(), nil
  23. }
  24. func serve(w http.ResponseWriter, req *http.Request) {
  25. latestTag, err := getLatestCLIRelease()
  26. if err != nil {
  27. fmt.Fprintf(os.Stderr, "error getting latest release: %v\n", err)
  28. w.WriteHeader(http.StatusInternalServerError)
  29. return
  30. }
  31. contents, err := os.ReadFile("install.sh")
  32. if err != nil {
  33. fmt.Fprintf(os.Stderr, "error reading install.sh file: %v\n", err)
  34. w.WriteHeader(http.StatusInternalServerError)
  35. return
  36. }
  37. tmpl, err := template.New("install").Parse(string(contents))
  38. if err != nil {
  39. fmt.Fprintf(os.Stderr, "error parsing install.sh template: %v\n", err)
  40. w.WriteHeader(http.StatusInternalServerError)
  41. return
  42. }
  43. err = tmpl.Execute(w, Tag{TagName: latestTag})
  44. if err != nil {
  45. fmt.Fprintf(os.Stderr, "error executing install.sh template: %v\n", err)
  46. w.WriteHeader(http.StatusInternalServerError)
  47. } else {
  48. w.Header().Add("Content-Type", "text/plain")
  49. }
  50. }
  51. func main() {
  52. ghAccessToken := os.Getenv("GH_ACCESS_TOKEN")
  53. if ghAccessToken == "" {
  54. fmt.Fprintf(os.Stderr, "GH_ACCESS_TOKEN not set\n")
  55. return
  56. }
  57. ghClient = github.NewClient(oauth2.NewClient(context.Background(), oauth2.StaticTokenSource(
  58. &oauth2.Token{AccessToken: ghAccessToken},
  59. )))
  60. var port string
  61. if port = os.Getenv("PORT"); port == "" {
  62. port = "80"
  63. }
  64. http.HandleFunc("/", serve)
  65. if err := http.ListenAndServe(fmt.Sprintf(":%s", port), nil); err != nil {
  66. fmt.Fprintf(os.Stderr, "error starting server: %v\n", err)
  67. }
  68. }