ci: improve image-manifest reliability (#981)

diff --git a/roles/defaults/vars.go b/roles/defaults/vars.go
index 4dc1e7d..4c11748 100644
--- a/roles/defaults/vars.go
+++ b/roles/defaults/vars.go
@@ -12,6 +12,20 @@
 	varsFile []byte
 )
 
+func GetImages() (map[string]string, error) {
+	path, err := yaml.PathString("$._atmosphere_images")
+	if err != nil {
+		return nil, err
+	}
+
+	var images map[string]string
+	if err := path.Read(bytes.NewReader(varsFile), &images); err != nil {
+		return nil, err
+	}
+
+	return images, nil
+}
+
 func GetImageByKey(key string) (string, error) {
 	path, err := yaml.PathString("$._atmosphere_images." + key)
 	if err != nil {
diff --git a/roles/defaults/vars_test.go b/roles/defaults/vars_test.go
new file mode 100644
index 0000000..e70e545
--- /dev/null
+++ b/roles/defaults/vars_test.go
@@ -0,0 +1,50 @@
+package defaults
+
+import (
+	"context"
+	"fmt"
+	"slices"
+	"strings"
+	"testing"
+
+	"github.com/containers/image/v5/docker"
+	"github.com/stretchr/testify/require"
+)
+
+func TestImageExist(t *testing.T) {
+	images, err := GetImages()
+	require.NoError(t, err)
+
+	var uniqueImages []string
+	for _, image := range images {
+		if slices.Contains(uniqueImages, image) {
+			continue
+		}
+
+		uniqueImages = append(uniqueImages, image)
+	}
+
+	for _, image := range uniqueImages {
+		// NOTE(mnaser): ParseReference does not allow both tag & digest,
+		//               so we strip the tags from the image name.
+		nameWithTag := strings.Split(image, "@")[0]
+		name := strings.Split(nameWithTag, ":")[0]
+		digest := strings.Split(image, "@")[1]
+		image := fmt.Sprintf("%s@%s", name, digest)
+
+		t.Run(image, func(t *testing.T) {
+			t.Parallel()
+
+			ref, err := docker.ParseReference(fmt.Sprintf("//%s", image))
+			require.NoError(t, err)
+
+			ctx := context.Background()
+			img, err := ref.NewImage(ctx, nil)
+			require.NoError(t, err)
+			defer img.Close()
+
+			_, _, err = img.Manifest(ctx)
+			require.NoError(t, err)
+		})
+	}
+}