Я использую nx для управления моно-репозиторием для машинописных проектов. Я знаю, что у nx есть команда affected, которую можно использовать только для измененного проекта и других проектов, которые от него зависят. Это хорошая возможность для компиляции. Но мне также нужно, чтобы мой конвейер CICD работал точно так же.
Я использую github и gitaction. Я хотел бы запустить конвейер только для затронутых проектов.
Например, у меня есть структура папок в github ниже: 3 проекта и 1 библиотека. proj1 и proj2 зависят от библиотеки pdfgenerator. Как я могу запускать конвейер CICD только для proj1 и proj2, когда я меняю pdfgenerator?
projects/proj1
projects/proj2
projects/proj3
libraries/pdfgenerator






Чтобы настроить конвейер 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.
Стоит ли мне использовать nx affected:proj1 --base=main --head=HEAD --plain? У меня выдает ошибку Error: Both project and target have to be specified
@JoeyYiZhao Вы правы, это не будет поддерживаться. Я изменил ответ, чтобы вместо этого использовать [nx print-affected].
Спасибо. Я обнаружил, что print-affected устарел. Я заставляю это работать, используя nx show projects.
@JoeyYiZhao Хорошая мысль. Я отредактировал ответ, чтобы использовать эту команду.
Спасибо за подробное объяснение. Можете ли вы объяснить, что означают приложения в
affected:apps? У меня нет этой цели в проекте.