Почему GitHub Actions удаляет папки с зависимостями бэкэнда после завершения сборки фронтенда?

Привет! У меня есть монорепозиторий, в котором находятся папки frontend и backend. Я настроил GitHub Actions так, чтобы при пуше в ветку main сначала выполнялась сборка папки frontend, а затем — папки backend. Однако у меня возникла проблема: во время сборки фронтенда папка с бэкендом на сервере сбрасывается, что приводит к потере установленных зависимостей и папки node_modules. В результате возникают ошибки при запуске бэкенда.

У меня такой рабочий процесс:

```yaml
name: "Build Frontend"

on:
  push:
    branches:
      - main

jobs:
  build-frontend:
    runs-on: self-hosted
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '20.18.0'

      - name: Install frontend dependencies
        run: npm ci
        working-directory: frontend

      - name: Build frontend
        run: npm run build
        working-directory: frontend

      - name: Install backend dependencies
        run: npm ci
        working-directory: backend

      - name: Restart pm2
        run: pm2 restart 0 && pm2 restart 1
```

Проблема заключается в том, что во время выполнения шагов сборки фронтенда папка backend сбрасывается, что приводит к утрате зависимостей, включая node_modules. Как можно решить эту проблему, чтобы при сборке фронтенда не возникало сбрасывания файлов, и бэкенд корректно запускался после этого?

Что я пробовал: я настроил workflow в GitHub Actions, чтобы сначала билдилась папка с фронтендом, а затем с бэкендом в рамках одного монорепозитория. Я ожидал, что после сборки фронтенда, сборка бэкенда будет выполнена успешно, включая установку зависимостей для обоих проектов.
  • 16 декабря 2024 г. 6:34
Ответы на вопрос 2
Судя по вашему описанию и приведенному файлу конфигурации GitHub Actions, вероятная проблема заключается в том, как вы используете `actions/checkout@v2`. По умолчанию эта команда выполняет полный checkout кода, что может перезаписывать содержимое, если в ходе работы или конфигурации вашего workflow возникают побочные эффекты.

Однако также возможно, что в вашем окружении (например, в self-hosted runner) как-то настроены чистка или сброс рабочих директорий между шагами. Для решения этой проблемы есть несколько подходящих вариантов:

### 1. Переосмысленный порядок шагов

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

### 2. Используйте кэширование

Вы можете использовать кэширование для сохранения зависимостей, чтобы не устанавливать их заново каждый раз. Используйте `actions/cache@v3` для кэширования папок `node_modules`. Пример:

```yaml
name: "Build Frontend"

on:
  push:
    branches:
      - main

jobs:
  build-frontend:
    runs-on: self-hosted
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '20.18.0'

      - name: Cache frontend dependencies
        uses: actions/cache@v3
        with:
          path: frontend/node_modules
          key: ${{ runner.os }}-frontend-${{ hashFiles('frontend/package-lock.json') }}

      - name: Install frontend dependencies
        run: npm ci
        working-directory: frontend

      - name: Build frontend
        run: npm run build
        working-directory: frontend

      - name: Cache backend dependencies
        uses: actions/cache@v3
        with:
          path: backend/node_modules
          key: ${{ runner.os }}-backend-${{ hashFiles('backend/package-lock.json') }}

      - name: Install backend dependencies
        run: npm ci
        working-directory: backend

      - name: Restart pm2
        run: pm2 restart 0 && pm2 restart 1
```

### 3. Изолируйте окружения

Если ни один из вышеупомянутых методов не работает, можно рассмотреть возможность создания отдельных jobs для каждой части вашего проекта, чтобы они были полностью изолированы друг от друга. Например:

```yaml
jobs:
  build-frontend:
    runs-on: self-hosted
    steps:
      # ваши шаги для фронтенда...

  build-backend:
    runs-on: self-hosted
    needs: build-frontend
    steps:
      # ваши шаги для бэкенда...
```

Таким образом, каждый job будет выполняться на своей изолированной среде.

### 4. Проверьте логи вашего self-hosted runner

Также стоит проверить логи вашего self-hosted runner, чтобы убедиться, что нет каких-либо специфичных настроек, которые приводят к очистке папок. Многие системы CI/CD могут иметь очистные скрипты, которые могут вмешиваться в ваш workflow.

Следуя указанным выше рекомендациям, вы сможете предотвратить потерю зависимостей в папке `backend` и обеспечить успешную сборку вашего приложения.
1) покажите лог вашего  билда, плюс структуру директорий репо 
2) к делу не относится, но поднимите версии - actions/checkout@v4 , actions/setup-node@4
Похожие вопросы