From 132af4af1846411e121a28083ed96550cd7aebe2 Mon Sep 17 00:00:00 2001 From: "Andrey K. Choi" Date: Thu, 11 Sep 2025 11:50:16 +0900 Subject: [PATCH 1/4] EXAMPLE-LIKE PIPELINE --- .drone.yml | 126 +++++++++++++++++++++++++++++++++++------------ README.md | 4 +- data/quiz_bot.db | Bin 57344 -> 57344 bytes 3 files changed, 98 insertions(+), 32 deletions(-) diff --git a/.drone.yml b/.drone.yml index f2860d1..1e49e43 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,33 +1,20 @@ kind: pipeline type: docker -name: quiz-bot-ci-cd - -trigger: - branch: - - main - - develop - - "feature/*" - event: - - push - - pull_request - -services: - - name: docker - image: docker:27-dind - privileged: true - command: - - --host=tcp://0.0.0.0:2375 - environment: - DOCKER_TLS_CERTDIR: "" +name: quiz-bot-ci steps: + - name: install-deps + image: python:3.12-slim + commands: + - echo "🔧 Installing dependencies..." + - pip install --upgrade pip + - pip install -r requirements.txt + - echo "✅ Dependencies installed" + - name: prepare image: alpine/git:latest - environment: - DOCKER_HOST: tcp://docker:2375 commands: - echo "🚀 Pipeline started for branch ${DRONE_BRANCH}" - # BusyBox ash может не поддерживать ${VAR:0:8}; безопаснее так: - echo "📝 Commit: $(echo ${DRONE_COMMIT_SHA} | cut -c1-8)" - echo "👤 Author: ${DRONE_COMMIT_AUTHOR}" - echo "📅 Build: ${DRONE_BUILD_NUMBER}" @@ -37,7 +24,7 @@ steps: image: python:3.12-slim commands: - echo "🔍 Installing linting tools..." - - pip install --no-cache-dir flake8 black isort mypy + - pip install flake8 black isort - echo "🎨 Running Black formatter check..." - black --check --diff src/ config/ tools/ tests/ || true - echo "📦 Running isort import sorting check..." @@ -49,22 +36,24 @@ steps: - name: test image: python:3.12-slim commands: - - pip install --no-cache-dir -r requirements.txt + - echo "🧪 Installing test dependencies..." + - pip install -r requirements.txt + - pip install pytest + - echo "🚀 Running tests..." - python -m pytest tests/ -v --tb=short || true - python tests/test_bot.py || true + - echo "✅ Tests completed" - name: security image: python:3.12-slim commands: - - pip install --no-cache-dir safety bandit + - echo "🔒 Installing security tools..." + - pip install safety bandit + - echo "🛡️ Running safety check..." - safety check --json || true + - echo "🔍 Running bandit security check..." - bandit -r src/ -f json || true - - - name: typecheck - image: python:3.12-slim - commands: - - pip install --no-cache-dir mypy types-requests - - mypy src/ --ignore-missing-imports || true + - echo "✅ Security checks completed" - name: docker_build image: docker:27-cli @@ -75,3 +64,78 @@ steps: - echo "🐳 Docker version info:" - docker version - echo "🔨 Building Docker image..." + - docker build -t quiz-bot:${DRONE_COMMIT_SHA} . + - docker tag quiz-bot:${DRONE_COMMIT_SHA} quiz-bot:latest + - echo "�� Docker build completed" + - docker images | grep quiz-bot || true + when: + branch: + - main + - develop + event: + - push + - pull_request + + - name: docker_test + image: docker:27-cli + environment: + DOCKER_HOST: tcp://docker:2375 + DOCKER_TLS_CERTDIR: "" + commands: + - echo "🧪 Testing Docker image..." + - docker run --rm quiz-bot:${DRONE_COMMIT_SHA} python -c "import src.bot; print('✅ Bot import successful')" + - docker run --rm quiz-bot:${DRONE_COMMIT_SHA} python -c "import config.config; print('✅ Config import successful')" + - echo "✅ Docker tests completed" + depends_on: + - docker_build + when: + branch: + - main + - develop + event: + - push + - pull_request + + - name: quality + image: python:3.12-slim + commands: + - pip install --no-cache-dir flake8 radon + - echo "📊 Calculating code metrics..." + - radon cc src/ -s || true + - radon mi src/ -s || true + - echo "✅ Quality check completed" + + - name: deploy + image: docker:27-cli + environment: + DOCKER_HOST: tcp://docker:2375 + DOCKER_TLS_CERTDIR: "" + commands: + - echo "🚀 Deployment preparation..." + - docker tag quiz-bot:${DRONE_COMMIT_SHA} quiz-bot:production + - echo "Tagged image for production" + - echo "✅ Deployment completed (simulation)" + depends_on: + - docker_test + - quality + when: + branch: + - main + event: + - push + + - name: notify + image: alpine:latest + commands: + - echo "📋 Pipeline Summary:" + - echo "🌿 Branch: ${DRONE_BRANCH}" + - echo "📝 Commit: $(echo ${DRONE_COMMIT_SHA} | cut -c1-8)" + - echo "🏗️ Build: #${DRONE_BUILD_NUMBER}" + - echo "👤 Author: ${DRONE_COMMIT_AUTHOR}" + - echo "✅ Status: ${DRONE_BUILD_STATUS}" + - echo "🕒 Started: ${DRONE_BUILD_STARTED}" + - echo "🎉 All checks passed!" + when: + status: + - success + - failure diff --git a/README.md b/README.md index f3fe003..5832076 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,9 @@ quiz_test/ - 📖 [Быстрый старт](docs/QUICKSTART.md) - Начало работы с проектом - 🐳 [Docker инструкции](docs/DOCKER_README.md) - Контейнеризация и развертывание - 🏗️ [DevOps инфраструктура](docs/DEVOPS_SUMMARY.md) - CI/CD и автоматизация -- 🔧 [Инфраструктура](docs/INFRASTRUCTURE.md) - Архитектура и компоненты +- � [Drone 1.x+ конфигурация](docs/DRONE_1.x_CONFIG.md) - Современный CI/CD pipeline +- 🔄 [Миграция Drone 0.8](docs/DRONE_0.8_MIGRATION.md) - Переход с устаревшей версии +- �🔧 [Инфраструктура](docs/INFRASTRUCTURE.md) - Архитектура и компоненты - 🔧 [Отчет по исправлениям](docs/FIX_REPORT.md) - История изменений ## 🚀 Быстрый старт diff --git a/data/quiz_bot.db b/data/quiz_bot.db index 9cd8af49ce7ed18c8cb43d2a9403b66e2c541e68..6f21445de548e810b989dd3948f32f17da04a90c 100755 GIT binary patch delta 474 zcmZoTz}#?vd4e?KjfpbOj5jtWEaB&3<_}=tKg-|8AFx?az=_|^qWSKH8ID{G^0JbG z#+;0de)-86*@@-`mKWAt*nMHg#r_M+F6_Iov#8X_z{phBz*5)HP{F{!3W$sixtJ&S z$y>3S7+aZ`Pd+Pet|Gvp%D`X3_ngn4cMq=~&rTj^?sMD`T#vc(IDc}saPo7^;!p)z z`=db4X<5%MQ#&?Qu zE?)tk3!eng8NYbzwYa$%SQtea85tOi8LhYQI0}F?b1|cN*3inpP)>^rO)WoIEf-v^ zfr1gx`4(12Mk(5yAhqHMbNSLiZe(RaRcs9OtdU88HV2YwMa^GXyb#q0XMl|chO@D$ K&E`{aW{m)|6L$Ro delta 154 zcmV;L0A>GxzypB51CSd5k&zrj0gV?GcnJXm7Xfr-b98eIvOok75(f^-01wj-rw@A%P7fju_72Lk5fHQv Iv&vpJfhX)Pvj6}9 From bdf76b01d675504373beb53146537a3528934bec Mon Sep 17 00:00:00 2001 From: "Andrey K. Choi" Date: Thu, 11 Sep 2025 11:50:41 +0900 Subject: [PATCH 2/4] example_like pipeline --- .drone.yml | 85 ++++++++++++++++-------------------------------------- 1 file changed, 25 insertions(+), 60 deletions(-) diff --git a/.drone.yml b/.drone.yml index 1e49e43..e405e8a 100644 --- a/.drone.yml +++ b/.drone.yml @@ -55,75 +55,41 @@ steps: - bandit -r src/ -f json || true - echo "✅ Security checks completed" - - name: docker_build - image: docker:27-cli - environment: - DOCKER_HOST: tcp://docker:2375 - DOCKER_TLS_CERTDIR: "" + - name: docker-build + image: docker:dind + volumes: + - name: dockersock + path: /var/run/docker.sock commands: - echo "🐳 Docker version info:" - docker version - echo "🔨 Building Docker image..." - - docker build -t quiz-bot:${DRONE_COMMIT_SHA} . - - docker tag quiz-bot:${DRONE_COMMIT_SHA} quiz-bot:latest - - echo "�� Docker build completed" - - docker images | grep quiz-bot || true - when: - branch: - - main - - develop - event: - - push - - pull_request + - docker build -t ${DRONE_REPO_NAME}:latest . + - docker tag ${DRONE_REPO_NAME}:latest quiz-bot:${DRONE_COMMIT_SHA} + - echo "📦 Docker build completed" + - docker images | grep -E "${DRONE_REPO_NAME}|quiz-bot" || true - - name: docker_test - image: docker:27-cli - environment: - DOCKER_HOST: tcp://docker:2375 - DOCKER_TLS_CERTDIR: "" + - name: docker-test + image: docker:dind + volumes: + - name: dockersock + path: /var/run/docker.sock commands: - echo "🧪 Testing Docker image..." - - docker run --rm quiz-bot:${DRONE_COMMIT_SHA} python -c "import src.bot; print('✅ Bot import successful')" - - docker run --rm quiz-bot:${DRONE_COMMIT_SHA} python -c "import config.config; print('✅ Config import successful')" + - docker run --rm ${DRONE_REPO_NAME}:latest python -c "import src.bot; print('✅ Bot import successful')" || true + - docker run --rm ${DRONE_REPO_NAME}:latest python -c "import config.config; print('✅ Config import successful')" || true - echo "✅ Docker tests completed" - depends_on: - - docker_build - when: - branch: - - main - - develop - event: - - push - - pull_request - name: quality image: python:3.12-slim commands: - - pip install --no-cache-dir flake8 radon - - echo "📊 Calculating code metrics..." + - echo "📊 Installing quality tools..." + - pip install flake8 radon + - echo "📈 Calculating code metrics..." - radon cc src/ -s || true - radon mi src/ -s || true - echo "✅ Quality check completed" - - name: deploy - image: docker:27-cli - environment: - DOCKER_HOST: tcp://docker:2375 - DOCKER_TLS_CERTDIR: "" - commands: - - echo "🚀 Deployment preparation..." - - docker tag quiz-bot:${DRONE_COMMIT_SHA} quiz-bot:production - - echo "Tagged image for production" - - echo "✅ Deployment completed (simulation)" - depends_on: - - docker_test - - quality - when: - branch: - - main - event: - - push - - name: notify image: alpine:latest commands: @@ -132,10 +98,9 @@ steps: - echo "📝 Commit: $(echo ${DRONE_COMMIT_SHA} | cut -c1-8)" - echo "🏗️ Build: #${DRONE_BUILD_NUMBER}" - echo "👤 Author: ${DRONE_COMMIT_AUTHOR}" - - echo "✅ Status: ${DRONE_BUILD_STATUS}" - - echo "🕒 Started: ${DRONE_BUILD_STARTED}" - - echo "🎉 All checks passed!" - when: - status: - - success - - failure + - echo "🎉 Quiz Bot CI Pipeline completed!" + +volumes: + - name: dockersock + host: + path: /var/run/docker.sock From af3ab82f4e71299171ede1b49b82cb71081ef7c0 Mon Sep 17 00:00:00 2001 From: "Andrey K. Choi" Date: Thu, 11 Sep 2025 11:53:31 +0900 Subject: [PATCH 3/4] =?UTF-8?q?emoji-freeecho=20"=D0=9F=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BD=D0=B0=20=D0=BD=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D1=87=D0=B8=D0=B5=20=D1=8D=D0=BC=D0=BE=D0=B4=D0=B6=D0=B8?= =?UTF-8?q?=20=D0=B2=20.drone.yml:"=20&&=20\=20grep=20-n=20"=F0=9F=94=A7\|?= =?UTF-8?q?=F0=9F=9A=80\|=F0=9F=93=9D\|=F0=9F=91=A4\|=F0=9F=93=85\|?= =?UTF-8?q?=E2=9C=85\|=F0=9F=94=8D\|=F0=9F=8E=A8\|=F0=9F=93=A6\|?= =?UTF-8?q?=F0=9F=A7=AA\|=F0=9F=94=92\|=F0=9F=9B=A1=EF=B8=8F\|=F0=9F=90=B3?= =?UTF-8?q?\|=F0=9F=94=A8\|=F0=9F=93=8A\|=F0=9F=93=88\|=F0=9F=93=8B\|?= =?UTF-8?q?=F0=9F=8C=BF\|=F0=9F=8F=97=EF=B8=8F\|=F0=9F=8E=89"=20.drone.yml?= =?UTF-8?q?=20||=20echo=20"=E2=9C=85=20=D0=AD=D0=BC=D0=BE=D0=B4=D0=B6?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=B5=20=D0=BD=D0=B0=D0=B9=D0=B4=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B"=20&&=20\=20echo=20""=20&&=20\=20echo=20"=D0=A0=D0=B0?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D1=80=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0:"=20&?= =?UTF-8?q?&=20\=20wc=20-l=20.drone.yml=20&&=20\=20echo=20""=20&&=20\=20ec?= =?UTF-8?q?ho=20"=D0=9F=D0=B5=D1=80=D0=B2=D1=8B=D0=B5=20=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BA:"=20&&=20\=20head=20-10=20.drone.yml=20emoji-free?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 68 +++++++++++++++++++++++++++--------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/.drone.yml b/.drone.yml index e405e8a..39b580a 100644 --- a/.drone.yml +++ b/.drone.yml @@ -6,54 +6,54 @@ steps: - name: install-deps image: python:3.12-slim commands: - - echo "🔧 Installing dependencies..." + - echo "Installing dependencies..." - pip install --upgrade pip - pip install -r requirements.txt - - echo "✅ Dependencies installed" + - echo "Dependencies installed" - name: prepare image: alpine/git:latest commands: - - echo "🚀 Pipeline started for branch ${DRONE_BRANCH}" - - echo "📝 Commit: $(echo ${DRONE_COMMIT_SHA} | cut -c1-8)" - - echo "👤 Author: ${DRONE_COMMIT_AUTHOR}" - - echo "📅 Build: ${DRONE_BUILD_NUMBER}" + - echo "Pipeline started for branch ${DRONE_BRANCH}" + - echo "Commit: $(echo ${DRONE_COMMIT_SHA} | cut -c1-8)" + - echo "Author: ${DRONE_COMMIT_AUTHOR}" + - echo "Build: ${DRONE_BUILD_NUMBER}" - git --version - name: lint image: python:3.12-slim commands: - - echo "🔍 Installing linting tools..." + - echo "Installing linting tools..." - pip install flake8 black isort - - echo "🎨 Running Black formatter check..." + - echo "Running Black formatter check..." - black --check --diff src/ config/ tools/ tests/ || true - - echo "📦 Running isort import sorting check..." + - echo "Running isort import sorting check..." - isort --check-only --diff src/ config/ tools/ tests/ || true - - echo "🔧 Running flake8 linting..." + - echo "Running flake8 linting..." - flake8 src/ config/ tools/ tests/ --max-line-length=88 --extend-ignore=E203,W503 || true - - echo "✅ Linting completed" + - echo "Linting completed" - name: test image: python:3.12-slim commands: - - echo "🧪 Installing test dependencies..." + - echo "Installing test dependencies..." - pip install -r requirements.txt - pip install pytest - - echo "🚀 Running tests..." + - echo "Running tests..." - python -m pytest tests/ -v --tb=short || true - python tests/test_bot.py || true - - echo "✅ Tests completed" + - echo "Tests completed" - name: security image: python:3.12-slim commands: - - echo "🔒 Installing security tools..." + - echo "Installing security tools..." - pip install safety bandit - - echo "🛡️ Running safety check..." + - echo "Running safety check..." - safety check --json || true - - echo "🔍 Running bandit security check..." + - echo "Running bandit security check..." - bandit -r src/ -f json || true - - echo "✅ Security checks completed" + - echo "Security checks completed" - name: docker-build image: docker:dind @@ -61,12 +61,12 @@ steps: - name: dockersock path: /var/run/docker.sock commands: - - echo "🐳 Docker version info:" + - echo "Docker version info:" - docker version - - echo "🔨 Building Docker image..." + - echo "Building Docker image..." - docker build -t ${DRONE_REPO_NAME}:latest . - docker tag ${DRONE_REPO_NAME}:latest quiz-bot:${DRONE_COMMIT_SHA} - - echo "📦 Docker build completed" + - echo "Docker build completed" - docker images | grep -E "${DRONE_REPO_NAME}|quiz-bot" || true - name: docker-test @@ -75,30 +75,30 @@ steps: - name: dockersock path: /var/run/docker.sock commands: - - echo "🧪 Testing Docker image..." - - docker run --rm ${DRONE_REPO_NAME}:latest python -c "import src.bot; print('✅ Bot import successful')" || true - - docker run --rm ${DRONE_REPO_NAME}:latest python -c "import config.config; print('✅ Config import successful')" || true - - echo "✅ Docker tests completed" + - echo "Testing Docker image..." + - docker run --rm ${DRONE_REPO_NAME}:latest python -c "import src.bot; print('Bot import successful')" || true + - docker run --rm ${DRONE_REPO_NAME}:latest python -c "import config.config; print('Config import successful')" || true + - echo "Docker tests completed" - name: quality image: python:3.12-slim commands: - - echo "📊 Installing quality tools..." + - echo "Installing quality tools..." - pip install flake8 radon - - echo "📈 Calculating code metrics..." + - echo "Calculating code metrics..." - radon cc src/ -s || true - radon mi src/ -s || true - - echo "✅ Quality check completed" + - echo "Quality check completed" - name: notify image: alpine:latest commands: - - echo "📋 Pipeline Summary:" - - echo "🌿 Branch: ${DRONE_BRANCH}" - - echo "📝 Commit: $(echo ${DRONE_COMMIT_SHA} | cut -c1-8)" - - echo "🏗️ Build: #${DRONE_BUILD_NUMBER}" - - echo "👤 Author: ${DRONE_COMMIT_AUTHOR}" - - echo "🎉 Quiz Bot CI Pipeline completed!" + - echo "Pipeline Summary:" + - echo "Branch: ${DRONE_BRANCH}" + - echo "Commit: $(echo ${DRONE_COMMIT_SHA} | cut -c1-8)" + - echo "Build: #${DRONE_BUILD_NUMBER}" + - echo "Author: ${DRONE_COMMIT_AUTHOR}" + - echo "Quiz Bot CI Pipeline completed!" volumes: - name: dockersock From f1ba80e64a05c703434aeb0e06cb8d9c8912400f Mon Sep 17 00:00:00 2001 From: "Andrey K. Choi" Date: Thu, 11 Sep 2025 11:54:37 +0900 Subject: [PATCH 4/4] simple pipeline --- .drone.yml | 117 +++++++++++++---------------------------------------- 1 file changed, 27 insertions(+), 90 deletions(-) diff --git a/.drone.yml b/.drone.yml index 39b580a..fbfd352 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,106 +1,43 @@ kind: pipeline type: docker -name: quiz-bot-ci +name: multibot-ci + +trigger: + branch: + - main + - develop + - "feature/*" + event: + - push + - pull_request steps: - name: install-deps - image: python:3.12-slim + image: python:3.11-slim commands: - - echo "Installing dependencies..." - pip install --upgrade pip - pip install -r requirements.txt - - echo "Dependencies installed" - - - name: prepare - image: alpine/git:latest - commands: - - echo "Pipeline started for branch ${DRONE_BRANCH}" - - echo "Commit: $(echo ${DRONE_COMMIT_SHA} | cut -c1-8)" - - echo "Author: ${DRONE_COMMIT_AUTHOR}" - - echo "Build: ${DRONE_BUILD_NUMBER}" - - git --version - name: lint - image: python:3.12-slim + image: python:3.11-slim commands: - - echo "Installing linting tools..." - - pip install flake8 black isort - - echo "Running Black formatter check..." - - black --check --diff src/ config/ tools/ tests/ || true - - echo "Running isort import sorting check..." - - isort --check-only --diff src/ config/ tools/ tests/ || true - - echo "Running flake8 linting..." - - flake8 src/ config/ tools/ tests/ --max-line-length=88 --extend-ignore=E203,W503 || true - - echo "Linting completed" - - - name: test - image: python:3.12-slim - commands: - - echo "Installing test dependencies..." - - pip install -r requirements.txt - - pip install pytest - - echo "Running tests..." - - python -m pytest tests/ -v --tb=short || true - - python tests/test_bot.py || true - - echo "Tests completed" - - - name: security - image: python:3.12-slim - commands: - - echo "Installing security tools..." - - pip install safety bandit - - echo "Running safety check..." - - safety check --json || true - - echo "Running bandit security check..." - - bandit -r src/ -f json || true - - echo "Security checks completed" + - pip install flake8 + - flake8 . - name: docker-build - image: docker:dind - volumes: - - name: dockersock - path: /var/run/docker.sock - commands: - - echo "Docker version info:" - - docker version - - echo "Building Docker image..." - - docker build -t ${DRONE_REPO_NAME}:latest . - - docker tag ${DRONE_REPO_NAME}:latest quiz-bot:${DRONE_COMMIT_SHA} - - echo "Docker build completed" - - docker images | grep -E "${DRONE_REPO_NAME}|quiz-bot" || true + image: plugins/docker:27 + settings: + repo: ${DRONE_REPO} # или ${DRONE_REPO_NAMESPACE}/${DRONE_REPO_NAME} + tags: + - latest + - ${DRONE_COMMIT_SHA} + dockerfile: Dockerfile + # Если не хочешь пушить — добавь: + # dry_run: true - name: docker-test - image: docker:dind - volumes: - - name: dockersock - path: /var/run/docker.sock + image: docker:27-cli commands: - - echo "Testing Docker image..." - - docker run --rm ${DRONE_REPO_NAME}:latest python -c "import src.bot; print('Bot import successful')" || true - - docker run --rm ${DRONE_REPO_NAME}:latest python -c "import config.config; print('Config import successful')" || true - - echo "Docker tests completed" - - - name: quality - image: python:3.12-slim - commands: - - echo "Installing quality tools..." - - pip install flake8 radon - - echo "Calculating code metrics..." - - radon cc src/ -s || true - - radon mi src/ -s || true - - echo "Quality check completed" - - - name: notify - image: alpine:latest - commands: - - echo "Pipeline Summary:" - - echo "Branch: ${DRONE_BRANCH}" - - echo "Commit: $(echo ${DRONE_COMMIT_SHA} | cut -c1-8)" - - echo "Build: #${DRONE_BUILD_NUMBER}" - - echo "Author: ${DRONE_COMMIT_AUTHOR}" - - echo "Quiz Bot CI Pipeline completed!" - -volumes: - - name: dockersock - host: - path: /var/run/docker.sock + - docker run --rm ${DRONE_REPO_NAME}:${DRONE_COMMIT_SHA} python -c "print('image ok')" + depends_on: + - docker-build