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