Как проверить, существует ли тег image: в реестре контейнера gitlab
Я знаю, что это можно сделать с dockerhub
, Я хочу знать, есть ли что-то подобное для реестра gitlab.
Сценарий использования состоит в том, что я написал сценарий фабрики для возврата развертывания к определенному тегу, предоставленному пользователем. Перед тем, как фактически извлекать изображения, я хочу узнать, существует ли в реестре изображение с указанным тегом, и соответственно предупредить пользователя.
Я искал в их документации, но ничего не смог найти.
Примечание. Пользователь здесь - это человек, который развертывает код.
5 ответов
Если только GitLab Container Registry не поддерживает то, что делает curl dockerhub (с v1/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