Как проверить, существует ли тег image: в реестре контейнера gitlab

Я знаю, что это можно сделать с dockerhub, Я хочу знать, есть ли что-то подобное для реестра gitlab.

Сценарий использования состоит в том, что я написал сценарий фабрики для возврата развертывания к определенному тегу, предоставленному пользователем. Перед тем, как фактически извлекать изображения, я хочу узнать, существует ли в реестре изображение с указанным тегом, и соответственно предупредить пользователя.

Я искал в их документации, но ничего не смог найти.

Примечание. Пользователь здесь - это человек, который развертывает код.

5 ответов

Решение

Если только GitLab Container Registry не поддерживает то, что делает curl dockerhubv1/repositories/$1/tags/$2Я сомневаюсь, что он предлагает эту функцию.

Например, выпуск 26866 "Список доступных изображений в реестре GitLab" по-прежнему открыт через 10 месяцев.

Хорошо, вот решение, которое я придумал, используя docker: стабильный образ, включив экспериментальные функции клиента.

mkdir -p ~/.docker
"echo '{\"experimental\": \"enabled\"}' > ~/.docker/config.json"
docker  login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
docker  manifest inspect $IMGNAME:$IMGTAG > /dev/null && exit || true

exit завершает сценарий сборки, если этот тег уже существует. Также вы должны знать, что ~/.docker/config.json перезаписано Именно поэтому вход в систему должен произойти впоследствии.

Можно использовать Gitlab API.

tag=tag_name
image=image_name
private_token=gitlab_private_token
project=project_number
repo_id=$(curl --header "PRIVATE-TOKEN: $private_token" "https://gitlab.com/api/v4/projects/$project/registry/repositories" | jq -c --arg regex ".*\\$image$" '.[] | select(.path | test($regex))'.id)

if [ $( curl --header "PRIVATE-TOKEN: $private_token" "https://gitlab.com/api/v4/projects/$project/registry/repositories/$repo_id/tags/$tag" | jq -r '.name' ) == "$tag" ] ; then
  echo "$tag exists"
else
  echo "$tag does not exist"
fi

Кран — это инструмент, который может помочь. Ниже приведен пример, гдеcrane manifestиспользуется внутри Gitlab CI/CD Pipeline ( файл .gitlab-ci.yml ).

      check_if_image_exists:
  stage: check_if_image_exists
  image:
    name: gcr.io/go-containerregistry/crane:debug
    entrypoint: [""]
  script:
    - crane auth login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - if crane manifest $CI_REGISTRY_IMAGE/image:tag; then echo "exists"; else echo "not exists"; fi

Поэтому в дополнение к ответу @fparaggio я искал изображение, если оно существует для текущей ветки, если оно существует, используйте изображение ветки, иначе используйте последний тег в качестве базового изображения.

      package:
  stage: package
  image:
    name: registry.gitlab.com/org/hak:kaniko-debug
    entrypoint: [""]
  retry:
    max: 2
  tags:
    - kubernetes
  interruptible: true
  script:
    - if [[ $( curl --insecure --header "PRIVATE-TOKEN:$GITLAB_TOKEN" https://gitlab.com/api/v4/projects/xxx/registry/repositories/xxx/tags/$CI_COMMIT_REF_SLUG | jq -r '.name' ) == "$CI_COMMIT_REF_SLUG" ]] ; then
      echo "$CI_COMMIT_REF_SLUG exists";
      export CODE_VERSION=$CI_COMMIT_REF_SLUG;
      else
      echo "tag for the branch $CI_COMMIT_REF_SLUG => $CI_COMMIT_REF_NAME does not exist, using latest";
      export CODE_VERSION="latest";
      fi

а потом пройти CODE_VERSIONкак аргументы сборки докера

           -  /kaniko/executor
        --build-arg CACHE_IMAGE=$CI_REGISTRY_IMAGE/install
        --build-arg CODE_VERSION=$CODE_VERSION
        --dockerfile $CI_PROJECT_DIR/Dockerfile-release
        --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG

вы можете найти идентификатор реестра в пользовательском интерфейсе Gitlab, не нужно делать два вызова API.

      https://gitlab.com/org/xyz/repository/container_registry/xxx

Другие вопросы по тегам