Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ Ρ Π²Π°ΠΌΠΈ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ°ΡΡΠΈΡΡ Π² 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
