TGViewer
DevOps Brain 🧠 DevOps Brain 🧠 @devopsbrain · 1.26K subscribers
Post #169 607
πŸ”– ДинамичСскиС ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π² 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
  • πŸ”₯ 4
More from @devopsbrain
  1. Sep 30, 2026πŸ”– НаконСц-Ρ‚ΠΎ доТдались: git branch --delete-merged Π£ нас Ρƒ всСх Π΅ΡΡ‚ΡŒ ΠΊΡƒΡ‡Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². ΠœΡ‹ ра…
  2. Sep 28, 2026РСбята, Ρ…ΠΎΡ‡Ρƒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я Π±Ρ‹ сам с ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅ΠΌ посСтил. 3 октяб…
  3. Sep 19, 2026Волько Ρ‡Ρ‚ΠΎ Ρ€Π΅Π»ΠΈΠ·Π½ΡƒΠ» net-peek v0.1.8. Π­Ρ‚ΠΎΡ‚ малСнький, Π½ΠΎ классный 🚳 Π½Π° Go я сдСлал, когда…
  4. Sep 17, 2026πŸ”– AI большС Π½Π΅ стыдно? ΠžΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ быстро ΠΌΡ‹ ΠΏΡ€ΠΎΡˆΠ»ΠΈ Ρ„Π°Π·Ρƒ ΠΎΡ‚ β€œΡ„ΡƒΡƒΡƒ, это нСйросл…
  5. Sep 12, 2026Π›Π΅Π½Ρ‚Ρƒ ΠΌΠΎΠ΅Π³ΠΎ Ρ‚Π²ΠΈΡ‚Ρ‚Π΅Ρ€Π° послСдниС 2 дня Ρ€Π°Π·Ρ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚ Π΄Π²ΡƒΡ… Π²Π΅Ρ‰Π΅ΠΉ - складного Π°ΠΉΡ„ΠΎΠ½Π° ΠΈ ΠΌΡƒΡ…ΠΈ. Π˜β€¦
  6. Sep 8, 2026πŸ”– Kafka: Partitions ΠΈ Consumer Groups β€” Π§Π°ΡΡ‚ΡŒ 2 Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ части Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ, Π·Π°Ρ‡Π΅ΠΌ Kafka в…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook β†’Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 β†’