Кто отвечал за deploy в команде?

Ответ

Ответственность за деплой (развертывание) варьируется в зависимости от зрелости процессов команды и её структуры.

Основные модели:

  1. DevOps / Platform Engineering: В современных CI/CD-практиках ответственность лежит на разработчиках, а инженеры DevOps или Platform обеспечивают и поддерживают надежные, самообслуживаемые пайплайны и инфраструктуру. Разработчик создает Pull Request, который после мержа автоматически проходит сборку, тестирование и деплой в staging/production через настроенный пайплайн.

  2. Выделенный инженер DevOps: В некоторых командах инженер DevOps настраивает пайплайны и выполняет ручные или полуавтоматические деплои, особенно для сложных или критичных сред.

  3. Релиз-менеджер: В крупных корпоративных средах с жестким контролем релизов может быть отдельная роль, координирующая выкатку между командами, утверждающая план и проводящая откат при необходимости.

Пример автоматизированного пайплайна (GitHub Actions для .NET приложения):

name: Build, Test and Deploy

on:
  push:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Setup .NET
      uses: actions/setup-dotnet@v4
    - name: Restore dependencies
      run: dotnet restore
    - name: Build
      run: dotnet build --configuration Release --no-restore
    - name: Run tests
      run: dotnet test --configuration Release --no-build --verbosity normal

  deploy-to-staging:
    needs: build-and-test
    runs-on: ubuntu-latest
    if: success()
    environment: staging
    steps:
    - uses: actions/checkout@v4
    - run: dotnet publish -c Release -o ./publish
    - name: Deploy to Azure Web App
      uses: azure/webapps-deploy@v3
      with:
        app-name: 'my-app-staging'
        publish-profile: ${{ secrets.AZURE_PUBLISH_PROFILE_STAGING }}
        package: ./publish

Идеальная цель: Полностью автоматизированный, надежный и откатываемый процесс деплоя, где разработчик может безопасно выкатить изменения без глубокого знания инфраструктуры.

Ответ 18+ 🔞

Давай разберемся, кто же в итоге должен жать на эту красную кнопку, чтобы всё полетело в прод. А то вечно непонятно — то ли ты, то ли какой-нибудь дядька с бородой из соседнего отдела.

Короче, есть три основных подхода, и все они — пиздец как разные:

  1. DevOps / Platform Engineering (Модно и правильно). Тут вся ответственность — на тебе, разработчике. Ты написал код, замержил его в main, а дальше магия: пайплайн сам всё собирает, тестирует и выкатывает. Эти ребята из Platform только делают так, чтобы эта магия работала без сбоев, а ты не ебал мозг с настройкой серверов. Идеал — ты даже не задумываешься, как это работает, просто пушишь и всё живёт.

  2. Отдельный инженер DevOps (Старая школа, но ещё жива). Бывает, что пайплайн настроил какой-то гуру, а запускает его вручную он же, особенно если продакшн — это священная корова, до которой можно только с молитвой. Ты сдал артефакт, а дальше ждёшь, пока этот шаман проведёт ритуал деплоя в четыре утра.

  3. Релиз-менеджер (Ад бюрократии, обычно в банках или огромных конторах). Тут вообще отдельная песня. Есть специальный человек, который только тем и занимается, что согласует твой релиз с другими двадцатью командами, утверждает план на полгода вперёд и имеет право на откат, если что-то пошло не так. Скорость — как у танка в болоте, зато "безопасно".

Вот, смотри, как это выглядит в жизни, на примере GitHub Actions для .NET:

name: Build, Test and Deploy

on:
  push:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Setup .NET
      uses: actions/setup-dotnet@v4
    - name: Restore dependencies
      run: dotnet restore
    - name: Build
      run: dotnet build --configuration Release --no-restore
    - name: Run tests
      run: dotnet test --configuration Release --no-build --verbosity normal

  deploy-to-staging:
    needs: build-and-test
    runs-on: ubuntu-latest
    if: success()
    environment: staging
    steps:
    - uses: actions/checkout@v4
    - run: dotnet publish -c Release -o ./publish
    - name: Deploy to Azure Web App
      uses: azure/webapps-deploy@v3
      with:
        app-name: 'my-app-staging'
        publish-profile: ${{ secrets.AZURE_PUBLISH_PROFILE_STAGING }}
        package: ./publish

Суть в чём? В идеальном мире ты должен стремиться к первому варианту. Чтобы процесс был настолько автоматизированным и надёжным, что ты можешь выкатывать хоть десять раз в день, не держа в штанах кирпич. Сделал мерж — и забыл, система сама всё сделает, а если что-то сломается — сама же и откатится. Мечта, а не работа.