Как мне найти все затронутые проекты через nx?

Я использую nx для управления моно-репозиторием для машинописных проектов. Я знаю, что у nx есть команда affected, которую можно использовать только для измененного проекта и других проектов, которые от него зависят. Это хорошая возможность для компиляции. Но мне также нужно, чтобы мой конвейер CICD работал точно так же.

Я использую github и gitaction. Я хотел бы запустить конвейер только для затронутых проектов.

Например, у меня есть структура папок в github ниже: 3 проекта и 1 библиотека. proj1 и proj2 зависят от библиотеки pdfgenerator. Как я могу запускать конвейер CICD только для proj1 и proj2, когда я меняю pdfgenerator?

projects/proj1
projects/proj2
projects/proj3
libraries/pdfgenerator
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
2
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы настроить конвейер CI/CD с помощью GitHub Actions, который запускает рабочие процессы только для проектов, затронутых изменениями, вы можете использовать затронутые команды Nx, которые предназначены для того, чтобы помочь вам запускать команды только в проектах, на которые влияют недавние изменения. .
Смотрите шоу-проекты nx --затронутые

nx show projects --affected --base=main --head=HEAD

Настройте рабочий процесс GitHub Action в своем репозитории. Создайте новый файл YAML в каталоге .github/workflows.

Убедитесь, что вы получили необходимую базовую ветку, чтобы правильно сравнить изменения.
В этапы задания добавьте шаг для получения базовой ветки (при условии, что «main» — это ваша базовая ветка):

- name: Fetch Base Branch
    run: |
    git fetch origin main:main

Определите затронутые проекты с помощью Nx CLI. Используйте шаг для запуска команды, затронутой Nx, и сохраните выходные данные в переменной среды:

- name: Identify affected projects
  run: |
    echo "AFFECTED=$(nx show projects --affected --json --base=main --head=HEAD | jq -r '.projects | join(" ")')" >> $GITHUB_ENV

В задании build вы можете использовать матричную стратегию для запуска отдельной сборки для каждого проекта (proj1, proj2, proj3).
Условие if проверяет, содержится ли имя проекта в списке затронутых проектов перед запуском команды сборки. Если проект затронут, запускается команда сборки; в противном случае оно пропускается.

  build:
    needs: identify_affected
    runs-on: ubuntu-latest
    strategy:
      matrix:
        project: [proj1, proj2, proj3]
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Install Dependencies
        run: npm install

      - name: Build Project
        if: contains(needs.identify_affected.outputs.affected, matrix.project)
        run: nx build ${{ matrix.project }}

Полный сценарий:

name: Build Affected Projects

on:
  push:
    branches:
      - main

jobs:
  identify_affected:
    runs-on: ubuntu-latest
    outputs:
      affected: ${{ steps.set-output.outputs.affected }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Fetch Base Branch
        run: |
          git fetch origin main:main

      - name: Install Dependencies
        run: npm install -g nx

      - name: Identify affected projects
        run: |
          echo "AFFECTED=$(nx show projects --affected --json --base=main --head=HEAD | jq -r '.projects | join(" ")')" >> $GITHUB_ENV

      - name: Set affected projects as output
        id: set-output
        run: echo "::set-output name=affected::${{ env.AFFECTED }}"

  build:
    needs: identify_affected
    runs-on: ubuntu-latest
    strategy:
      matrix:
        project: [proj1, proj2, proj3]
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Install Dependencies
        run: npm install

      - name: Build Project
        if: contains(needs.identify_affected.outputs.affected, matrix.project)
        run: nx build ${{ matrix.project }}

Nx устанавливается глобально в средстве запуска действий GitHub, чтобы обеспечить доступность команды nx.

Спасибо за подробное объяснение. Можете ли вы объяснить, что означают приложения в affected:apps? У меня нет этой цели в проекте.

Joey Yi Zhao 17.09.2023 13:40

Стоит ли мне использовать nx affected:proj1 --base=main --head=HEAD --plain? У меня выдает ошибку Error: Both project and target have to be specified

Joey Yi Zhao 17.09.2023 13:47

@JoeyYiZhao Вы правы, это не будет поддерживаться. Я изменил ответ, чтобы вместо этого использовать [nx print-affected].

VonC 17.09.2023 22:02

Спасибо. Я обнаружил, что print-affected устарел. Я заставляю это работать, используя nx show projects.

Joey Yi Zhao 18.09.2023 01:55

@JoeyYiZhao Хорошая мысль. Я отредактировал ответ, чтобы использовать эту команду.

VonC 18.09.2023 07:39

Другие вопросы по теме