main.go 2.3 KB

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