main.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. decoder := json.NewDecoder(os.Stdin)
  22. decoder.DisallowUnknownFields()
  23. err := decoder.Decode(&req)
  24. if err != nil {
  25. logrus.Errorf("invalid payload: %s", err)
  26. os.Exit(1)
  27. return
  28. }
  29. ref := req.Source.Repository + ":" + req.Source.Tag()
  30. n, err := name.ParseReference(ref, name.WeakValidation)
  31. if err != nil {
  32. logrus.Errorf("could not resolve repository/tag reference: %s", err)
  33. os.Exit(1)
  34. return
  35. }
  36. image, err := remote.Image(n)
  37. if err != nil {
  38. logrus.Errorf("failed to get remote image: %s", err)
  39. os.Exit(1)
  40. return
  41. }
  42. digest, err := image.Digest()
  43. if err != nil {
  44. logrus.Errorf("failed get image digest: %s", err)
  45. os.Exit(1)
  46. return
  47. }
  48. response := CheckResponse{}
  49. if req.Version != nil && req.Version.Digest != digest.String() {
  50. digestRef, err := name.ParseReference(req.Source.Repository+"@"+req.Version.Digest, name.WeakValidation)
  51. if err != nil {
  52. logrus.Errorf("could not resolve repository/digest reference: %s", err)
  53. os.Exit(1)
  54. return
  55. }
  56. digestImage, err := remote.Image(digestRef)
  57. if err != nil {
  58. logrus.Errorf("failed to get remote image: %s", err)
  59. os.Exit(1)
  60. return
  61. }
  62. var missingDigest bool
  63. _, err = digestImage.Digest()
  64. if err != nil {
  65. if rErr, ok := err.(*remote.Error); ok {
  66. for _, e := range rErr.Errors {
  67. if e.Code == remote.ManifestUnknownErrorCode {
  68. missingDigest = true
  69. break
  70. }
  71. }
  72. }
  73. if !missingDigest {
  74. logrus.Errorf("failed to get cursor image digest: %s", err)
  75. os.Exit(1)
  76. return
  77. }
  78. }
  79. if !missingDigest {
  80. response = append(response, *req.Version)
  81. }
  82. }
  83. response = append(response, resource.Version{
  84. Digest: digest.String(),
  85. })
  86. json.NewEncoder(os.Stdout).Encode(response)
  87. }