Автоматизация тестирования: скрипты для запуска тестов
Запускаете тесты вручную и ждете, пока они пройдут? Автоматизируйте их запуск и получайте отчеты по почте/Slack.
Разработчики забывают запускать тесты перед пушем, CI падает из-за мелочей, которые можно было бы поймать локально.
Вариант 1 (Git Hooks): предотвращаем пуш непротестированного кода.
Вариант 2 (Makefile): универсальный способ описать процесс тестирования.
Вариант 3 (Slack-уведомления о результатах тестов):
Непрерывное тестирование — тесты должны запускаться автоматически на каждом этапе разработки: локально, в CI, перед деплоем.
А вы запускаете тесты в гитах? Или доверяете только CI? Какие самые полезные хуки используете?
🌐 @helcode
Запускаете тесты вручную и ждете, пока они пройдут? Автоматизируйте их запуск и получайте отчеты по почте/Slack.
Разработчики забывают запускать тесты перед пушем, CI падает из-за мелочей, которые можно было бы поймать локально.
Вариант 1 (Git Hooks): предотвращаем пуш непротестированного кода.
# .git/hooks/pre-push
#!/bin/bash
if ! npm test; then
echo "Тесты не проходят!"
exit 1
fi
Вариант 2 (Makefile): универсальный способ описать процесс тестирования.
test:
pytest tests/ --cov=app --cov-report=html
test-e2e:
docker-compose -f docker-compose.test.yml up --abort-on-container-exit
Вариант 3 (Slack-уведомления о результатах тестов):
# После запуска тестов в CI
if tests_failed:
send_slack_alert("Тесты упали!", test_report_url)
Непрерывное тестирование — тесты должны запускаться автоматически на каждом этапе разработки: локально, в CI, перед деплоем.
А вы запускаете тесты в гитах? Или доверяете только CI? Какие самые полезные хуки используете?
P.S. Автоматические тесты — как система безопасности: лучше потратить время на их настройку, чем разбирать последствия.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Парсим сайты и API: сбор данных без боли
Нужно регулярно собирать данные с сайтов или API, но делать это вручную — адская работа? Научимся автоматизировать парсинг.
Ежедневно вручную заходить на сайт, копировать данные, вставлять в Excel... Знакомо? Пора делегировать это скрипту.
Вариант 1 (Python + requests + BeautifulSoup):
Вариант 2 (Node.js + puppeteer): для сложных случаев с JavaScript-рендерингом.
Извлечение данных — автоматизируем сбор информации из различных источников для последующего анализа или интеграции.
А вам приходилось парсить данные? Для каких задач: мониторинг цен, сбор новостей, автоматизация отчетности?
🌐 @helcode
Нужно регулярно собирать данные с сайтов или API, но делать это вручную — адская работа? Научимся автоматизировать парсинг.
Ежедневно вручную заходить на сайт, копировать данные, вставлять в Excel... Знакомо? Пора делегировать это скрипту.
Вариант 1 (Python + requests + BeautifulSoup):
import requests
from bs4 import BeautifulSoup
response = requests.get('https://example.com/data')
soup = BeautifulSoup(response.text, 'html.parser')
data = soup.find('div', class_='price').text
print(f"Актуальная цена: {data}")
Вариант 2 (Node.js + puppeteer): для сложных случаев с JavaScript-рендерингом.
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
const data = await page.$eval('.dynamic-content', el => el.textContent);
console.log(data);
await browser.close();
})();Извлечение данных — автоматизируем сбор информации из различных источников для последующего анализа или интеграции.
А вам приходилось парсить данные? Для каких задач: мониторинг цен, сбор новостей, автоматизация отчетности?
P.S. Парсинг данных — как иметь личного робота-исследователя: работает 24/7 и никогда не устает.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Автоматическое резервное копирование: спим спокойно
Бэкапы — это как страховка: все знают, что нужны, но мало кто их делает. Исправим это одним скриптом.
"А у нас есть бэкап?" — самый страшный вопрос, который можно услышать после "система легла". Ручные бэкапы ненадежны и забываются.
Вариант 1 (Bash-скрипт + Cron):
Вариант 2 (Python-скрипт с отправкой в облако):
Disaster Recovery — автоматизируем процессы восстановления после сбоев. Правило 3-2-1: 3 копии данных, на 2 разных носителях, 1 копия off-site.
А как у вас с бэкапами? Ручные, автоматические, или по принципу "если продакшен упадет, просто найдем новую работу"?
🌐 @helcode
Бэкапы — это как страховка: все знают, что нужны, но мало кто их делает. Исправим это одним скриптом.
"А у нас есть бэкап?" — самый страшный вопрос, который можно услышать после "система легла". Ручные бэкапы ненадежны и забываются.
Вариант 1 (Bash-скрипт + Cron):
#!/bin/bash
BACKUP_DIR="/backups"
DATE=$(date +%Y%m%d_%H%M%S)
# Бэкап базы данных
pg_dump mydb > $BACKUP_DIR/mydb_$DATE.sql
# Бэкап важных директорий
tar -czf $BACKUP_DIR/app_$DATE.tar.gz /app/data
# Удаляем старые бэкапы (старше 30 дней)
find $BACKUP_DIR -name "*.sql" -mtime +30 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
Вариант 2 (Python-скрипт с отправкой в облако):
import boto3
from datetime import datetime
s3 = boto3.client('s3')
backup_file = f"backup_{datetime.now().strftime('%Y%m%d')}.sql"
# Создаем бэкап и загружаем в S3
subprocess.run(['pg_dump', 'mydb', '-f', backup_file])
s3.upload_file(backup_file, 'my-backup-bucket', backup_file)
Disaster Recovery — автоматизируем процессы восстановления после сбоев. Правило 3-2-1: 3 копии данных, на 2 разных носителях, 1 копия off-site.
А как у вас с бэкапами? Ручные, автоматические, или по принципу "если продакшен упадет, просто найдем новую работу"?
P.S. Есть два типа людей: те, кто делают бэкапы, и те, кто еще будет их делать.
Please open Telegram to view this post
VIEW IN TELEGRAM
Скрипты для работы с файлами: массовые операции
Нужно переименовать 1000 файлов, изменить расширения или найти дубликаты? Не делайте это вручную!
Фотоаппарат создает файлы с неудобными именами, нужно обработать кучу логов, найти и удалить дубликаты файлов...
Вариант 1 (Bash-скрипт):
Вариант 2 (Python-скрипт):
Пакетная обработка — автоматизируем массовые операции над файлами, экономя время и избегая человеческих ошибок.
А какие массовые операции с файлами вам приходилось делать? Переименование, конвертация, поиск дубликатов?
🌐 @helcode
Нужно переименовать 1000 файлов, изменить расширения или найти дубликаты? Не делайте это вручную!
Фотоаппарат создает файлы с неудобными именами, нужно обработать кучу логов, найти и удалить дубликаты файлов...
Вариант 1 (Bash-скрипт):
# Переименовать все .txt файлы в .md
for file in *.txt; do
mv "$file" "${file%.txt}.md"
done
# Найти дубликаты файлов по MD5
find . -type f -exec md5sum {} + | sort | uniq -w32 -dD
Вариант 2 (Python-скрипт):
import os
from pathlib import Path
# Изменить расширения у файлов
for file_path in Path('.').glob('*.txt'):
new_path = file_path.with_suffix('.md')
file_path.rename(new_path)
# Найти дубликаты
import hashlib
def get_file_hash(file_path):
return hashlib.md5(open(file_path, 'rb').read()).hexdigest()
Пакетная обработка — автоматизируем массовые операции над файлами, экономя время и избегая человеческих ошибок.
А какие массовые операции с файлами вам приходилось делать? Переименование, конвертация, поиск дубликатов?
P.S. Написать скрипт на 5 минут, чтобы сэкономить 2 часа ручной работы — лучшая инвестиция времени.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8😐2
Автоматизация деплоя фронтенда: S3, CloudFront и не только
Деплоить фронтенд вручную — это как каждый раз заново собирать мебель из IKEA. Автоматизируем!
Сборка, загрузка на хостинг, инвалидация кеша — рутина, которая отнимает время и нервы.
Вариант 1 (Bash-скрипт для AWS S3):
Вариант 2 (GitHub Actions):
Непрерывное развертывание — автоматизируем процесс доставки кода от разработки до продакшена.
А как вы деплоите фронтенд? S3, Netlify, Vercel, или свой сервер? Делитесь лучшими практиками!
🌐 @helcode
Деплоить фронтенд вручную — это как каждый раз заново собирать мебель из IKEA. Автоматизируем!
Сборка, загрузка на хостинг, инвалидация кеша — рутина, которая отнимает время и нервы.
Вариант 1 (Bash-скрипт для AWS S3):
#!/bin/bash
npm run build
aws s3 sync ./dist s3://my-bucket --delete
aws cloudfront create-invalidation --distribution-id ABCD1234 --paths "/*"
Вариант 2 (GitHub Actions):
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npm ci && npm run build
- uses: aws-actions/configure-aws-credentials@v4
- run: aws s3 sync ./dist s3://my-bucket --delete
Непрерывное развертывание — автоматизируем процесс доставки кода от разработки до продакшена.
А как вы деплоите фронтенд? S3, Netlify, Vercel, или свой сервер? Делитесь лучшими практиками!
P.S. Идеальный деплой фронтенда — когда вы пушите в main, а через 2 минуты изменения уже в прод.
Please open Telegram to view this post
VIEW IN TELEGRAM
Скрипты для работы с базами данных: миграции, бэкапы, аналитика
Рутинные операции с БД отнимают кучу времени? Автоматизируем миграции, бэкапы и ежедневные отчеты.
Вручную делать дампы, применять миграции, генерировать отчеты — скучно и легко ошибиться.
Вариант 1 (Миграции на SQL):
Вариант 2 (Python-скрипт для ежедневных отчетов):
Database DevOps — применяем принципы DevOps к работе с базами данных: версионность, автоматизация, непрерывная интеграция.
А как вы управляете изменениями БД? Ручные скрипты, миграционные фреймворки, или ORM?
🌐 @helcode
Рутинные операции с БД отнимают кучу времени? Автоматизируем миграции, бэкапы и ежедневные отчеты.
Вручную делать дампы, применять миграции, генерировать отчеты — скучно и легко ошибиться.
Вариант 1 (Миграции на SQL):
-- V2__Add_email_to_users.sql
ALTER TABLE users ADD COLUMN email VARCHAR(255);
CREATE INDEX idx_users_email ON users(email);
Вариант 2 (Python-скрипт для ежедневных отчетов):
import psycopg2
import pandas as pd
conn = psycopg2.connect("dbname=mydb")
df = pd.read_sql("SELECT * FROM sales WHERE date = CURRENT_DATE", conn)
df.to_csv('/reports/daily_sales.csv', index=False)
Database DevOps — применяем принципы DevOps к работе с базами данных: версионность, автоматизация, непрерывная интеграция.
А как вы управляете изменениями БД? Ручные скрипты, миграционные фреймворки, или ORM?
P.S. Автоматизированная работа с БД — как автопилот: можно спать спокойно, зная, что все операции выполнятся точно и вовремя.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Мониторинг сайтов: скрипт проверки доступности
Ваш сайт лежит, а вы узнаете об этом последним? Напишем скрипт-сторожа, который будет мониторить доступность 24/7.
Пользователи жалуются, что сайт не работает, а вы ничего не знаете. Нужен простой и надежный мониторинг.
Вариант 1 (Bash-скрипт):
Вариант 2 (Python-скрипт с проверкой контента):
Проактивный мониторинг — не ждем, когда пользователи сообщат о проблеме, а сами постоянно проверяем систему.
А как вы мониторите доступность? UptimeRobot, собственные скрипты, или облачные мониторинги?
🌐 @helcode
Ваш сайт лежит, а вы узнаете об этом последним? Напишем скрипт-сторожа, который будет мониторить доступность 24/7.
Пользователи жалуются, что сайт не работает, а вы ничего не знаете. Нужен простой и надежный мониторинг.
Вариант 1 (Bash-скрипт):
#!/bin/bash
if curl -s --head --fail https://mysite.com > /dev/null; then
echo "Сайт жив!"
else
echo "Сайт лежит!" | send-slack-alert
fi
Вариант 2 (Python-скрипт с проверкой контента):
import requests
response = requests.get('https://mysite.com')
if response.status_code != 200 or 'Ваш сайт' not in response.text:
send_alert('Сайт не работает или изменился контент!')
Проактивный мониторинг — не ждем, когда пользователи сообщат о проблеме, а сами постоянно проверяем систему.
А как вы мониторите доступность? UptimeRobot, собственные скрипты, или облачные мониторинги?
P.S. Хороший мониторинг — как система пожарной сигнализации: лучше ложное срабатывание, чем настоящий пожар.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2🤔1👌1
Автоматизация код-ревью: рre-commit хуки
Закоммитили кривой код и только потом заметили? Pre-commit хуки не дадут вам сделать это снова.
Мелкие ошибки, забытые debug-вызовы, кривой форматирование — все это проходит в коммиты и затрудняет ревью.
Вариант 1 (Husky для JavaScript):
Вариант 2 (Bash-скрипт):
Качество кода — автоматизируем проверки, чтобы поддерживать высокий стандарт кода в проекте.
А вы используете pre-commit хуки? Какие проверки автоматизировали: линтинг, форматирование, проверку типов?
🌐 @helcode
Закоммитили кривой код и только потом заметили? Pre-commit хуки не дадут вам сделать это снова.
Мелкие ошибки, забытые debug-вызовы, кривой форматирование — все это проходит в коммиты и затрудняет ревью.
Вариант 1 (Husky для JavaScript):
// package.json
{
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
}
}
Вариант 2 (Bash-скрипт):
# .git/hooks/pre-commit
#!/bin/bash
if git diff --cached --name-only | grep -E '\.(js|ts)$' | xargs eslint; then
echo "ESLint проверка пройдена"
else
echo "ESLint нашел ошибки"
exit 1
fi
Качество кода — автоматизируем проверки, чтобы поддерживать высокий стандарт кода в проекте.
А вы используете pre-commit хуки? Какие проверки автоматизировали: линтинг, форматирование, проверку типов?
P.S. Pre-commit хуки — как автоисправление в телефоне: иногда раздражает, но чаще спасает от опечаток.
Please open Telegram to view this post
VIEW IN TELEGRAM
Скрипты для работы с Docker: очистка, обновление, мониторинг
Docker-система заросла образами и контейнерами? Наведем порядок автоматически!
Старые образы занимают гигабайты места, забытые контейнеры висят в фоне, версии устарели.
Вариант 1 (Bash-скрипт для очистки):
Вариант 2 (Python-скрипт для мониторинга):
Управление жизненным циклом контейнеров — автоматизируем обслуживание Docker-окружения для поддержания его в здоровом состоянии.
А вы следите за своим Docker-хозяйством? Как часто делаете очистку? Есть любимые скрипты для работы с контейнерами?
🌐 @helcode
Docker-система заросла образами и контейнерами? Наведем порядок автоматически!
Старые образы занимают гигабайты места, забытые контейнеры висят в фоне, версии устарели.
Вариант 1 (Bash-скрипт для очистки):
#!/bin/bash
docker system prune -f
docker image prune -a --filter "until=24h" -f
docker volume prune -f
Вариант 2 (Python-скрипт для мониторинга):
import docker
client = docker.from_env()
for container in client.containers.list():
stats = container.stats(stream=False)
cpu_usage = stats['cpu_stats']['cpu_usage']['total_usage']
print(f"{container.name}: CPU {cpu_usage}")
Управление жизненным циклом контейнеров — автоматизируем обслуживание Docker-окружения для поддержания его в здоровом состоянии.
А вы следите за своим Docker-хозяйством? Как часто делаете очистку? Есть любимые скрипты для работы с контейнерами?
P.S. Чистый Docker — как убранная комната: приятно работать и ничего не мешает.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Автоматизация работы с логами: парсинг, анализ, алерты
Тонете в логах, но не знаете, что с ними делать? Научимся автоматически анализировать логи и находить проблемы.
Логов много, но информация из них не извлекается. Проблемы обнаруживаются слишком поздно, когда пользователи уже пострадали.
Вариант 1 (Bash + grep + awk):
Вариант 2 (Python-скрипт для сложного анализа):
Лог-аналитика — автоматизируем извлечение ценной информации из логов для оперативного реагирования на проблемы.
А вы анализируете логи автоматически? Какие инструменты используете: ELK Stack, Grafana Loki, или свои скрипты?
🌐 @helcode
Тонете в логах, но не знаете, что с ними делать? Научимся автоматически анализировать логи и находить проблемы.
Логов много, но информация из них не извлекается. Проблемы обнаруживаются слишком поздно, когда пользователи уже пострадали.
Вариант 1 (Bash + grep + awk):
# Найти 10 самых частых ошибок
grep "ERROR" app.log | awk '{print $4}' | sort | uniq -c | sort -nr | head -10
Вариант 2 (Python-скрипт для сложного анализа):
from collections import Counter
errors = []
with open('app.log') as f:
for line in f:
if 'ERROR' in line:
error_type = line.split('ERROR')[-1].split(':')[0].strip()
errors.append(error_type)
print(Counter(errors).most_common(5))
Лог-аналитика — автоматизируем извлечение ценной информации из логов для оперативного реагирования на проблемы.
А вы анализируете логи автоматически? Какие инструменты используете: ELK Stack, Grafana Loki, или свои скрипты?
P.S. Логи — это как медицинская карта пациента: нужно уметь читать между строк, чтобы поставить правильный диагноз.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🫡3
Умные уведомления: фильтрация и агрегация алертов
Slack/Telegram завален уведомлениями, и вы перестали на них реагировать? Сделаем умные алерты, которые приходят только когда это действительно важно.
95% уведомлений — информационный шум. Важные сообщения теряются в потоке мусора.
Вариант 1 (Python-скрипт с логикой):
Вариант 2 (Bash-скрипт с агрегацией):
Управление вниманием — автоматизируем фильтрацию уведомлений, чтобы сосредоточиться на действительно важных событиях.
А как вы боретесь с алертным шумом? Какие правила фильтрации используете?
🌐 @helcode
Slack/Telegram завален уведомлениями, и вы перестали на них реагировать? Сделаем умные алерты, которые приходят только когда это действительно важно.
95% уведомлений — информационный шум. Важные сообщения теряются в потоке мусора.
Вариант 1 (Python-скрипт с логикой):
def should_send_alert(error):
# Не отправляем алерты ночью для некритичных ошибок
if is_night_time() and error.severity == 'LOW':
return False
# Игнорируем известные плавающие ошибки
if error.type in ['KNOWN_FLAPPING_ERROR', 'TEMPORARY_NETWORK_ISSUE']:
return False
return True
Вариант 2 (Bash-скрипт с агрегацией):
# Агрегируем одинаковые алерты за последние 5 минут
alert_count=$(grep -c "CRITICAL_ERROR" /var/log/app.log)
if [ $alert_count -gt 10 ]; then
send_alert "Много критических ошибок: $alert_count за 5 минут"
fi
Управление вниманием — автоматизируем фильтрацию уведомлений, чтобы сосредоточиться на действительно важных событиях.
А как вы боретесь с алертным шумом? Какие правила фильтрации используете?
P.S. Умные алерты — как хороший секретарь: беспокоит только по действительно важным вопросам.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1😱1
Автоматизация тестового окружения: поднимаем и убиваем среды по требованию
Тестовые среды вечно заняты, конфликтуют и работают нестабильно? Сделаем автоматическое создание и уничтожение окружений.
Разработчики неделями ждут свободную тестовую среду, версии конфликтуют, данные перемешаны.
Вариант 1 (Terraform + AWS):
Вариант 2 (Docker Compose):
Эфемерные окружения — автоматизируем создание временных изолированных сред для тестирования.
А как у вас организованы тестовые окружения? Общие для всех, персональные, или создаются на лету?
🌐 @helcode
Тестовые среды вечно заняты, конфликтуют и работают нестабильно? Сделаем автоматическое создание и уничтожение окружений.
Разработчики неделями ждут свободную тестовую среду, версии конфликтуют, данные перемешаны.
Вариант 1 (Terraform + AWS):
resource "aws_instance" "test_env" {
count = 3
ami = "ami-123456"
instance_type = "t3.medium"
tags = {
Name = "test-env-${count.index}"
Owner = var.developer
TTL = "24h"
}
}Вариант 2 (Docker Compose):
version: '3.8'
services:
test-db:
image: postgres:14
environment:
POSTGRES_DB: test_${USER}
Эфемерные окружения — автоматизируем создание временных изолированных сред для тестирования.
А как у вас организованы тестовые окружения? Общие для всех, персональные, или создаются на лету?
P.S. Идеальная тестовая среда — как одноразовая посуда: использовал и выбросил, не нужно мыть.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Docker: контейнер не как деплой-юнит, а как инструмент разработки
Использовать Docker только для продакшена — это видеть лишь половину картины. Контейнер — это идеальная среда для разработки: изолированная, воспроизводимая и идентичная продакшену.
Фраза «у меня на машине работает» — это антипаттерн, который убивает драгоценное время команды.
➤ Вариант 1 (Docker Compose для локального стека): запуск всего необходимого для работы приложения (БД, кэш, брокер сообщений) одной командой, без установки чего-либо кроме Docker на хост-машину.
➤ Вариант 2 (Скрипты для операций внутри контейнера): вместо установки Node.js, Python, Go на свою систему, все команды (
Контейнеризация смещает фокус с настройки среды на написание кода. Разработчик получает «машину времени»: возможность мгновенно переключаться между версиями зависимостей и операционных систем.
Используете ли Вы Docker в повседневной разработке или он остается инструментом для DevOps-инженеров?
🌐 @helcode
Использовать Docker только для продакшена — это видеть лишь половину картины. Контейнер — это идеальная среда для разработки: изолированная, воспроизводимая и идентичная продакшену.
Фраза «у меня на машине работает» — это антипаттерн, который убивает драгоценное время команды.
➤ Вариант 1 (Docker Compose для локального стека): запуск всего необходимого для работы приложения (БД, кэш, брокер сообщений) одной командой, без установки чего-либо кроме Docker на хост-машину.
# docker-compose.yml для локальной разработки
version: '3.8'
services:
app:
build: .
volumes:
- .:/app # Монтируем код для live-перезагрузки
depends_on:
- db
- redis
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
redis:
image: redis:alpine
➤ Вариант 2 (Скрипты для операций внутри контейнера): вместо установки Node.js, Python, Go на свою систему, все команды (
npm install, python manage.py migrate) выполняются внутри временного контейнера с нужным образом.Контейнеризация смещает фокус с настройки среды на написание кода. Разработчик получает «машину времени»: возможность мгновенно переключаться между версиями зависимостей и операционных систем.
Используете ли Вы Docker в повседневной разработке или он остается инструментом для DevOps-инженеров?
P.S. С Docker можно иметь проект на Python 3.6, другой на 3.11 и третий на PyPy, и они никогда не узнают о существовании друг друга.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🔥1
curl + API: ваш универсальный пульт управления
Ручное нажатие кнопок в веб-интерфейсе для управления облачными ресурсами, CI/CD или тикетами — это медленно и нефундаментально. Любой современный сервис предоставляет API, а
Если действие можно выполнить через интерфейс, его почти наверняка можно автоматизировать через API.
➤ Вариант 1 (Создание тикета по событию): скрипт, который при падении мониторинга создает инцидент в Jira или OTRS через API.
➤ Вариант 2 (Массовое управление ресурсами): удаление всех облачных инстансов с определенным тегом или остановка всех пайплайнов старше недели.
➤ Вариант 3 (Тестирование API как часть скрипта): автоматическая проверка здоровья сервиса после деплоя путем запроса к его эндпоинту
Владение
Часто ли Вы обращаетесь к документации по API сервисов, чтобы автоматизировать рутину?
🌐 @helcode
Ручное нажатие кнопок в веб-интерфейсе для управления облачными ресурсами, CI/CD или тикетами — это медленно и нефундаментально. Любой современный сервис предоставляет API, а
curl — это проводник в этот мир.Если действие можно выполнить через интерфейс, его почти наверняка можно автоматизировать через API.
➤ Вариант 1 (Создание тикета по событию): скрипт, который при падении мониторинга создает инцидент в Jira или OTRS через API.
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
https://api.atlassian.com/ex/jira/.../issue \
-d '{"fields": {"summary": "Сервис X недоступен"}}'
➤ Вариант 2 (Массовое управление ресурсами): удаление всех облачных инстансов с определенным тегом или остановка всех пайплайнов старше недели.
➤ Вариант 3 (Тестирование API как часть скрипта): автоматическая проверка здоровья сервиса после деплоя путем запроса к его эндпоинту
/health.Владение
curl для работы с API — это "суперсила". Позволяет связывать между собой разнородные системы, создавая собственные воркфлоу, которые не предусмотрели разработчики этих систем.Часто ли Вы обращаетесь к документации по API сервисов, чтобы автоматизировать рутину?
P.S. Для сложных JSON лучше использовать файл: curl -d @request_body.json. А для отладки незаменим ключ -v.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Сила .gitignore: защита от самого себя
Коммит файлов с паролями, конфигурацией IDE или артефактами сборки — это классическая ошибка, которая случается с каждым.
Человеческая память ненадежна. Доверить ей решение, что можно коммитить, а что нет — наивно.
➤ Вариант 1 (Глобальный
➤ Вариант 2 (Специфичный для языка/инструмента): генерация или использование готовых шаблонов для Python (
➤ Вариант 3 (
Доводилось ли Вам «вычищать» историю репозитория из-за случайно закоммиченного секрета? Или .gitignore всегда стоит на страже?
🌐 @helcode
Коммит файлов с паролями, конфигурацией IDE или артефактами сборки — это классическая ошибка, которая случается с каждым.
.gitignore — это не список, это оборонительный периметр Вашего репозитория.Человеческая память ненадежна. Доверить ей решение, что можно коммитить, а что нет — наивно.
➤ Вариант 1 (Глобальный
~/.gitignore_global): для файлов, которые никогда не должны попадать ни в один репозиторий: .DS_Store, Thumbs.db, *.swp, файлы конфигурации Вашего редактора.# Настройка
git config --global core.excludesfile ~/.gitignore_global
➤ Вариант 2 (Специфичный для языка/инструмента): генерация или использование готовых шаблонов для Python (
__pycache__/, *.pyc), Node.js (node_modules/), Java (target/), Go (/vendor/).➤ Вариант 3 (
.gitignore как часть инициализации проекта): автоматическое создание адекватного .gitignore при старте нового проекта через git init или инструменты вроде cookiecutter..gitignore — это проактивная автоматизация. Это предотвращение ошибки до ее совершения. Это один из немногих файлов в проекте, который требует максимально педантичного отношения.Доводилось ли Вам «вычищать» историю репозитория из-за случайно закоммиченного секрета? Или .gitignore всегда стоит на страже?
P.S. Есть сервисы вроде git-secrets или truffleHog, которые сканируют историю на наличие ключей и паролей. Но лучше не допускать их попадания туда.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
systemd: сервисы, которые умеют себя обслуживать
Писать скрипты на Bash для запуска демонов и их перезапуска при падении — это изобретение велосипеда.
Скрипт в
➤ Вариант 1 (Базовая устойчивость): простая конфигурация юнита с
➤ Вариант 2 (Зависимости и порядок): правильное указание
➤ Вариант 3 (Ограничение ресурсов): секция
Какие возможности systemd, помимо простого start/stop, Вы используете чаще всего? Мониторинг через journalctl, cgroups или таймеры?
🌐 @helcode
Писать скрипты на Bash для запуска демонов и их перезапуска при падении — это изобретение велосипеда.
systemd — это фреймворк для управления жизненным циклом служб со встроенными возможностями самовосстановления.Скрипт в
/etc/init.d/, который не умеет корректно обрабатывать сигналы и логировать, — это наследие прошлого.➤ Вариант 1 (Базовая устойчивость): простая конфигурация юнита с
Restart=on-failure и RestartSec=5 уже делает сервис намного надежнее.[Service]
ExecStart=/usr/bin/my_daemon
Restart=on-failure
RestartSec=5
StandardOutput=journal
➤ Вариант 2 (Зависимости и порядок): правильное указание
After=network.target и Requires=postgresql.service гарантирует, что сервис запустится только когда его зависимости готовы.➤ Вариант 3 (Ограничение ресурсов): секция
[Slice] и MemoryMax позволяют ограничить потребление памяти, предотвращая «проседание» всей системы из-за одной утечки.systemd — это автоматизация управления процессами на уровне ОС. Он превращает приложение из «просто исполняемого файла» в управляемый, наблюдаемый и устойчивый сервис.Какие возможности systemd, помимо простого start/stop, Вы используете чаще всего? Мониторинг через journalctl, cgroups или таймеры?
P.S. Споры о systemd — бесконечны, но его распространенность в современном Linux-мире делает его знание обязательным. Это не всегда выбор, но это реальность.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9👎2❤1
Товарищи, приветствую!
😴 У меня был небольшой "ленивый" период, чуток утомился от всех проектов и работ. Сегодня, после длительного перерыва, зашёл на Хабр, где обнаружил весьма странную интеграцию с SourceCraft (что-то в стиле GitHub). А именно, появилась кнопка "объяснить код" под любым блоком кода.
🤯 Для меня это смешанные чувства.
С одной стороны - скорость и доступность, так как нет необходимости гуглить непонятный код, искать дополнительные источники.
С другой - теряется "хабровская" экспертиза: живые дискуссии, опыт людей, разные мнения. Да, зачастую спорные, но ценные ведь...
Очень интересно узнать Ваше отношение к этой интеграции:
⏺️ Как Вам сама идея встраивания БЯМ в платформу? Логичное развитие в связи с тенденциями или потеря уникальности площадки?
⏺️ Не вытеснит ли это человеческое взаимодействие?
⏺️ Какова дальнейшая судьба у платформы? Хороший шаг в сторону трендов или слом основной концепции?
Также, если вдруг у Вас уже есть опыт использования SourceCraft - буду очень рад услышать отзывы, кейсы, мнения. Всё, что угодно.
😊 Спасибо, что делитесь мнением - для меня это важный ориентир в понимании того, как сейчас меняется потребление технической информации.
Давайте обсудим!
С одной стороны - скорость и доступность, так как нет необходимости гуглить непонятный код, искать дополнительные источники.
С другой - теряется "хабровская" экспертиза: живые дискуссии, опыт людей, разные мнения. Да, зачастую спорные, но ценные ведь...
Очень интересно узнать Ваше отношение к этой интеграции:
Также, если вдруг у Вас уже есть опыт использования SourceCraft - буду очень рад услышать отзывы, кейсы, мнения. Всё, что угодно.
Давайте обсудим!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Шаблонизация конфигов: один источник правды для десятков серверов
Ручное редактирование одного и того же конфигурационного файла на множестве серверов с небольшими различиями (имена хостов, IP-адреса) — это прямая дорога к рассогласованию и ошибкам.
Конфигурационный файл, хранящийся вручную на сервере, — это «дрейф конфигурации» в чистом виде.
➤ Вариант 1 (Jinja2 + Ansible): использование шаблонизатора для генерации итогового конфига из переменных. Один шаблон
➤ Вариант 2 (
➤ Вариант 3 (HashiCorp Consul Template): динамическая генерация конфигов на основе данных из Service Discovery (Consul). Конфиг обновляется автоматически при изменении сервисной сетки.
Шаблонизация — это философия «инфраструктуры как код» (IaC), примененная к конфигурациям. Это гарантия идемпотентности: применение одного и того же шаблона с одними и теми же переменными всегда дает один и тот же результат.
Как Вы управляете конфигурациями, которые должны немного отличаться на разных хостах?
🌐 @helcode
Ручное редактирование одного и того же конфигурационного файла на множестве серверов с небольшими различиями (имена хостов, IP-адреса) — это прямая дорога к рассогласованию и ошибкам.
Конфигурационный файл, хранящийся вручную на сервере, — это «дрейф конфигурации» в чистом виде.
➤ Вариант 1 (Jinja2 + Ansible): использование шаблонизатора для генерации итогового конфига из переменных. Один шаблон
nginx.conf.j2 порождает десятки корректных конфигов для разных сред.# nginx.conf.j2
server {
listen 80;
server_name {{ server_name }};
root {{ web_root }};
}
➤ Вариант 2 (
envsubst): простая замена переменных окружения прямо в файле на этапе запуска контейнера или сервиса. Идеально для Docker.# В Dockerfile или скрипте запуска
envsubst < /etc/nginx/config.template > /etc/nginx/nginx.conf
➤ Вариант 3 (HashiCorp Consul Template): динамическая генерация конфигов на основе данных из Service Discovery (Consul). Конфиг обновляется автоматически при изменении сервисной сетки.
Шаблонизация — это философия «инфраструктуры как код» (IaC), примененная к конфигурациям. Это гарантия идемпотентности: применение одного и того же шаблона с одними и теми же переменными всегда дает один и тот же результат.
Как Вы управляете конфигурациями, которые должны немного отличаться на разных хостах?
P.S. Золотое правило: в репозитории должен храниться шаблон и значения переменных, но никогда — готовый конфиг с «зашитыми» значениями для конкретного окружения.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
tar с автоматом: упаковка логов по расписанию
Ручной сбор логов с серверов в архив «перед отпуском» — это операция темных веков. Архивация должна быть предсказуемой, автоматической и не требующей внимания.
Лог-файл, который никогда не ротируется и не архивируется, — это бомба замедленного действия для дискового пространства.
➤ Вариант 1 (Cron + Bash): классический скрипт, который ищет логи старше N дней, упаковывает их в датированный архив
➤ Вариант 2 (Использование
➤ Вариант 3 (Архивация в облако): непосредственная упаковка и загрузка через CLI облачного провайдера (AWS CLI
Автоматическая архивация — это не просто спасение места. Это создание упорядоченной истории, которую в любой момент можно использовать для расследования инцидента или аудита.
Часто ли Вы возвращаетесь к старым логам? Или они обычно умирают тихо, так и не будучи прочитанными?
🌐 @helcode
Ручной сбор логов с серверов в архив «перед отпуском» — это операция темных веков. Архивация должна быть предсказуемой, автоматической и не требующей внимания.
Лог-файл, который никогда не ротируется и не архивируется, — это бомба замедленного действия для дискового пространства.
➤ Вариант 1 (Cron + Bash): классический скрипт, который ищет логи старше N дней, упаковывает их в датированный архив
tar.gz и загружает в объектное хранилище.#!/bin/bash
find /var/log/app -name "*.log" -mtime +7 | tar -czf /backup/logs-$(date +%Y%m%d).tar.gz -T -
find /var/log/app -name "*.log" -mtime +7 -delete
➤ Вариант 2 (Использование
logrotate): стандартный, но часто недооцененный инструмент. Можно настроить пост-скрипт для отправки заархивированного файла куда нужно.# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
postrotate
/usr/bin/rsync /var/log/myapp/*.gz backup-server:/logs/
endscript
}
➤ Вариант 3 (Архивация в облако): непосредственная упаковка и загрузка через CLI облачного провайдера (AWS CLI
s3 cp, gcloud storage cp) в один шаг.Автоматическая архивация — это не просто спасение места. Это создание упорядоченной истории, которую в любой момент можно использовать для расследования инцидента или аудита.
Часто ли Вы возвращаетесь к старым логам? Или они обычно умирают тихо, так и не будучи прочитанными?
P.S. Всегда проверяйте, что архивируете, а не удаляете единственную копию лога, который еще нужен для отладки. Скрипт должен быть идиотодостойким.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Философия автоматизации: если задача скучна, ее не должен выполнять человек
Ключевой вопрос не «МОЖНО ли это автоматизировать?», а «СКОЛЬКО РАЗ это придется сделать?». Если ответ больше одного — это кандидат на автоматизацию.
Человеческий мозг — инструмент для творчества и решения сложных, нестандартных проблем. Его использование для рутинных, повторяющихся действий — расточительство.
➤ Этап 1 (Фиксация процесса): прежде чем автоматизировать, необходимо максимально точно описать шаги вручную. Часто уже на этом этапе обнаруживаются избыточные действия.
➤ Этап 2 (Выбор инструмента): не обязательно писать сложный скрипт. Иногда достаточно макроса в IDE, плагина для браузера, функции в
➤ Этап 3 (Итеративное улучшение): первая версия автоматизации может быть неидеальна. Важно, чтобы она уже работала и экономила время. Доработки — потом.
Автоматизация — это инвестиция. Первоначальные затраты времени окупаются с каждым последующим выполнением задачи. Это чистый выигрыш в производительности и снижение вероятности ошибки.
Какая самая простая, но самая полезная автоматизация была внедрена в Ваш рабочий процесс?
🌐 @helcode
Ключевой вопрос не «МОЖНО ли это автоматизировать?», а «СКОЛЬКО РАЗ это придется сделать?». Если ответ больше одного — это кандидат на автоматизацию.
Человеческий мозг — инструмент для творчества и решения сложных, нестандартных проблем. Его использование для рутинных, повторяющихся действий — расточительство.
➤ Этап 1 (Фиксация процесса): прежде чем автоматизировать, необходимо максимально точно описать шаги вручную. Часто уже на этом этапе обнаруживаются избыточные действия.
➤ Этап 2 (Выбор инструмента): не обязательно писать сложный скрипт. Иногда достаточно макроса в IDE, плагина для браузера, функции в
.bashrc или простого правила в cron.➤ Этап 3 (Итеративное улучшение): первая версия автоматизации может быть неидеальна. Важно, чтобы она уже работала и экономила время. Доработки — потом.
Автоматизация — это инвестиция. Первоначальные затраты времени окупаются с каждым последующим выполнением задачи. Это чистый выигрыш в производительности и снижение вероятности ошибки.
Какая самая простая, но самая полезная автоматизация была внедрена в Ваш рабочий процесс?
P.S. Иногда автоматизация одной мелкой, но раздражающей задачи приносит больше морального удовлетворения, чем большой проект.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3