get_buildpack.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package gitinstallation
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "sync"
  7. "github.com/google/go-github/v41/github"
  8. "github.com/porter-dev/porter/api/server/authz"
  9. "github.com/porter-dev/porter/api/server/handlers"
  10. "github.com/porter-dev/porter/api/server/shared"
  11. "github.com/porter-dev/porter/api/server/shared/apierrors"
  12. "github.com/porter-dev/porter/api/server/shared/commonutils"
  13. "github.com/porter-dev/porter/api/server/shared/config"
  14. "github.com/porter-dev/porter/api/types"
  15. "github.com/porter-dev/porter/internal/integrations/buildpacks"
  16. )
  17. func initBuilderInfo() map[string]*buildpacks.BuilderInfo {
  18. builders := make(map[string]*buildpacks.BuilderInfo)
  19. builders[buildpacks.PaketoBuilder] = &buildpacks.BuilderInfo{
  20. Name: "Paketo",
  21. Builders: []string{
  22. "paketobuildpacks/builder:full",
  23. },
  24. }
  25. builders[buildpacks.HerokuBuilder] = &buildpacks.BuilderInfo{
  26. Name: "Heroku",
  27. Builders: []string{
  28. "heroku/builder-classic:22",
  29. "heroku/buildpacks:20",
  30. "heroku/buildpacks:18",
  31. },
  32. }
  33. return builders
  34. }
  35. type GithubGetBuildpackHandler struct {
  36. handlers.PorterHandlerReadWriter
  37. authz.KubernetesAgentGetter
  38. }
  39. func NewGithubGetBuildpackHandler(
  40. config *config.Config,
  41. decoderValidator shared.RequestDecoderValidator,
  42. writer shared.ResultWriter,
  43. ) *GithubGetBuildpackHandler {
  44. return &GithubGetBuildpackHandler{
  45. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  46. }
  47. }
  48. func (c *GithubGetBuildpackHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  49. request := &types.GetBuildpackRequest{}
  50. ok := c.DecodeAndValidate(w, r, request)
  51. if !ok {
  52. return
  53. }
  54. owner, name, ok := commonutils.GetOwnerAndNameParams(c, w, r)
  55. if !ok {
  56. return
  57. }
  58. branch, ok := commonutils.GetBranchParam(c, w, r)
  59. if !ok {
  60. return
  61. }
  62. client, err := GetGithubAppClientFromRequest(c.Config(), r)
  63. if err != nil {
  64. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  65. return
  66. }
  67. repoContentOptions := github.RepositoryContentGetOptions{}
  68. repoContentOptions.Ref = branch
  69. _, directoryContents, _, err := client.Repositories.GetContents(
  70. context.Background(),
  71. owner,
  72. name,
  73. request.Dir,
  74. &repoContentOptions,
  75. )
  76. if err != nil {
  77. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  78. return
  79. }
  80. builderInfoMap := initBuilderInfo()
  81. var wg sync.WaitGroup
  82. wg.Add(len(buildpacks.Runtimes))
  83. for i := range buildpacks.Runtimes {
  84. go func(idx int) {
  85. defer func() {
  86. if rec := recover(); rec != nil {
  87. c.HandleAPIError(w, r, apierrors.NewErrInternal(fmt.Errorf("panic detected in runtime detection")))
  88. return
  89. }
  90. }()
  91. buildpacks.Runtimes[idx].DetectGithub(
  92. client, directoryContents, owner, name, request.Dir, repoContentOptions,
  93. builderInfoMap[buildpacks.PaketoBuilder], builderInfoMap[buildpacks.HerokuBuilder],
  94. )
  95. wg.Done()
  96. }(i)
  97. }
  98. wg.Wait()
  99. // FIXME: add Java buildpacks
  100. builderInfoMap[buildpacks.PaketoBuilder].Others = append(builderInfoMap[buildpacks.PaketoBuilder].Others,
  101. buildpacks.BuildpackInfo{
  102. Name: "Java",
  103. Buildpack: "gcr.io/paketo-buildpacks/java",
  104. })
  105. builderInfoMap[buildpacks.HerokuBuilder].Others = append(builderInfoMap[buildpacks.HerokuBuilder].Others,
  106. buildpacks.BuildpackInfo{
  107. Name: "Java",
  108. Buildpack: "heroku/java",
  109. })
  110. var builders []*buildpacks.BuilderInfo
  111. for _, v := range builderInfoMap {
  112. builders = append(builders, v)
  113. }
  114. c.WriteResult(w, r, builders)
  115. }