Helcode | Хелкод | Скрипты и автоматизация
993 subscribers
52 photos
34 links
☎️ Контакты для связи: @helcodeadm
Download Telegram
.gitignore: искусство прятать концы в воду

Сколько раз Вы видели коммиты с файлами node_modules/, .DS_Store, *.pyc или, не дай бог, .env с продакшн-ключами? Это мусор, который не должен быть в репозитории. Файл .gitignore — наш лучший друг и санитар.

Создаем в корне проекта файл .gitignore и добавляем в него шаблоны:
# Логи и кэш
*.log
.npm/

# Файлы ОС
.DS_Store
Thumbs.db

# Файлы окружения (НЕ КОММИТИТЬ НИКОГДА!)
.env
config.ini

# Зависимости (для Node.js)
node_modules/

# Артефакты сборки (для Python)
__pycache__/
*.pyc


Git проверяет файл .gitignore перед тем, как отслеживать изменения. Если имя файла или папки совпадает с шаблоном внутри — Git делает вид, что этого объекта не существует. Это экономит место, время и нервы.

Поделитесь своим самым ценным или неочевидным правилом в .gitignore! Что такого Вы добавили, о чем другие могут не знать?

Закоммитить node_modules — это как отправить посылку, предварительно наклеив на нее всю пыль и мусор со склада.

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Rebase vs Merge: холивар, который мы заслужили

Нужно влить свою ветку в main. Два лагеря, две религии. Одни кричат: «Rebase — чистая история!». Другие: «Merge — правдивая история!». Кто прав? Давайте без драки, только хардкор.

Merge (слияние): cоздает коммит с двумя родителями.
git checkout main
git merge feature/branch

История: --o--o--o--m (где m — merge-коммит)

Rebase (перебазирование): перемещает наши коммиты на верхушку main, как будто мы начали работу только что.
git checkout feature/branch
git rebase main

История: --o--o--o--o--o (идеально прямая линия)

➤ Merge сохраняет всю историю разработки, включая факт ветвления. Безопасен для публичных веток.
➤ Rebase переписывает историю, делая ее линейной и чистой. Отлично подходит для локальной чистки перед пулл-реквестом. Опасно использовать на общих ветках.

Ставьте реакцию:

❤️ — за Merge (история должна быть правдой!).

🔥 — за Rebase (чистота и порядок превыше всего!).

Использовать git rebase на общей ветке - это как взять чужой паспорт и начать вклеивать в него новые фотографии.

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥4
Git Hooks: Твой личный робот-помощник

Хотите, чтобы код автоматически прогонял тесты перед каждым коммитом? Или чтобы линтер проверял стиль? Или чтобы скрипт развертывания сам запускался после пушa в main? Пора познакомиться с Git Hooks.

Хуки лежат в папке .git/hooks/. Пример пре-коммит хука (.git/hooks/pre-commit), который не даст закоммитить код, не прошедший линтинг:
#!/bin/sh
echo "Запуск линтера..."
if ! eslint --cache --fix .; then
echo "Линтер нашел ошибки! Коммит отменен."
exit 1
fi
git add . # Добавляем исправления, сделанные линтером

Не забудьте дать файлу права на выполнение: chmod +x .git/hooks/pre-commit

Git Hooks — это скрипты, которые Git запускает в ответ на определенные события (commit, push, rebase и т.д.). Они выполняются локально и позволяют автоматизировать рутину и внедрить контроль качества.

Какой самый полезный или безумный Git Hook Вы когда-либо использовали или хотели бы использовать? Поделитесь идеями!

Настроить pre-commit хук — это как нанять очень принципиального секьюрити, который не пустит Вас на работу в пижаме. Иногда раздражает, но в итоге все только выигрывают.

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
Параллельное выполнение задач с xargs

Нужно обработать много файлов или выполнить много команд параллельно?

xargs с параллельным выполнением

# Поиск и удаление старых логов параллельно
find /var/log -name "*.log" -mtime +30 | xargs -P 4 -I {} rm -v {}

# Параллельная загрузка URL из файла
cat urls.txt | xargs -P 8 -I {} curl -O {}

# Массовое конвертирование изображений
find ./images -name "*.jpg" | xargs -P 2 -I {} convert {} -resize 50% resized/{}

# Обработка с пробелами в именах файлов
find . -name "*.txt" -print0 | xargs -0 -P 4 -I {} wc -l {}


Ключевые параметры:
-P N - количество параллельных процессов
-I {} - замена входящих данных
-0 - для работы с именами с пробелами
-n 1 - передавать по одному аргументу

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👌3👍2
xargs: для тех, кто устал копировать вывод команд

Знакомо: ls | grep .txt показывает файлы, а чтобы удалить их все, приходится либо копировать каждый, либо писать сложную конструкцию? xargs — это мост между stdout одной команды и аргументами другой.

Найдем все .tmp файлы и удалим их одной командой:
find . -name "*.tmp" | xargs rm

Или более безопасный вариант с обработкой пробелов в именах:
find . -name "*.tmp" -print0 | xargs -0 rm


xargs берет поток данных с входа (например, список файлов от find) и превращает его в аргументы для указанной команды (rm). Без xargs команда rm не знала бы, что делать со списком файлов из stdin.

А вы часто используете xargs? Или предпочитаете другие способы (циклы for, -exec в find)?


xargs — это как шеф-повар, который берет ингредиенты (список файлов) и готовит из них блюдо (выполняет команду). Без него пришлось бы все делать вручную.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
xargs -I: Когда нужно подставить аргумент именно В ТО САМОЕ МЕСТО

А что если команда ожидает аргумент не в конце, а в середине? Например, нужно переименовать файлы или выполнить сложную операцию? Обычный xargs не справится — тут нужен флаг -I.

Допустим, хотим создать бэкапы всех .py файлов:
find . -name "*.py" | xargs -I {} cp {} {}.backup

Или переименовать файлы, добавив префикс:
ls *.txt | xargs -I FILE mv FILE PREFIX_FILE


Флаг -I позволяет задать placeholder (обычно {}), который будет заменен на каждый элемент входа. Это дает полный контроль над тем, куда подставляются аргументы в команде.

Попробуйте сами! Создайте тестовые файлы и переименуйте их с помощью xargs -I. Какой placeholder Вы используете?
1. {} — классика
2. FILE — для ясности
3. Что-то свое — напишите в комментах!


xargs -I {} — это как заказать бургер "все кроме котлеты" — полный контроль над тем, что и куда попадает.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔1
xargs + parallel: скорость света для массовых операций

Нужно обработать 1000 файлов, но делать это последовательно — слишком долго? xargs может запускать процессы параллельно, используя все ядра процессора!

Скачаем несколько URL параллельно (4 процесса одновременно):
cat urls.txt | xargs -n 1 -P 4 wget


Или обработаем изображения параллельно:
find . -name "*.jpg" | xargs -n 1 -P 8 convert -resize 50%


- -P N — запускает N процессов параллельно
- -n 1 — передает по одному аргументу каждому процессу
Это превращает линейную обработку в конвейерную, ускоряя работу в разы!

А вы используете параллельное выполнение? Поделитесь своими кейсами!

Параллельный xargs — это как нанять бригаду рабочих вместо одного. Главное — не переборщить, а то устроите DDoS самому себе!


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥1
xargs в бою: реальные сценарии из жизни DevOps

Теория — это хорошо, но давайте посмотрим, как xargs спасает в реальных рабочих ситуациях. От массового деплоя до экстренного фикса проблем.

Сценарий 1: массовый деплой на несколько серверов
cat servers.txt | xargs -I SERVER ssh SERVER "cd /app && git pull && systemctl restart myapp"


Сценарий 2: поиск и убийство заблокированных процессов
ps aux | grep "zombie_process" | awk '{print $2}' | xargs kill -9


Сценарий 3: пакетное обновление Docker контейнеров
docker ps -aq | xargs docker stop
docker ps -aq | xargs docker rm


Сила xargs в комбинации с другими утилитами: find, grep, awk, docker. Он становится клеем, который связывает отдельные команды в мощные автоматизированные пайплайны.

Поделитесь своим самым крутым или неочевидным использованием xargs! Какой пайплайн с xargs вы считаете своим козырем?

xargs в руках опытного инженера — это как швейцарский нож: может и консервную банку открыть, и палатку поставить, и даже починить машину в крайнем случае. 🔧


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
Пароли — не главное? Почему двухфакторка важнее сложного пароля

Ставим 20-символьный пароль с иероглифами, но все равно попадаем на фишинговый сайт. Реальность: пароль — самый уязвимый фактор аутентификации. Пора поговорить про 2FA.

Пример настройки 2FA в командной строке Linux (для SSH):
# Устанавливаем Google Authenticator PAM
sudo apt install libpam-google-authenticator

# Настраиваем для пользователя
google-authenticator

Ответь (y - yes):
➤ y — использовать time-based tokens
➤ y — обновлять конфиг
➤ y — разрешить только одно использование кода
➤ y — разрешить 3 попытки за 30 секунд

2FA (Two-Factor Authentication) — это «что-то, что Вы знаете» (пароль) + «что-то, что у Вас есть» (телефон/токен). Даже если украдут пароль, без второго фактора злоумышленник не войдет.

А какой 2FA вы используете?

P.S. Если интересна тема ИБ - сообщайте в комментарии, раскрою всё подробнее!


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73🤔1
Шифрование дисков: что будет, если ноутбук украдут в аэропорту?

Представим: Вы работали в кафе, отошли на 5 минут, а ноутбука нет. Без шифрования злоумышленник за 10 минут получит все Ваши данные, пароли и доступ к корпоративной сети.

BitLocker (Windows):
# Проверить статус BitLocker
Manage-bde -status C:

# Включить шифрование
Manage-bde -on C: -RecoveryPassword "Добавить_сюда_ключ"


VeraCrypt (кроссплатформенный аналог):
# Создание зашифрованного контейнера
veracrypt -t -c


Полное шифрование диска преобразует все данные в нечитаемый формат без ключа дешифрования. Даже при физическом доступе к диску данные защищены.

А вы шифруете свои диски? Поделитесь опытом!

Шифрование диска — это как хранить драгоценности в сейфе, а не под подушкой. Вору будет проще унести весь сейф, чем открыть его.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
2🤝1🫡1
PowerShell vs CMD: пора переезжать?

Все еще пишете батники? PowerShell — это не просто замена CMD, а полноценная среда автоматизации с доступом ко всей мощи .NET.

CMD (ограниченно):
dir | find "txt"


PowerShell:
# Найти файлы и отсортировать по размеру
Get-ChildItem -Filter "*.txt" | Sort-Object Length -Descending

# Работа с объектами, а не текстом
Get-Process | Where-Object { $_.CPU -gt 100 }


PowerShell работает с объектами .NET, а не с текстом как CMD. Это дает невероятную гибкость: можно фильтровать, сортировать, группировать данные на лету.

А вы уже перешли на PowerShell? Что стало главным открытием?

Переход с CMD на PowerShell — как пересаживаться с велосипеда на спортивный автомобиль. Оба едут, но с разной скоростью и комфортом.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Автоматизация рутины: планировщик задач на стероидах

Ежедневно делаете одни и те же действия: бэкапы, очистка временных файлов, проверка обновлений? Пора доверить это Планировщику задач.

Создание задачи через PowerShell:
$Action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\scripts\backup.ps1"
$Trigger = New-ScheduledTaskTrigger -Daily -At "02:00"
Register-ScheduledTask -TaskName "NightlyBackup" -Action $Action -Trigger $Trigger -Description "Automated nightly backup"


Ежедневный бэкап (backup.ps1):
Copy-Item "C:\ImportantData" "D:\Backups\Data_$(Get-Date -Format 'yyyyMMdd')" -Recurse


Планировщик задач Windows — это cron для бедных? Нет, это мощный инструмент, который может запускать задачи по событиям, расписанию, при простое системы.

Какую рутину вы автоматизировали через Планировщик? Поделитесь самыми полезными сценариями!

Планировщик задач — это личный ассистент, который работает 24/7 без отпуска и больничных. Главное — правильно поставить ему задачи.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32😁1🥴1
Windows Subsystem for Linux: лучшее из двух миров

Нужны утилиты Linux, но переустанавливать ОС не хочется? WSL2 позволяет запускать настоящий Linux внутри Windows без виртуализации.

Установка WSL:
# Одна команда для установки
wsl --install

# Или конкретный дистрибутив
wsl --install -d Ubuntu


Пример автоматизации:
# В WSL: мониторинг файлов Windows
inotifywait -m /mnt/c/Users/MyUser/Downloads | while read path action file; do
echo "New file: $file"
# Автоматическая обработка загруженных файлов
done


WSL2 — это не эмулятор, а полноценное ядро Linux, работающее параллельно с Windows. Можно запускать любые Linux-утилиты и даже Docker.

А вы используете WSL? Для каких задач он незаменим?

WSL — это как иметь секретную комнату с Linux, куда можно сбежать из Windows, когда нужен grep или ssh.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣43
Автогенерация отчетов: PowerShell + Excel

Каждую неделю тратите часы на сбор одинаковых отчетов? PowerShell может автоматически собирать данные и выгружать в красивый Excel-файл.

Пример:
# Создание Excel через COM объект
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$workbook = $excel.Workbooks.Add()
$worksheet = $workbook.Worksheets.Item(1)

# Заполнение данными о системе
$worksheet.Cells.Item(1,1) = "Computer Name"
$worksheet.Cells.Item(1,2) = $env:COMPUTERNAME

$worksheet.Cells.Item(2,1) = "Disk Space"
$disks = Get-WmiObject Win32_LogicalDisk
$row = 2
foreach ($disk in $disks) {
$worksheet.Cells.Item($row,1) = $disk.DeviceID
$worksheet.Cells.Item($row,2) = "{0:N2} GB" -f ($disk.FreeSpace/1GB)
$row++
}

# Сохранение
$workbook.SaveAs("C:\Reports\SystemReport_$(Get-Date -Format 'yyyyMMdd').xlsx")
$excel.Quit()


Через COM-объекты PowerShell может управлять любыми приложениями Windows: Excel, Word, Outlook. Это открывает безграничные возможности для автоматизации отчетности.

А вы автоматизируете создание отчетов? Какие данные чаще всего нужно собирать?

PowerShell + Excel — это как нанять стажера, который идеально оформляет таблицы и никогда не ошибается. Только без зарплаты и с гарантией результата.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Мониторинг без бюджета: своя система на PowerShell

Нет денег на дорогие системы мониторинга? Можно создать свою за несколько часов на PowerShell с уведомлениями в Telegram.

# Мониторинг свободного места на диске
function Check-DiskSpace {
$disks = Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3"
foreach ($disk in $disks) {
$freePercent = ($disk.FreeSpace / $disk.Size) * 100
if ($freePercent -lt 10) {
Send-TelegramAlert "⚠️ LOW DISK SPACE: $($disk.DeviceID) - $freePercent% free"
}
}
}

# Отправка в Telegram
function Send-TelegramAlert {
param($Message)
$token = "YOUR_BOT_TOKEN"
$chatId = "YOUR_CHAT_ID"
$url = "https://api.telegram.org/bot$token/sendMessage"

Invoke-RestMethod -Uri $url -Method Post -Body @{
chat_id = $chatId
text = $Message
} | Out-Null
}

# Бесконечный цикл проверки
while ($true) {
Check-DiskSpace
Start-Sleep -Seconds 300 # Проверка каждые 5 минут
}


С помощью PowerShell можно мониторить: место на дисках, загрузку CPU, память, сервисы, логи событий. А через REST API отправлять уведомления куда угодно.

Что бы вы добавили в самодельную систему мониторинга? Делитесь идеями!

Самодельный мониторинг на PowerShell — это как собрать сигнализацию из детского конструктора. Работает неидеально, но зато бесплатно и точно знаешь, как починить.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥2👎1🤔1
Война с плавающим багом в CI

Ваш CI-пайплайн падает раз в два дня из-за плавающего теста, и все делают вид, что не замечают? Сегодня объявляем ему войну. Не игнорируем, а автоматизируем поимку.

Это классика: "У меня работает", "Heisenbug*", который исчезает при попытке отладки. Команда привыкает к красному статусу и перестает ему доверять, что убивает саму идею CI. Ручной перезапуск — это не решение, это признание поражения.

➤ Вариант 1 (Bash + Cron): Пишем скрипт, который дергает API вашего CI (например, Jenkins/GitLab), проверяет последний запуск падающего джоба и в случае ошибки автоматически перезапускает его, отправляя уведомление в Slack.
# Пример для GitLab CI с использованием jq и curl
PIPELINE_STATUS=$(curl -s --header "PRIVATE-TOKEN: <your_token>" "https://gitlab.com/api/v4/projects/<project_id>/pipelines/latest" | jq -r '.status')
if [ "$PIPELINE_STATUS" = "failed" ]; then
curl --request POST --header "PRIVATE-TOKEN: <your_token>" "https://gitlab.com/api/v4/projects/<project_id>/pipelines/latest/retry"
curl -X POST -H 'Content-type: application/json' --data '{"text":"Плавающий тест снова упал. Автоперезапуск...»"}' $SLACK_WEBHOOK
fi


➤ Вариант 2 (GitHub Actions): используем schedule и джоб с условием для автоматического перезапуска только конкретного флаки-теста.
jobs:
retry_flaky_test:
if: failure() && contains(github.event.head_commit.message, 'retry flaky test')
runs-on: ubuntu-latest
steps:
- name: Retry the flaky test suite
run: |
echo "Автоматический ретрай запущен"


Речь об устойчивости и проактивном мониторинге. Система не должна полагаться на бдительность человека. Мы встраиваем механизм самовосстановления для известных, но трудноустранимых проблем. Это тот же принцип, что и в livenessProbe в Kubernetes: если система нездорова, ее нужно перезапустить, прежде чем бить в колокола.

А в вашей команде есть "призрачный" баг? Как вы с ним боретесь: пишете сложные логи, ставите ретраи или просто молитесь?

P.S. Автоматический ретрай — это не починка бага, это костыль. Но лучше автоматический костыль, чем кривые костыли ручных ретраев.


*Гейзенбаг - жаргонный термин, используемый в программировании для описания программной ошибки, которая исчезает или меняет свои свойства при попытке её обнаружения.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
Один скрипт для владения всем. Поднимаем окружение за 60 секунд.

Тратите час на подготовку тестового окружения для нового разработчика? Или для себя на чистой машине? Пора это автоматизировать одним скриптом. "It works on my machine" должно умереть.

README.md с пунктами "установи это, сконфигурируй то, выполни вон ту команду" — это источник ошибок и потеря времени. Расхождение в версиях, пропущенные переменные окружения, забытые миграции БД.

➤ Вариант 1 (Vagrant + Shell): классика жанра. Vagrantfile описывает виртуальную машину, а вложенный shell-скрипт делает всю грязную работу.
➤ Вариант 2 (Docker Compose): идеально для микросервисных и изолированных окружений. Один файл docker-compose.yml поднимает БД, кеш, брокер сообщений и ваше приложение.
version: '3.8'
services:
db:
image: postgres:14
environment:
POSTGRES_DB: myapp
cache:
image: redis:alpine
app:
build: .
depends_on:
- db
- cache


➤ Вариант 3 (Ansible Playbook): удобно для физических серверов и тонкой настройки. Ansible тащит за собой философию идемпотентности.
- name: Set up development environment
hosts: localhost
tasks:
- name: Ensure Node.js is installed
package:
name: nodejs
state: present


Это декларативный подход в миниатюре. Вы описываете *желаемое состояние* окружения (софт, версии, конфиги), а инструмент приводит систему к этому состоянию. Больше никаких "мануалов". Этот же принцип масштабируется до Terraform для облаков и Kubernetes для оркестрации.

А вы как поднимаете дев-окружение? Старый добрый Vagrant, модный DevContainer, или может вообще Nix? Поделитесь своими кейсами.

P.S. Потратьте 4 часа на написание скрипта, который сэкономит 100 часов вашей команды. Математика простая.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
Самолечение для Kubernetes: Beyond `kubectl get pods`

kubectl get pods | grep CrashLoopBackOff - это не диагноз, это крик о помощи. Давайте научим кубер самолечению, чтобы он не просто сообщал о проблеме, а пытался ее исправить.

В сотый раз получаем алерт, что под упал. В сотый раз вручную делаем kubectl delete pod .... Это цифровая "яжемать :)", а не работа инженера. Система должна заботиться о себе сама.

➤ Вариант 1 (Нативные механизмы K8s): livenessProbe и readinessProbe — это основа. Если проба живучести падает, kubelet убивает и пересоздает контейнер.
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 10


➤ Вариант 2 (Operator Pattern): для сложных stateful приложений (БД, Kafka). Кастомный контроллер (Operator) следит за состоянием и может делать сложные вещи: делать бэкап, ребалансировать партиции*, увеличивать объем хранилища.

➤ Вариант 3 (Скрипт на Bash/Python + CronJob): если нативных механизмов мало. Например, скрипт, который проверяет логи на наличие конкретной ошибки и выполняет кастомную операцию по ее исправлению.
# Пример: поиск и лечение утечки памяти
if kubectl logs my-pod --since=10m | grep -q "OutOfMemoryError"; then
kubectl rollout restart deployment my-app
fi


Это воплощение принципа "выбирай исправление, а не оповещение". Мы движемся от мониторинга ("что-то сломалось") к автоматическому реагированию ("я уже пытаюсь это починить"). Это краеугольный камень самоцелительных (self-healing) систем.

А ваши поды умеют лечить себя сами? Используете только `livenessProbe` или пишете кастомные операторы? Давайте обсудим, какие сценарии самолечения самые крутые.

P.P.S. Идеал — это когда вы спокойно спите, а ваш кластер ночью сам перезапускает поды, рестартит деплоименты и даже делает кофе. Ну, почти.


*Партиции (или секции) — это отдельные физические или логические части, на которые разбиваются большие наборы данных, например, таблицы в базах данных или разделы в системах обработки данных.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥1
Идемпотентность: cкрипт не должно быть больно запустить дважды.

Боитесь запустить скрипт развертывания во второй раз? Он создаст дубликаты файлов, перезапишет конфиги и сломает всё? Поздравляю, ваш скрипт не идемпотентен. Сегодня учимся писать скрипты, которые безопасно запускать сколько угодно раз.

"Скрипт сработал, но я не уверен... Запустить еще раз на всякий случай? Ой, а теперь всё сломалось". Знакомо? Это следствие императивного подхода без проверок.

➤ Вариант 1 (Bash): проверяем существование файла, директории, запущенного процесса.
# Вместо простого touch
if [ ! -f "/etc/config.yaml" ]; then
touch /etc/config.yaml
cp default_config.yaml /etc/config.yaml
fi


➤ Вариант 2 (Ansible): вся философия Ansible построена на идемпотентности. Каждая таска сама проверяет, нужно ли что-то менять.
- name: Ensure user "deploy" exists
user:
name: deploy
state: present
groups: sudo
# Запускайте хоть 1000 раз — пользователь будет создан только один раз.


➤ Вариант 3 (Terraform): terraform apply вычисляет разницу между желаемым и текущим состоянием и применяет только необходимые изменения. Это апофеоз декларативной идемпотентности.

Идемпотентность — это свойство операции, при котором ее многократное выполнение дает тот же результат, что и однократное. Как перезагрузка страницы. Это основа надежности. Это позволяет безопасно ретраить операции, применять конфиги и не бояться "лишних" запусков.

А ваши скрипты идемпотентны? Как вы этого добиваетесь? if-проверки, флаги --force, или доверяете только декларативным инструментам?

P.S. Идемпотентный скрипт — это как вежливый человек: сколько раз ни спроси, ответит одинаково и не разозлится.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6💯1
Скрипт-помощник для Git. Автоматизируем рутину.

Ваш ежедневный ритуал: git add ., git commit -m "fix", git push, git checkout dev, git pull, git merge feature/...... Пора делегировать это роботу.

Однообразные последовательности Git-команд — это идеальный кандидат для автоматизации. Они отнимают время, и в них легко ошибиться, сделав git push --force не в ту ветку.

➤ Вариант 1 (Git Aliases): просто и эффективно прямо в .gitconfig.
[alias]
co = checkout
cm = commit -m
br = branch
lol = log --oneline --graph --all
publish = !git push -u origin $(git branch --show-current)


➤ Вариант 2 (Bash/Zsh Functions): для более сложной логики.
# Поместить в ~/.bashrc или ~/.zshrc
gup() {
git add . && git commit -m "$1" && git push
}
# Использование: `gup "мой коммит"`


➤ Вариант 3 (Node.js / Python-скрипт): для комплексных операций, например, создания Pull Request. Используем GitHub CLI (gh).
// Использование: node pr.js "My feature"
const { execSync } = require('child_process');
const title = process.argv[2] || 'Default title';
execSync(`gh pr create --title "${title}" --body "" --base dev`, { stdio: 'inherit' });


Это автоматизация рабочих процессов (Workflow Automation). Вы идентифицируете повторяющийся паттерн действий (часто кросс-платформенный: терминал, браузер, IDE) и упаковываете его в единую команду. Это снижает когнитивную нагрузку и предотвращает ошибки.

А какие у вас есть самые полезные гитовые алиасы или скрипты? Поделитесь своими "магическими заклинаниями" в комментах!

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM