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 .
Если у вас есть частный репозиторий, есть статья, описывающая процесс авторизации.