diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1881faf..f6fdfb3 100755 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,38 +1,61 @@ +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: needs: - build stage: push 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) - - # Получаем хэш существующего образа в реестре 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 echo "Image has changed, pushing to the registry..." - # Логинимся в реестр Docker 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_SHORT_SHA docker push $CI_REGISTRY/$CI_PROJECT_PATH:latest else echo "Image is unchanged, skipping push." 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 # Даем время контейнеру на стартап + sleep 10 - # Пробуем выполнить запрос на /health if curl --fail http://localhost:5050/health; then echo "Healthcheck passed" else @@ -40,8 +63,8 @@ push: exit 1 fi - # Удаляем временный контейнер после теста - docker rm -f test_container only: - main +