main.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package main
  2. import (
  3. "encoding/json"
  4. "os"
  5. resource "github.com/concourse/registry-image-resource"
  6. "github.com/google/go-containerregistry/pkg/name"
  7. "github.com/google/go-containerregistry/pkg/v1/remote"
  8. "github.com/sirupsen/logrus"
  9. )
  10. type CheckRequest struct {
  11. Source resource.Source `json:"source"`
  12. Version *resource.Version `json:"version"`
  13. }
  14. type CheckResponse []resource.Version
  15. func main() {
  16. logrus.SetOutput(os.Stderr)
  17. logrus.SetFormatter(&logrus.TextFormatter{
  18. ForceColors: true,
  19. })
  20. var req CheckRequest
  21. err := json.NewDecoder(os.Stdin).Decode(&req)
  22. if err != nil {
  23. logrus.Errorf("invalid payload: %s", err)
  24. os.Exit(1)
  25. return
  26. }
  27. ref := req.Source.Repository + ":" + req.Source.Tag()
  28. n, err := name.ParseReference(ref, name.WeakValidation)
  29. if err != nil {
  30. logrus.Errorf("could not resolve repository/tag reference: %s", err)
  31. os.Exit(1)
  32. return
  33. }
  34. image, err := remote.Image(n)
  35. if err != nil {
  36. logrus.Errorf("failed to get remote image: %s", err)
  37. os.Exit(1)
  38. return
  39. }
  40. digest, err := image.Digest()
  41. if err != nil {
  42. logrus.Errorf("failed get image digest: %s", err)
  43. os.Exit(1)
  44. return
  45. }
  46. response := CheckResponse{}
  47. if req.Version != nil && req.Version.Digest != digest.String() {
  48. digestRef, err := name.ParseReference(req.Source.Repository+"@"+req.Version.Digest, name.WeakValidation)
  49. if err != nil {
  50. logrus.Errorf("could not resolve repository/digest reference: %s", err)
  51. os.Exit(1)
  52. return
  53. }
  54. digestImage, err := remote.Image(digestRef)
  55. if err != nil {
  56. logrus.Errorf("failed to get remote image: %s", err)
  57. os.Exit(1)
  58. return
  59. }
  60. var missingDigest bool
  61. _, err = digestImage.Digest()
  62. if err != nil {
  63. if rErr, ok := err.(*remote.Error); ok {
  64. for _, e := range rErr.Errors {
  65. if e.Code == remote.ManifestUnknownErrorCode {
  66. missingDigest = true
  67. break
  68. }
  69. }
  70. }
  71. if !missingDigest {
  72. logrus.Errorf("failed to get cursor image digest: %s", err)
  73. os.Exit(1)
  74. return
  75. }
  76. }
  77. if !missingDigest {
  78. response = append(response, *req.Version)
  79. }
  80. }
  81. response = append(response, resource.Version{
  82. Digest: digest.String(),
  83. })
  84. json.NewEncoder(os.Stdout).Encode(response)
  85. }