2
0

main.go 1.8 KB

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