Загрузка данных
trigger:
branches:
include:
- dev
pr: none
pool:
name: Infradev
variables:
SSH_SERVICE_CONNECTION: 'infradev_mailarchive_dev'
APP_PATH: '/opt/mail_archive/src'
CONTAINER_NAME: 'django-ma-uv'
stages:
- stage: Deploy_Development
displayName: 'Deploy to Development'
jobs:
- job: Deploy
displayName: 'Deploy Application'
steps:
- task: SSH@0
name: GitFetch
displayName: 'Получение последних изменений'
inputs:
sshEndpoint: $(SSH_SERVICE_CONNECTION)
runOptions: inline
inline: |
set -e
cd $(APP_PATH)
git fetch --quiet origin dev
- task: SSH@0
name: GitReset
displayName: 'Сброс на origin/dev'
inputs:
sshEndpoint: $(SSH_SERVICE_CONNECTION)
runOptions: inline
inline: |
set -e
cd $(APP_PATH)
git reset --hard origin/dev
git log -1 --oneline
- task: PythonScript@0
name: BumpVersion
displayName: 'Инкремент версии'
inputs:
scriptSource: inline
script: |
import os
import re
import tomllib
from pathlib import Path
pyproject = Path("/opt/mail_archive/src/pyproject.toml")
with pyproject.open("rb") as f:
data = tomllib.load(f)
current_version = data["project"]["version"]
version = current_version.replace("-dev", "")
major, minor, patch = map(int, version.split("."))
patch += 1
new_version = f"{major}.{minor}.{patch}-dev"
text = pyproject.read_text()
text = re.sub(
r'version\s*=\s*"[^"]+"',
f'version = "{new_version}"',
text,
count=1
)
pyproject.write_text(text)
build_id = os.environ["BUILD_BUILDID"]
print(
f"##vso[task.setvariable variable=APP_VERSION]{new_version}"
)
print(
f"##vso[build.updatebuildnumber]{new_version} (build #{build_id})"
)
print(
f"[INFO] Version: {current_version} -> {new_version}"
)
- task: PythonScript@0
name: UpdateChangelog
displayName: 'Обновление CHANGELOG'
inputs:
scriptSource: inline
script: |
import os
from pathlib import Path
from datetime import datetime
version = os.environ["APP_VERSION"]
build_id = os.environ["BUILD_BUILDID"]
commit_message = os.getenv(
"BUILD_SOURCEVERSIONMESSAGE",
"No commit message"
)
changelog = Path(
"/opt/mail_archive/src/CHANGELOG.md"
)
entry = f"""## {version}
Build: {build_id}
Date: {datetime.now():%Y-%m-%d %H:%M:%S}
{commit_message}
---
"""
old_content = ""
if changelog.exists():
old_content = changelog.read_text()
changelog.write_text(entry + old_content)
- bash: |
set -e
cd $(APP_PATH)
git config user.name "Azure DevOps"
git config user.email "svc_infradev@avp.ru"
git add pyproject.toml CHANGELOG.md
if ! git diff --cached --quiet; then
git commit -m "ci: bump version to $(APP_VERSION) [skip ci]"
git push origin HEAD:dev
fi
displayName: 'Commit version'
- task: SSH@0
name: UVSync
displayName: 'Запуск uv sync'
inputs:
sshEndpoint: $(SSH_SERVICE_CONNECTION)
runOptions: inline
inline: |
set -e
docker exec -t $(CONTAINER_NAME) uv sync
- task: SSH@0
name: DjangoMigrate
displayName: 'Применение миграций Django'
inputs:
sshEndpoint: $(SSH_SERVICE_CONNECTION)
runOptions: inline
inline: |
set -e
docker exec -t $(CONTAINER_NAME) \
uv run manage.py migrate \
--settings=config.settings.development
- task: SSH@0
name: RuffCheck
displayName: 'Проверка линтером'
inputs:
sshEndpoint: $(SSH_SERVICE_CONNECTION)
runOptions: inline
inline: |
set -e
docker exec $(CONTAINER_NAME) \
uv run ruff check --exit-zero .
- task: SSH@0
name: RestartContainer
displayName: 'Перезапуск контейнеров'
inputs:
sshEndpoint: $(SSH_SERVICE_CONNECTION)
runOptions: inline
inline: |
set -e
docker restart django-ma-uv celery-worker > /dev/null 2>&1
- task: SSH@0
name: DeploymentCompleted
displayName: 'Завершение деплоя'
inputs:
sshEndpoint: $(SSH_SERVICE_CONNECTION)
runOptions: inline
inline: |
echo "[INFO] Deployment completed"
echo "[INFO] Version: $(APP_VERSION)"