main.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package main
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "os"
  6. "github.com/fatih/color"
  7. "github.com/google/go-containerregistry/pkg/authn"
  8. "github.com/google/go-containerregistry/pkg/name"
  9. "github.com/google/go-containerregistry/pkg/v1/remote"
  10. "github.com/google/go-containerregistry/pkg/v1/tarball"
  11. "github.com/sirupsen/logrus"
  12. resource "github.com/concourse/registry-image-resource"
  13. )
  14. type OutRequest struct {
  15. Source resource.Source `json:"source"`
  16. Params resource.PutParams `json:"params"`
  17. }
  18. type OutResponse struct {
  19. Version resource.Version `json:"version"`
  20. Metadata []resource.MetadataField `json:"metadata"`
  21. }
  22. func main() {
  23. logrus.SetOutput(os.Stderr)
  24. logrus.SetFormatter(&logrus.TextFormatter{
  25. ForceColors: true,
  26. })
  27. color.NoColor = false
  28. var req OutRequest
  29. decoder := json.NewDecoder(os.Stdin)
  30. decoder.DisallowUnknownFields()
  31. err := decoder.Decode(&req)
  32. if err != nil {
  33. logrus.Errorf("invalid payload: %s", err)
  34. os.Exit(1)
  35. return
  36. }
  37. if req.Source.Debug {
  38. logrus.SetLevel(logrus.DebugLevel)
  39. }
  40. logrus.Warnln("'put' is experimental, untested, and subject to change!")
  41. ref := req.Source.Repository + ":" + req.Source.Tag()
  42. n, err := name.ParseReference(ref, name.WeakValidation)
  43. if err != nil {
  44. logrus.Errorf("could not resolve repository/tag reference: %s", err)
  45. os.Exit(1)
  46. return
  47. }
  48. img, err := tarball.ImageFromPath(req.Params.Image, nil)
  49. if err != nil {
  50. logrus.Errorf("could not load image from path '%s': %s", req.Params.Image, err)
  51. os.Exit(1)
  52. return
  53. }
  54. auth := &authn.Basic{
  55. Username: req.Source.Username,
  56. Password: req.Source.Password,
  57. }
  58. logrus.Infof("pushing to %s", ref)
  59. err = remote.Write(n, img, auth, http.DefaultTransport, remote.WriteOptions{})
  60. if err != nil {
  61. logrus.Errorf("failed to upload image: %s", err)
  62. os.Exit(1)
  63. return
  64. }
  65. logrus.Info("pushed")
  66. }