Google Cloud Build не может работать под управлением NX: приложения не могут ссылаться на коммит ~1

Я пытаюсь настроить конвейер CI/CD с полным набором компонентов, разработанный с помощью nx.dev, где я создаю и внедряю только те приложения и службы, которые были изменены в коммите.

Моя сборка в облаке связана с моим репозиторием на github, и когда изменение происходит, оно запускает сборку. Сначала установите npm, а затем соберите измененные приложения.

Согласно документам nrwls на nx https://nx.dev/guides/monorepo-affected говорят, что они используют

npm run affected:build -- --base=origin/master~1 --head=origin/master

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

Я пытался использовать это, но получаю эту ошибку при запуске в облачной сборке

Step #1: fatal: Not a valid object name master~1
Step #1: Command failed: git merge-base master~1 master
Step #1: fatal: Not a valid object name master~1

При локальном построении с помощью cloud-build-local он работает нормально и успешно определяет, какие сервисы построить.

Я думаю, что причина этого заключается в том, что когда облачная сборка проверяет репозиторий git, она только проверяет фиксацию, а не информацию о предыдущем коммите. Поэтому он не может ссылаться на предыдущий коммит.

Есть ли способ обойти это или я что-то упустил?

Спасибо!

5 ответов

Вы могли бы сделать это с помощью выражения.

npm run affected:build -- --base=$(git rev-parse HEAD~1) --head=origin/master

Вот как я это делаю с помощью действий github

name: Test develop and feature branches

on:
  push:
    branches:
      - develop
      - "feature/*"

jobs:
  test:
    name: Test
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v1

      - name: Use node.js 12
        uses: actions/setup-node@v1
        with:
          node-version: 12

      - name: Cache Yarn
        uses: actions/cache@v1
        with:
          path: node_modules
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.OS }}-yarn-${{ env.cache-name }}-
            ${{ runner.os }}-yarn-

      - name: Yarn install
        run: yarn install --frozen-lockfile --non-interactive

      - name: Retreive last test sha
        id: last-test-sha
        run: |
          if [[ $GITHUB_BASE_REF ]]
          then
            echo "::set-output name=sha::remotes/origin/$GITHUB_BASE_REF"
          else
            echo "::set-output name=sha::$(git rev-parse HEAD~1)"
          fi

      - name: Run affected tests
        run: yarn affected:test --ci --runInBand --base=${{ steps.last-test-sha.outputs.sha }} --head=${GITHUB_SHA}
        env:
          CI: "true"
          TZ: "utc"


Я столкнулся с той же проблемой, причина в том, что требуется глубокая проверка, поскольку она отличается от master. Поэтому следующие изменения в ГСГ разрешат это:

      steps:
   - uses: actions/checkout@v2
     with:
       fetch-depth: 0

Как уже упоминал другой, другие ветки не извлекаются.

В дополнение к ветке, которая запустила ваш тест / сборку / развертывание, вы должны получить фиксацию или ветку. В нашем случае мы используем ветку, которая представляет последнюю успешную сборку.

Вот пример нашего скрипта (в Codeship). В настоящее время используется nx v7. Пока работает у нас хорошо.

## fetch the last successfully deployed branch to determine affected build
git fetch --no-tags --prune --depth=5 origin lastdeploy_production:refs/remotes/origin/lastdeploy_production
nx affected:test --base=remotes/origin/lastdeploy_production --head=HEAD
nx affected:build --prod --parallel --maxParallel 8 --base=remotes/origin/lastdeploy_production --head=HEAD
# ...deployment commands (removed)...
## after a successful deployment we force push to this branch for comparing affected
git push origin HEAD:lastdeploy_production -f

Чтобы это работало с облачной сборкой, вам нужно сначала «отключить» клон git. Я обнаружил, что с облачной сборкой проще работать, «записывая» версии в файл, который сохраняется в течение сборки:

        # convert the shallow clone to a regular one
  - name: gcr.io/cloud-builders/git
    args:
      - fetch
      - '--unshallow'
      - '--no-tags'
    id: fetch
    waitFor:
      - '-'

  # write revisions to build log
  - name: gcr.io/cloud-builders/git
    args:
      - '-c'
      - |
        echo $COMMIT_SHA > HEAD
        echo $(git rev-parse origin/master) > BASE

        echo "nx head revision:" $(cat HEAD)
        echo "nx base revision:" $(cat BASE)
    id: write-version
    waitFor:
      - fetch
    entrypoint: bash

Чтобы использовать их в затронутых командах, вы можете сделать это следующим образом:

        # build
  - name: 'node:18'
    args:
      - nx
      - 'affected:build'
      - '--base=$(cat BASE)'
      - '--head=$(cat HEAD)'
      - '--prod'
      - '--parallel=2'
    id: build
    waitFor:
      - npm-install
    entrypoint: npx

Cloud Build не извлекает ни ветки, ни историю.

Включение истории репозитория в сборку

Cloud Build не проверяет другие ветки или историю. Это сделано для эффективности, так что сборкам не нужно ждать, чтобы получить весь репозиторий и историю только для создания одного коммита.

Поэтому они предлагают получить историю во время сборки. Например, это хакерский пример того, как можно добавить папку.git в рабочую область сборки, чтобы NX мог вычислить затронутые проекты.

  - id: Get the .git directory
    name: git
    args:
      - bash
      - -c
      - |-
        # get the .git directory only
        git clone --branch $BRANCH_NAME git@github.com:<USER_NAME>/$REPO_NAME /tmp/repo ;
        # move it to the workspace
        mv /tmp/repo/.git .

Если у вас есть частный репозиторий, есть статья, описывающая процесс авторизации.

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