This commit is contained in:
2025-03-03 20:27:28 +03:00
parent 369fc725a1
commit 6f9038eb8e

View File

@@ -1,54 +1,47 @@
image: docker:latest
stages:
- test
- build
- push
test:
stage: test
image: python:3.11-alpine
script:
- pip install -q -r requirements.txt
- python -m unittest discover tests
only:
- main
before_script:
- apk add --no-cache docker-cli curl jq
- |
until docker info; do
echo "Waiting for Docker to be ready..."
sleep 5
done
build:
needs:
- test
stage: build
script:
- docker info
- docker build -t $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG .
- docker tag $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_SHORT_SHA
- docker tag $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG $CI_REGISTRY/$CI_PROJECT_PATH:latest
push: push:
needs: needs:
- build - build
stage: push stage: push
script: script:
- | - |
# Получаем хэш текущего образа
CURRENT_IMAGE_HASH=$(docker inspect --format='{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}no_digest{{end}}' $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG) CURRENT_IMAGE_HASH=$(docker inspect --format='{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}no_digest{{end}}' $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG)
# Получаем хэш существующего образа в реестре
EXISTING_IMAGE_HASH=$(curl -s --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" "https://gl.beaconborn.ru/api/v4/projects/$CI_PROJECT_ID/registry/repositories/1/tags/$CI_COMMIT_REF_SLUG" | jq -r '.digest') EXISTING_IMAGE_HASH=$(curl -s --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" "https://gl.beaconborn.ru/api/v4/projects/$CI_PROJECT_ID/registry/repositories/1/tags/$CI_COMMIT_REF_SLUG" | jq -r '.digest')
# Если хэши не совпадают или образ не существует, пушим новый образ
if [ "$CURRENT_IMAGE_HASH" != "$EXISTING_IMAGE_HASH" ] && [ "$CURRENT_IMAGE_HASH" != "no_digest" ]; then if [ "$CURRENT_IMAGE_HASH" != "$EXISTING_IMAGE_HASH" ] && [ "$CURRENT_IMAGE_HASH" != "no_digest" ]; then
echo "Image has changed, pushing to the registry..." echo "Image has changed, pushing to the registry..."
# Логинимся в реестр Docker
echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY
# Пушим все теги
docker push $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG docker push $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG
docker push $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_SHORT_SHA docker push $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_SHORT_SHA
docker push $CI_REGISTRY/$CI_PROJECT_PATH:latest docker push $CI_REGISTRY/$CI_PROJECT_PATH:latest
else else
echo "Image is unchanged, skipping push." echo "Image is unchanged, skipping push."
fi fi
# Проверка образа: запуск контейнера и healthcheck
- echo "Running container to test image"
- docker run -d --name test_container -p 5050:5050 $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG
- |
# Запуск healthcheck, проверка работы API
echo "Waiting for the application to start..."
sleep 10 # Даем время контейнеру на стартап
# Пробуем выполнить запрос на /health
if curl --fail http://localhost:5050/health; then
echo "Healthcheck passed"
else
echo "Healthcheck failed, stopping push"
exit 1
fi
# Удаляем временный контейнер после теста
- docker rm -f test_container
only: only:
- main - main