Загрузка данных


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)"