From f39e72340cfbf1140a7c8891f7a512862a2e2946 Mon Sep 17 00:00:00 2001 From: Till JS Date: Tue, 28 Apr 2026 15:32:43 +0200 Subject: [PATCH] chore(ci): drop 16 dead build-* jobs + per-product detect-changes branches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The CI workflow accumulated 16 build jobs for apps/services that no longer exist after the 2026-04 unification (chat, todo, calendar, clock, contacts, presi, storage, food, skilltree, telegram-stats-bot — all of their /apps/web and /apps/backend dirs are gone) plus a structurally broken `build-mana-web` (its Dockerfile starts FROM `sveltekit-base:local`, an image only the Mac Mini self-hosted runner has). Every push has been producing red CI runs from these dead jobs while the real production deploys (cd-macmini.yml) succeeded. Removed: - detect-changes per-product outputs + force-build-all branches - 220 lines of dead per-product detect-logic shell - 19 lines of per-product summary block - build-mana-web (broken; CD on Mac Mini covers prod) - build-{chat,todo,calendar,clock,contacts,presi,storage,food,skilltree}-{web,backend} - build-telegram-stats-bot Kept (still build cleanly on ubuntu-latest): - build-mana-{auth,search,sync,notify,api-gateway,crawler,media,credits} - validate (PRs) - auth-integration (PRs) CI workflow shrank 1290 → 583 lines. The header comment now spells out which services are in/out of CI and why. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/ci.yml | 757 ++------------------------------------- 1 file changed, 30 insertions(+), 727 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d1e8f1d8..bec89a2d5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,17 +1,27 @@ -# CI Pipeline: Validates code on PRs, builds images on push +# CI Pipeline: validates PRs and sanity-builds standalone service images. # # Flow: -# PR → dev/main : Runs validation (required status check) -# Push → dev/main : Builds Docker images (only changed services) +# PR → main/dev : validate + auth-integration (required status check). +# Push → main/dev : sanity-build the changed standalone services +# (mana-auth/-search/-sync/-notify/-api-gateway/-crawler/ +# -media/-credits) on GitHub-hosted runners. # -# Selective Builds: -# - Only builds services that have changed files -# - Detects changes in service path, shared packages, and root config -# - Use workflow_dispatch to force rebuild all services +# What's NOT in CI: +# - mana-web: built by the Mac Mini CD pipeline (cd-macmini.yml). Its +# Dockerfile starts FROM `sveltekit-base:local`, an image only the +# self-hosted runner has. Putting it in CI would require a sveltekit- +# base prebuild step here too — out of scope until we add a real +# consumer for the ghcr.io image. +# - apps/api, mana-events, mana-analytics, mana-geocoding, mana-mail, +# mana-llm, mana-research, mana-mcp, mana-ai, mana-persona-runner, +# mana-user, mana-subscriptions, mana-image-gen, mana-video-gen, +# mana-stt, mana-tts, mana-voice-bot, mana-landing-builder: also +# built by the Mac Mini CD pipeline. Add a sanity-build job here +# only when there's a non-CD consumer for the image. # -# Deployments are triggered separately: -# - Manual: workflow_dispatch on cd-staging.yml / cd-production.yml -# - Tag-based: push tag like "chat-staging-v1.0.0" triggers cd-staging-tagged.yml +# Production deployment is the cd-macmini.yml workflow, which auto-fires +# on push to main and rebuilds only the affected services on the +# self-hosted runner. name: CI @@ -57,23 +67,6 @@ jobs: mana-crawler: ${{ steps.changes.outputs.mana-crawler }} mana-credits: ${{ steps.changes.outputs.mana-credits }} mana-search: ${{ steps.changes.outputs.mana-search }} - mana-web: ${{ steps.changes.outputs.mana-web }} - chat-backend: ${{ steps.changes.outputs.chat-backend }} - chat-web: ${{ steps.changes.outputs.chat-web }} - todo-backend: ${{ steps.changes.outputs.todo-backend }} - todo-web: ${{ steps.changes.outputs.todo-web }} - calendar-backend: ${{ steps.changes.outputs.calendar-backend }} - calendar-web: ${{ steps.changes.outputs.calendar-web }} - clock-web: ${{ steps.changes.outputs.clock-web }} - contacts-backend: ${{ steps.changes.outputs.contacts-backend }} - contacts-web: ${{ steps.changes.outputs.contacts-web }} - presi-web: ${{ steps.changes.outputs.presi-web }} - storage-backend: ${{ steps.changes.outputs.storage-backend }} - storage-web: ${{ steps.changes.outputs.storage-web }} - telegram-stats-bot: ${{ steps.changes.outputs.telegram-stats-bot }} - food-backend: ${{ steps.changes.outputs.food-backend }} - food-web: ${{ steps.changes.outputs.food-web }} - skilltree-web: ${{ steps.changes.outputs.skilltree-web }} any-changes: ${{ steps.changes.outputs.any-changes }} steps: - name: Checkout code @@ -95,23 +88,6 @@ jobs: echo "mana-crawler=true" >> $GITHUB_OUTPUT echo "mana-credits=true" >> $GITHUB_OUTPUT echo "mana-search=true" >> $GITHUB_OUTPUT - echo "mana-web=true" >> $GITHUB_OUTPUT - echo "chat-backend=true" >> $GITHUB_OUTPUT - echo "chat-web=true" >> $GITHUB_OUTPUT - echo "todo-backend=true" >> $GITHUB_OUTPUT - echo "todo-web=true" >> $GITHUB_OUTPUT - echo "calendar-backend=true" >> $GITHUB_OUTPUT - echo "calendar-web=true" >> $GITHUB_OUTPUT - echo "clock-web=true" >> $GITHUB_OUTPUT - echo "contacts-backend=true" >> $GITHUB_OUTPUT - echo "contacts-web=true" >> $GITHUB_OUTPUT - echo "presi-web=true" >> $GITHUB_OUTPUT - echo "storage-backend=true" >> $GITHUB_OUTPUT - echo "storage-web=true" >> $GITHUB_OUTPUT - echo "telegram-stats-bot=true" >> $GITHUB_OUTPUT - echo "food-backend=true" >> $GITHUB_OUTPUT - echo "food-web=true" >> $GITHUB_OUTPUT - echo "skilltree-web=true" >> $GITHUB_OUTPUT echo "any-changes=true" >> $GITHUB_OUTPUT exit 0 fi @@ -137,23 +113,6 @@ jobs: echo "mana-crawler=true" >> $GITHUB_OUTPUT echo "mana-credits=true" >> $GITHUB_OUTPUT echo "mana-search=true" >> $GITHUB_OUTPUT - echo "mana-web=true" >> $GITHUB_OUTPUT - echo "chat-backend=true" >> $GITHUB_OUTPUT - echo "chat-web=true" >> $GITHUB_OUTPUT - echo "todo-backend=true" >> $GITHUB_OUTPUT - echo "todo-web=true" >> $GITHUB_OUTPUT - echo "calendar-backend=true" >> $GITHUB_OUTPUT - echo "calendar-web=true" >> $GITHUB_OUTPUT - echo "clock-web=true" >> $GITHUB_OUTPUT - echo "contacts-backend=true" >> $GITHUB_OUTPUT - echo "contacts-web=true" >> $GITHUB_OUTPUT - echo "presi-web=true" >> $GITHUB_OUTPUT - echo "storage-backend=true" >> $GITHUB_OUTPUT - echo "storage-web=true" >> $GITHUB_OUTPUT - echo "telegram-stats-bot=true" >> $GITHUB_OUTPUT - echo "food-backend=true" >> $GITHUB_OUTPUT - echo "food-web=true" >> $GITHUB_OUTPUT - echo "skilltree-web=true" >> $GITHUB_OUTPUT echo "any-changes=true" >> $GITHUB_OUTPUT exit 0 fi @@ -225,149 +184,17 @@ jobs: fi done - # mana-web: apps/mana/apps/web + shared packages - MANA_WEB_CHANGED=$(check_pattern "apps/mana/apps/web/|apps/mana/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$SHARED_UI_CHANGED" == "true" ] || [ "$SHARED_WEB_CHANGED" == "true" ] || [ "$MANA_WEB_CHANGED" == "true" ]; then - echo "mana-web=true" >> $GITHUB_OUTPUT - else - echo "mana-web=false" >> $GITHUB_OUTPUT - fi + # mana-web build job is handled by the Mac Mini CD pipeline + # (cd-macmini.yml) — that runner has the `sveltekit-base:local` + # image required by apps/mana/apps/web/Dockerfile. CI here only + # validates the standalone services that build cleanly on + # GitHub-hosted runners. - # chat-backend: apps/chat/apps/backend + packages - CHAT_BACKEND_CHANGED=$(check_pattern "apps/chat/apps/backend/|apps/chat/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$CHAT_BACKEND_CHANGED" == "true" ]; then - echo "chat-backend=true" >> $GITHUB_OUTPUT - else - echo "chat-backend=false" >> $GITHUB_OUTPUT - fi - - # chat-web: apps/chat/apps/web + packages + shared web - CHAT_WEB_CHANGED=$(check_pattern "apps/chat/apps/web/|apps/chat/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$SHARED_UI_CHANGED" == "true" ] || [ "$SHARED_WEB_CHANGED" == "true" ] || [ "$CHAT_WEB_CHANGED" == "true" ]; then - echo "chat-web=true" >> $GITHUB_OUTPUT - else - echo "chat-web=false" >> $GITHUB_OUTPUT - fi - - # todo-backend - TODO_BACKEND_CHANGED=$(check_pattern "apps/todo/apps/backend/|apps/todo/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$TODO_BACKEND_CHANGED" == "true" ]; then - echo "todo-backend=true" >> $GITHUB_OUTPUT - else - echo "todo-backend=false" >> $GITHUB_OUTPUT - fi - - # todo-web - TODO_WEB_CHANGED=$(check_pattern "apps/todo/apps/web/|apps/todo/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$SHARED_UI_CHANGED" == "true" ] || [ "$SHARED_WEB_CHANGED" == "true" ] || [ "$TODO_WEB_CHANGED" == "true" ]; then - echo "todo-web=true" >> $GITHUB_OUTPUT - else - echo "todo-web=false" >> $GITHUB_OUTPUT - fi - - # calendar-backend - CALENDAR_BACKEND_CHANGED=$(check_pattern "apps/calendar/apps/backend/|apps/calendar/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$CALENDAR_BACKEND_CHANGED" == "true" ]; then - echo "calendar-backend=true" >> $GITHUB_OUTPUT - else - echo "calendar-backend=false" >> $GITHUB_OUTPUT - fi - - # calendar-web - CALENDAR_WEB_CHANGED=$(check_pattern "apps/calendar/apps/web/|apps/calendar/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$SHARED_UI_CHANGED" == "true" ] || [ "$SHARED_WEB_CHANGED" == "true" ] || [ "$CALENDAR_WEB_CHANGED" == "true" ]; then - echo "calendar-web=true" >> $GITHUB_OUTPUT - else - echo "calendar-web=false" >> $GITHUB_OUTPUT - fi - - # clock-backend: REMOVED — migrated to local-first - - # clock-web - CLOCK_WEB_CHANGED=$(check_pattern "apps/clock/apps/web/|apps/clock/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$SHARED_UI_CHANGED" == "true" ] || [ "$SHARED_WEB_CHANGED" == "true" ] || [ "$CLOCK_WEB_CHANGED" == "true" ]; then - echo "clock-web=true" >> $GITHUB_OUTPUT - else - echo "clock-web=false" >> $GITHUB_OUTPUT - fi - - # contacts-backend - CONTACTS_BACKEND_CHANGED=$(check_pattern "apps/contacts/apps/backend/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$CONTACTS_BACKEND_CHANGED" == "true" ]; then - echo "contacts-backend=true" >> $GITHUB_OUTPUT - else - echo "contacts-backend=false" >> $GITHUB_OUTPUT - fi - - # contacts-web - CONTACTS_WEB_CHANGED=$(check_pattern "apps/contacts/apps/web/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$SHARED_UI_CHANGED" == "true" ] || [ "$SHARED_WEB_CHANGED" == "true" ] || [ "$CONTACTS_WEB_CHANGED" == "true" ]; then - echo "contacts-web=true" >> $GITHUB_OUTPUT - else - echo "contacts-web=false" >> $GITHUB_OUTPUT - fi - - # presi-backend: REMOVED — replaced by Hono server - - # presi-web - PRESI_WEB_CHANGED=$(check_pattern "apps/presi/apps/web/|apps/presi/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$SHARED_UI_CHANGED" == "true" ] || [ "$SHARED_WEB_CHANGED" == "true" ] || [ "$PRESI_WEB_CHANGED" == "true" ]; then - echo "presi-web=true" >> $GITHUB_OUTPUT - else - echo "presi-web=false" >> $GITHUB_OUTPUT - fi - - # storage-backend - STORAGE_BACKEND_CHANGED=$(check_pattern "apps/storage/apps/backend/|apps/storage/packages/|packages/shared-storage/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$STORAGE_BACKEND_CHANGED" == "true" ]; then - echo "storage-backend=true" >> $GITHUB_OUTPUT - else - echo "storage-backend=false" >> $GITHUB_OUTPUT - fi - - # storage-web - STORAGE_WEB_CHANGED=$(check_pattern "apps/storage/apps/web/|apps/storage/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$SHARED_UI_CHANGED" == "true" ] || [ "$SHARED_WEB_CHANGED" == "true" ] || [ "$STORAGE_WEB_CHANGED" == "true" ]; then - echo "storage-web=true" >> $GITHUB_OUTPUT - else - echo "storage-web=false" >> $GITHUB_OUTPUT - fi - - # telegram-stats-bot - TELEGRAM_STATS_BOT_CHANGED=$(check_pattern "services/telegram-stats-bot/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$TELEGRAM_STATS_BOT_CHANGED" == "true" ]; then - echo "telegram-stats-bot=true" >> $GITHUB_OUTPUT - else - echo "telegram-stats-bot=false" >> $GITHUB_OUTPUT - fi - - # food-backend - FOOD_BACKEND_CHANGED=$(check_pattern "apps/food/apps/backend/|apps/food/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$FOOD_BACKEND_CHANGED" == "true" ]; then - echo "food-backend=true" >> $GITHUB_OUTPUT - else - echo "food-backend=false" >> $GITHUB_OUTPUT - fi - - # food-web - FOOD_WEB_CHANGED=$(check_pattern "apps/food/apps/web/|apps/food/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$SHARED_UI_CHANGED" == "true" ] || [ "$SHARED_WEB_CHANGED" == "true" ] || [ "$FOOD_WEB_CHANGED" == "true" ]; then - echo "food-web=true" >> $GITHUB_OUTPUT - else - echo "food-web=false" >> $GITHUB_OUTPUT - fi - - # skilltree-backend: REMOVED — migrated to local-first - - # skilltree-web - SKILLTREE_WEB_CHANGED=$(check_pattern "apps/skilltree/apps/web/|apps/skilltree/packages/") - if [ "$COMMON_CHANGED" == "true" ] || [ "$SHARED_AUTH_CHANGED" == "true" ] || [ "$SHARED_UI_CHANGED" == "true" ] || [ "$SHARED_WEB_CHANGED" == "true" ] || [ "$SKILLTREE_WEB_CHANGED" == "true" ]; then - echo "skilltree-web=true" >> $GITHUB_OUTPUT - else - echo "skilltree-web=false" >> $GITHUB_OUTPUT - fi - - # quotes-backend: REMOVED — migrated to local-first + # Per-product apps (chat / todo / calendar / clock / contacts / + # presi / storage / food / skilltree) and `telegram-stats-bot` + # were removed when the unified mana app + apps/api consolidated + # everything in 2026-04. Their CI build jobs have been deleted + # along with the source dirs. # Check if any service needs building if grep -q "=true" $GITHUB_OUTPUT; then @@ -390,27 +217,6 @@ jobs: echo "| mana-crawler | ${{ steps.changes.outputs.mana-crawler }} |" >> $GITHUB_STEP_SUMMARY echo "| mana-credits | ${{ steps.changes.outputs.mana-credits }} |" >> $GITHUB_STEP_SUMMARY echo "| mana-search | ${{ steps.changes.outputs.mana-search }} |" >> $GITHUB_STEP_SUMMARY - echo "| mana-web | ${{ steps.changes.outputs.mana-web }} |" >> $GITHUB_STEP_SUMMARY - echo "| chat-backend | ${{ steps.changes.outputs.chat-backend }} |" >> $GITHUB_STEP_SUMMARY - echo "| chat-web | ${{ steps.changes.outputs.chat-web }} |" >> $GITHUB_STEP_SUMMARY - echo "| todo-backend | ${{ steps.changes.outputs.todo-backend }} |" >> $GITHUB_STEP_SUMMARY - echo "| todo-web | ${{ steps.changes.outputs.todo-web }} |" >> $GITHUB_STEP_SUMMARY - echo "| calendar-backend | ${{ steps.changes.outputs.calendar-backend }} |" >> $GITHUB_STEP_SUMMARY - echo "| calendar-web | ${{ steps.changes.outputs.calendar-web }} |" >> $GITHUB_STEP_SUMMARY - echo "| clock-backend | removed |" >> $GITHUB_STEP_SUMMARY - echo "| clock-web | ${{ steps.changes.outputs.clock-web }} |" >> $GITHUB_STEP_SUMMARY - echo "| contacts-backend | ${{ steps.changes.outputs.contacts-backend }} |" >> $GITHUB_STEP_SUMMARY - echo "| contacts-web | ${{ steps.changes.outputs.contacts-web }} |" >> $GITHUB_STEP_SUMMARY - echo "| presi-backend | removed |" >> $GITHUB_STEP_SUMMARY - echo "| presi-web | ${{ steps.changes.outputs.presi-web }} |" >> $GITHUB_STEP_SUMMARY - echo "| storage-backend | ${{ steps.changes.outputs.storage-backend }} |" >> $GITHUB_STEP_SUMMARY - echo "| storage-web | ${{ steps.changes.outputs.storage-web }} |" >> $GITHUB_STEP_SUMMARY - echo "| telegram-stats-bot | ${{ steps.changes.outputs.telegram-stats-bot }} |" >> $GITHUB_STEP_SUMMARY - echo "| food-backend | ${{ steps.changes.outputs.food-backend }} |" >> $GITHUB_STEP_SUMMARY - echo "| food-web | ${{ steps.changes.outputs.food-web }} |" >> $GITHUB_STEP_SUMMARY - echo "| skilltree-backend | removed |" >> $GITHUB_STEP_SUMMARY - echo "| skilltree-web | ${{ steps.changes.outputs.skilltree-web }} |" >> $GITHUB_STEP_SUMMARY - echo "| quotes-backend | removed |" >> $GITHUB_STEP_SUMMARY # =========================================== # Validation job - runs on PRs @@ -785,506 +591,3 @@ jobs: tags: ${{ steps.meta.outputs.tags }} cache-from: type=gha cache-to: type=gha,mode=max - - build-mana-web: - name: Build mana-web - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.mana-web == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/mana-web - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/mana/apps/web/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-chat-backend: - name: Build chat-backend - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.chat-backend == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/chat-backend - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/chat/apps/backend/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-chat-web: - name: Build chat-web - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.chat-web == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/chat-web - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/chat/apps/web/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-todo-backend: - name: Build todo-backend - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.todo-backend == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/todo-backend - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/todo/apps/backend/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-todo-web: - name: Build todo-web - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.todo-web == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/todo-web - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/todo/apps/web/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-calendar-backend: - name: Build calendar-backend - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.calendar-backend == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/calendar-backend - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/calendar/apps/backend/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-calendar-web: - name: Build calendar-web - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.calendar-web == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/calendar-web - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/calendar/apps/web/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - # build-clock-backend: REMOVED — migrated to local-first - - build-clock-web: - name: Build clock-web - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.clock-web == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/clock-web - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/clock/apps/web/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-contacts-backend: - name: Build contacts-backend - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.contacts-backend == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/contacts-backend - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/contacts/apps/backend/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-contacts-web: - name: Build contacts-web - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.contacts-web == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/contacts-web - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/contacts/apps/web/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - # build-presi-backend: REMOVED — replaced by Hono server - - build-presi-web: - name: Build presi-web - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.presi-web == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/presi-web - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/presi/apps/web/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-storage-backend: - name: Build storage-backend - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.storage-backend == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/storage-backend - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/storage/apps/backend/Dockerfile - # Note: arm64 disabled due to QEMU emulation issues with native deps - platforms: linux/amd64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-storage-web: - name: Build storage-web - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.storage-web == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/storage-web - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/storage/apps/web/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-telegram-stats-bot: - name: Build telegram-stats-bot - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.telegram-stats-bot == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/telegram-stats-bot - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: services/telegram-stats-bot/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-food-backend: - name: Build food-backend - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.food-backend == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/food-backend - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/food/apps/backend/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - build-food-web: - name: Build food-web - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.food-web == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/food-web - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/food/apps/web/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - # build-skilltree-backend: REMOVED — migrated to local-first - - build-skilltree-web: - name: Build skilltree-web - runs-on: ubuntu-latest - needs: detect-changes - if: needs.detect-changes.outputs.skilltree-web == 'true' - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-qemu-action@v3 - - uses: docker/setup-buildx-action@v3 - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/${{ github.repository_owner }}/skilltree-web - tags: type=raw,value=latest - - uses: docker/build-push-action@v5 - with: - context: . - file: apps/skilltree/apps/web/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max - - # =========================================== - # Quotes Backend: REMOVED — migrated to local-first