DevOps Brain 🧠
1.21K subscribers
127 photos
16 videos
119 links
Пишу про kubernetes, terraform, linux, сети, автоматизации и полезные тулзы. Без спама и щитпостинга.

Хотите пообщаться? @devopsbrain_chat

Автор: @itcaat
Download Telegram
📍 Карта канала

Ламповый чатик для своих людей: @devopsbrain_chat

Собрал в одном месте все самые полезные посты - изучайте, применяйте!
---
🔵Вредные советы начинающим специалистам в IT
🔵Говорим с TeamCity на одном языке с помощью MCP
🔵Делаем свой бесплатный сайт - закроем тему
🔵Динамические матрицы в github actions - Часть 1 | Часть 2
🔵Про магию for в prometheus
🔵Как запустить публичный сайт на телефоне или экономим на спичках
🔵Как прокачать сетку между разными ЦОД за пару команд
🔵Как умерла OS/2 в неравной схватке с Windows - Часть 1 | Часть 2
🔵Кольцо хеширования: теория и симулятор
🔵Лучшие практики конфигурирования Kubernetes в 2025 — Часть 1: Это база! | Часть 2: Сервисы, метки, конфиги и лимиты | Часть 3: безопасность, логи, наблюдаемость и graceful shutdown [продолжение следует...]
🔵Наводим красоту в htop
🔵Настройка самоподписных валидных ssl-сертификатов в локальном k8s. Часть 1 и Часть 2.
🔵Отправка уведомлений на телефон через API запрос
🔵Поиск эксплойтов в вашем кубе с помощью kubescape и metasploit
🔵Почему вам надо вводить практику написания посмортемов?
🔵Про git fixup и чистую историю
🔵Размышления об opensource. Оно катится в ад?
🔵Симулируем сети в GNS3. Часть 1 - настройка под MacOS | Часть 2 - делаем свою первую сеть
🔵Топ полезных утилит для работы с кучей серверов на примерах
🔵Тулзы для детекта утечки секретов
🔵Чеклист на Новый 2026 год для инженеров эксплуатации
🔵Эмуляция сетевых проблем в Linux через tc netem

🔵Dive in performance tools. Часть 1 - Sysdig
🔵Dive in performance tools. Часть 2 - top / htop. Про память в Linux | Про CPU | Таблица процессов в top | Основные выводы в практике | Что еще можно посмотреть в top
🔵Dive in performance tools. Часть 3 - Сеть. bmon | bandwhich [продолжение следует...]
🔵Excalidraw - как рисовать схемы без боли и страданий
🔵DocMost - аналог notion
🔵grafana k6 - знакомство с нагрузочным тестированием
🔵keephq - мониторинг на стеройдах
🔵kubetools - сборник тулов для k8s
🔵neohtop - htop под macos
🔵macpine - запускаем вмки под MacOS терминала
🔵oh-my-zsh - красиво оформляем командную строку
🔵postman - TUI аналог postman для любителей консоли
🔵siyuan - обзор решения для личного управления знаниями
🔵SLA, SLO и SLI простыми словами - Часть 1 | Часть 2
🔵tabby.sh - еще один кросплатформенный терминал
🔵Zerolog - удобные логи в golang

🔖 Полезные теги на канале
---
#ai #cicd #career #clickhouse #docker #dotnet #external_links #facts #fun #golang #github_actions #haproxy #kafka #linux #kubernetes #macos #management #networking #opentelemetry #proxmox #simulators #study #tools

------

🌐Мои репки opensource: https://github.com/itcaat/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🔖 Динамические матрицы в github actions - часть 1

Сегодня мы с вами на практике разберем что такое динамические матрицы в github actions.

Я подготовил монорепозиторий с несколькими микросервисами url-shortener-demo с очень коротким флоу: фичабранч(через PR) → main. Как понятно из названия это проект позволяющий генерировать короткие ссылки. А для упрощения локального запуска подготовлен docker-compose.yml, состоящий из сервисов:

1. api-gateway (Go) - API Gateway, единая точка входа
2. shortener-service (Go + Redis) - Создание коротких URL
3. redirect-service (Go + Redis + Kafka) - Перенаправление + события перехода для аналитики
4. analytics-service (Go + MongoDB + Kafka) - Аналитика
5. frontend (HTML + Nginx) - Веб-интерфейс

Дальше надо прикрутить сборку и пуш образов наших микросервисов. В структуре репа в корне лежат одноименные сервисы + каталог pkg, в котором будут храниться общие либы. Каждый сервис внутри имеет свой Dockerfile - это важный признак того, что это конечный сервис который можно собрать.

Теперь про магию - на самом деле вы, наверняка, видели множество примеров со статичными матрицами сборки (например, когда сборка приложения делается на нескольких OS). Но что если пойти дальше и самому сгенерировать матрицу в зависимости от того что поменялось? К счастью github actions позволяет нам это сделать.

При создании PR мы автоматически можем определить какой сервис поменялся, собрать его и выложить. А в случае, если поменялось что-то в pkg - собрать все сервисы.


# .github/workflows/build-pr.yml - часть 1
name: Build Pull Request

jobs:
changed-services:
name: Detect changed services
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
any_changed: ${{ steps.changed-files.outputs.any_changed }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Get changed services
id: changed-files
uses: tj-actions/changed-files@v45
with:
dir_names: true
dir_names_max_depth: 1
json: true
files: |
**/*
files_ignore: |
**/*.md
.github/**
scripts/**
*.md

- name: List all changed files
run: |
echo "Changed files: ${{ steps.changed-files.outputs.all_changed_files }}"

- name: Set matrix
id: set-matrix
run: |
# Находим все директории с Dockerfile
ALL_SERVICES=$(find . -maxdepth 2 -name "Dockerfile" -type f | sed 's|^\./||' | sed 's|/Dockerfile$||' | jq -R -s 'split("\n") | map(select(length > 0))' | jq -c .)
echo "All services with Dockerfile: $ALL_SERVICES"

# Получаем измененные файлы и убираем экранирование
CHANGED_DIRS_RAW='${{ steps.changed-files.outputs.all_changed_files }}'
CHANGED_DIRS=$(echo "$CHANGED_DIRS_RAW" | sed 's/\\"/"/g')
echo "Changed directories: $CHANGED_DIRS"

# Если изменился pkg/, пересобираем все Go сервисы (с go.mod)
if echo "$CHANGED_DIRS" | jq -e 'index("pkg")' > /dev/null 2>&1; then
SERVICES=$(find . -maxdepth 2 -name "go.mod" -type f | sed 's|^\./||' | sed 's|/go.mod$||' | jq -R -s 'split("\n") | map(select(length > 0))' | jq -c .)
echo "pkg/ changed, rebuilding all Go services: $SERVICES"
else
# Фильтруем: оставляем только измененные директории с Dockerfile
SERVICES=$(jq -nc --argjson all "$ALL_SERVICES" --argjson changed "$CHANGED_DIRS" \
'$changed | map(select(. as $dir | $all | index($dir)))' | jq -c .)
echo "Changed services: $SERVICES"
fi

# Если нет сервисов для сборки, создаем пустой массив
if [ "$SERVICES" = "[]" ] || [ -z "$SERVICES" ]; then
echo "No services to build"
SERVICES="[]"
fi

echo "matrix={\"service\":$SERVICES}" >> "$GITHUB_OUTPUT"


Продолжение далее… 🔽

#github_actions
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
🔖 Динамические матрицы в github actions - часть 2

Теперь просто в этом же build-pr.yml добавим джобу build и выглядеть она будет так.


# .github/workflows/build-pr.yml - часть 2
#jobs:
#changed-services:
#....
build:
name: Build ${{ matrix.service }}
runs-on: ubuntu-latest
needs: [changed-services]
if: ${{ needs.changed-services.outputs.any_changed == 'true' }}
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.changed-services.outputs.matrix) }}

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/${{ matrix.service }}
tags: |
type=ref,event=pr
type=sha,prefix=pr-${{ github.event.pull_request.number }}-
type=raw,value=pr-${{ github.event.pull_request.number }}

- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: ${{ matrix.service }}/Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha,scope=${{ matrix.service }}
cache-to: type=gha,mode=max,scope=${{ matrix.service }}

- name: Add PR comment
uses: mshick/add-pr-comment@v2
with:
message: |
**${{ matrix.service }}** successfully built!

**Images:**
`
${{ steps.meta.outputs.tags }}
`

**Pull command:**
`bash
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/${{ matrix.service }}:pr-${{ github.event.pull_request.number }}
`
message-id: build-${{ matrix.service }}


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

Как это будет выглядеть в github смотрите на скринах. В качестве домашнего задания можете форкнуть реп https://github.com/itcaat/url-shortener-demo (все примеры workflow вы найдете там же) и сделать так, чтобы собирались не все сервисы при изменении в pkg, а только те что реально зависят от измененного пакета.

Теперь вы просто мастер Йода в мире github actions, а остальные пусть дальше собирают всё подряд.

habr [2025.10.17]: https://habr.com/ru/articles/957636/

#github_actions
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7