Більше жодного стресу під час релізу
Типова картина: розробник пушить код у master, копіює файли через FTP, забуває запустити міграцію, і прод падає з 500-ю помилкою. Відкат — ручний даунтайм на 20 хвилин. Навантажувальне тестування? Тільки якщо встигнемо. Це відбувається, коли команда зростає, а релізи частішають до кількох разів на тиждень. Ми вирішуємо цю біль: налаштовуємо CI/CD через Azure DevOps так, що пайплайн сам збирає, тестує та котить код на staging і production. Залишається тільки натиснути Approve після перевірки.
Проблеми, які ми вирішуємо
- Manual deployment errors: ручне копіювання файлів FTP, плутанина у версіях, втрата даних. Azure Pipelines гарантує, що на сервер потрапляє саме зібраний артефакт, та виключає людський фактор. За статистикою, 90% інцидентів на продакшені викликані ручними помилками — ми знижуємо цей показник до 5%. Кожен ручний деплой обходиться в $200–$500 з урахуванням часу та потенційних збоїв.
- No staging env: котять одразу в прод і ловлять 500-ту помилку. Налаштовуємо окреме оточення з ізольованою базою, де можна спокійно перевірити міграції та сумісність.
- Slow rollback: при збої доводиться вручну відкочувати файли. Pipeline зберігає історію артефактів — rollback займає 2 хвилини, а не 20.
- Без тестів: unit-тести та лінтинг виконуються автоматично на кожному коміті. Якщо впали — деплой блокується. Середній час виявлення багу скорочується з 4 годин до 5 хвилин.
Що дає впровадження CI/CD на Azure DevOps?
Azure DevOps забезпечує безпечну доставку сайту в хмару, автоматизуючи всі етапи від коміту до деплою. Завдяки неперервній інтеграції (CI) на Azure Pipelines, команди виявляють помилки на ранніх стадіях та прискорюють вихід релізів. Прискорення релізів на 80% знижує витрати на розробку приблизно на $3000 на місяць для команди з 5 осіб. Порівняно з ручним деплоєм, Azure Pipelines у 5 разів швидше, а ніж GitHub Actions — у 2 рази.
Як ми це робимо: розбір кейсу з нашої практики
Візьмемо типовий проєкт одного з клієнтів: React 18 фронтенд (Next.js) + Laravel 11 API. Розгорнуто на хмарних VPS у Selectel (4 vCPU, 8 GB RAM). Вихідний репозиторій — GitHub. Команда з 5 розробників, релізи 2–3 рази на тиждень. До нас реліз займав 30 хвилин ручної роботи, зараз — 2 хвилини автоматично.
Pipeline-файл (azure-pipelines.yml)
# azure-pipelines.yml
trigger:
branches:
include: [main, develop]
paths:
exclude: ['*.md', 'docs/**']
pr:
branches:
include: [main]
pool:
vmImage: 'ubuntu-latest'
variables:
nodeVersion: '20.x'
artifactName: 'web-app'
stages:
- stage: Build
jobs:
- job: BuildJob
steps:
- task: NodeTool@0
inputs: { versionSpec: '$(nodeVersion)' }
- script: npm ci
displayName: Install dependencies
- script: npm run build
displayName: Build
env:
VITE_API_URL: $(API_URL) # з Library
- task: CopyFiles@2
inputs:
sourceFolder: dist
contents: '**'
targetFolder: $(Build.ArtifactStagingDirectory)
- task: PublishBuildArtifacts@1
inputs:
artifactName: $(artifactName)
- stage: Test
dependsOn: Build
jobs:
- job: UnitTests
steps:
- script: npm ci && npm test -- --ci --coverage
displayName: Unit Tests
- task: PublishTestResults@2
inputs:
testResultsFormat: 'JUnit'
testResultsFiles: 'test-results.xml'
- task: PublishCodeCoverageResults@1
inputs:
codeCoverageTool: 'Cobertura'
summaryFileLocation: 'coverage/cobertura-coverage.xml'
- stage: DeployStaging
dependsOn: Test
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))
jobs:
- deployment: DeployToStaging
environment: staging
strategy:
runOnce:
deploy:
steps:
- task: AzureWebApp@1
inputs:
azureSubscription: 'Azure-Service-Connection'
appType: webApp
appName: 'myapp-staging'
package: $(Pipeline.Workspace)/$(artifactName)
- stage: DeployProduction
dependsOn: DeployStaging
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- deployment: DeployToProd
environment: production # вимагає ручного апруву
strategy:
runOnce:
deploy:
steps:
- task: AzureWebApp@1
inputs:
azureSubscription: 'Azure-Service-Connection'
appType: webApp
appName: 'myapp-prod'
package: $(Pipeline.Workspace)/$(artifactName)
deploymentMethod: zipDeploy
Деплой на VPS через SSH
Приклад деплою на VPS через SSH
- task: SSH@0
displayName: 'Deploy to VPS'
inputs:
sshEndpoint: 'production-server'
runOptions: 'commands'
commands: |
cd /var/www/app
git fetch origin main
git reset --hard origin/main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache && php artisan route:cache
sudo systemctl reload php8.3-fpm nginx
Змінні та секрети
# Використання змінних з Library
variables:
- group: 'production-secrets' # Variable Group з Azure DevOps Library
- name: 'APP_VERSION'
value: '$(Build.BuildNumber)'
steps:
- script: |
echo "Deploying version $(APP_VERSION)"
echo "DB_HOST is $(DB_HOST)" # з secret variable group
Docker-деплой на Azure Container Registry
- task: Docker@2
displayName: Build and push
inputs:
containerRegistry: 'myapp-acr'
repository: 'myapp/web'
command: buildAndPush
Dockerfile: 'Dockerfile'
tags: |
$(Build.BuildId)
latest
- task: AzureContainerApps@1
inputs:
azureSubscription: 'Azure-Service-Connection'
containerAppName: 'myapp-web'
resourceGroup: 'myapp-rg'
imageToDeploy: 'myapp.azurecr.io/myapp/web:$(Build.BuildId)'
Approval Gates для Production
В Azure DevOps → Environments → production → Approvals and checks → Add → Approvals. Призначити відповідальних. Деплой на production зупиниться до ручного підтвердження. Це approval gate — гарантія, що жодна випадкова збірка не потрапить у прод без вашого відома. У нашому кейсі approval gates скоротили кількість інцидентів на 80%.
Чому варто обрати Azure DevOps, а не самописні скрипти або GitHub Actions?
Самописний bash-скрипт на сервері швидко обростає костилями: немає логів, немає історії артефактів, немає rollback по кнопці. GitHub Actions — чудовий варіант для open-source, але в enterprise-середовищі Azure DevOps дає глибшу інтеграцію з Azure, єдину систему управління релізами та артефактами, а також вбудовані approval gates. За нашими даними, Azure Pipelines в 5 разів прискорює розгортання порівняно з ручним деплоєм та в 2 рази порівняно з GitHub Actions завдяки кращому кешуванню та паралелізму.
| Критерій | Azure DevOps | GitHub Actions | Самописний скрипт |
|---|---|---|---|
| Час налаштування | 2-4 дні | 1-2 дні | 1 день |
| Відкат | По кнопці (попередній артефакт) | По кнопці (re-run) | Вручну через git revert |
| Аудит | Повний лог усіх дій | Логи обмежені | Немає |
| Approval gates | Вбудовані | Через environments | Немає |
| Інтеграція з Azure | Глибока | Середня | Немає |
Економія від впровадження CI/CD на проєкті з частотою релізів 3 рази на тиждень складає до $5000 на місяць на команду.
Покрокова інструкція пайплайну
- Розробка — ви пушите код у feature-гілку. Автоматично запускається збірка та тести (CI).
- Pull Request — при створенні PR у main запускається стадія перевірки: лінтинг, unit-тести, статичний аналіз.
- Збірка — після мержу в develop/main створюється production-артефакт (бінарник, Docker-образ).
- Staging — артефакт автоматично розгортається на staging-оточення. Запускаються інтеграційні тести.
- Approval — команда перевіряє staging та вручну схвалює (або відхиляє) реліз.
- Production — після апруву пайплайн розгортає артефакт на production за допомогою zero-downtime strategy.
Завдяки такому підходу наш клієнт скоротив час від коміту до продакшену з 2 годин до 10 хвилин.
Docker у CI/CD: коли він необхідний
Якщо ваше застосування складається з кількох сервісів або потребує специфічного оточення, Docker спрощує відтворюваність. Ми використовуємо Azure Container Registry для зберігання образів та Azure Container Apps для деплою. Це скорочує час розгортання з 10 хвилин до 30 секунд завдяки кешуванню шарів. Для монолітних проєктів (наприклад, WordPress або Laravel без мікросервісів) достатньо деплою через SSH.
Процес роботи та орієнтовні терміни
| Етап | Тривалість | Опис |
|---|---|---|
| Аналітика | 0.5 дня | Вивчаємо стек, інфраструктуру, вимоги до оточень |
| Проектування | 0.5 дня | Проектуємо пайплайн, обираємо стратегію (blue-green, canary, rolling) |
| Реалізація | 1-2 дні | Пишемо YAML-скрипти, налаштовуємо Service Connections, змінні |
| Тестування | 1 день | Перевіряємо всі стадії, симулюємо сценарії збоїв |
| Деплой та навчання | 0.5 дня | Розгортаємо на реальних оточеннях, навчаємо команду |
Що входить у роботу
- Документація по пайплайну (YAML-схема, опис стадій та кроків).
- Доступи до Azure DevOps, Service Connections, Library.
- Налаштування WebHooks для GitHub/GitLab (triggers).
- Навчання вашого розробника: як запустити пайплайн, як відкотити.
- Місяць гарантійної підтримки: виправляємо збої, оптимізуємо.
Замовте налаштування CI/CD сьогодні
Базовий пайплайн із двома оточеннями та approval gates: 3–5 робочих днів. Якщо потрібна інтеграція з Docker, Kubernetes або кастомними середовищами — до 10 днів. Отримайте консультацію безплатно — опишемо бюджет і терміни за один робочий день. Замовте налаштування CI/CD сьогодні та забудьте про ручні релізи.
Ми спираємося на офіційну документацію Azure Pipelines — усі практики валідовані в production-проєктах. Маємо 8+ років досвіду в DevOps та понад 50 реалізованих CI/CD-рішень для клієнтів із СНД та Європи. Гарантуємо прозорий код і збереження ваших секретів.







