Как был организован доступ к продакшн-серверам на последнем проекте?

Ответ

Доступ был строго регламентирован и автоматизирован через CI/CD. Прямой SSH-доступ имели только DevOps-инженеры и тимлиды. Основной процесс деплоя в продакшен осуществлялся автоматически после прохождения code review и всех этапов тестирования в пайплайне.

Пример Jenkins pipeline для деплоя:

pipeline {
    agent any
    stages {
        stage('Build & Test') {
            steps {
                sh 'mvn clean package'
                sh 'mvn test'
            }
        }
        stage('Deploy to Production') {
            // Деплой только для ветки main после успешного ревью
            when { branch 'main' }
            steps {
                // Безопасный деплой через инструменты оркестрации
                sh 'kubectl apply -f k8s-manifests/production/'
            }
        }
    }
}

Почему такой подход? Он минимизирует человеческий фактор, обеспечивает воспроизводимость и аудит всех изменений, попадающих в прод.

Ответ 18+ 🔞

А, ну это классика, блядь! Слушай, как у них обычно бывает: сидит какой-нибудь сеньор-разработчик, выпил кофе, и ему в голову приходит гениальная идея — «а дай-ка я прямо сейчас, сходу, на проде конфиг поправлю через SSH». И понеслась, сука: пол-сервиса легло, потому что запятуху не там поставил. Пиздец, а не подход.

Так вот, чтобы такого пиздеца не было, у умных людей всё зарегулировано и автоматизировано через эти ваши CI/CD-пайплайны. Доступ к продакшену? Да хуй там, а не доступ! Прямой SSH — это как священный грааль, только у девопсов да тимлидов, и то они им пользуются, как скальпелем хирурга — только в крайних случаях, когда всё уже ебнулось и надо ковыряться в кишках.

Основной же деплой — это священный ритуал, блядь. Код написал? Отправил в ревью. Там тебе пять коллег напишут «ты чё, мудак, тут утечка памяти на ровном месте». Поправил. Запушил. Пайплайн, этот неутомимый раб, берёт твой код и начинает его мучать: собирает, тестирует, линтует. Всё прошёл? Только тогда, сука, и только если это ветка main (она же master, она же царь-ветка), он нехотя, с придыханием, задеплоит это добро в прод. Автоматически, ёпта! Без твоих кривых рук!

Вот, глянь, как это в Jenkins выглядит, простейший пример:

pipeline {
    agent any
    stages {
        stage('Build & Test') {
            steps {
                sh 'mvn clean package'
                sh 'mvn test'
            }
        }
        stage('Deploy to Production') {
            // Деплой только для ветки main после успешного ревью
            when { branch 'main' }
            steps {
                // Безопасный деплой через инструменты оркестрации
                sh 'kubectl apply -f k8s-manifests/production/'
            }
        }
    }
}

Видишь? Сначала этап «Собери и проверь, не насрал ли ты в код». Потом этап «Деплой в прод», который сработает ТОЛЬКО если ты в main. И деплоит он не вручную, а через kubectl — инструмент оркестрации, который сам знает, как аккуратно подменить старые поды на новые, чтобы сервис не лег.

А нахуй такой геморрой? Да всё просто, как три копейки, блядь!

  1. Человеческий фактор минимизируем. Никаких «ой, я забыл». Робот не забывает. Робот не устал. Роботу не надо срать.
  2. Воспроизводимость. Каждый деплой — один в один. Не получится так, что у Васьки на локальной машине работает, а на проде — хуйня, потому что он там какую-то либу из кэша подтянул.
  3. Аудит, ёпта! По пайплайну видно — кто, когда, какой коммит и с какими тестами прошел в прод. Накосячил? Всё, пиздец, браток, тебя уже вычислили. Бери мешок и молот — идешь чинить.

Короче, смысл в том, чтобы превратить деплой из адреналинового экшена «выживет/не выживет» в скучную, рутинную, предсказуемую процедуру. А всё, что скучно и предсказуемо — то и работает, как часы. Ну, почти как часы. Иногда всё равно ебнется, но виноват будет уже не твой кривой палец, а кривой код. А это уже совсем другая история, блядь.