git Google Cloud Build无法运行NX affected:apps,因为它无法引用master~1 commit

mrwjdhj3  于 2023-05-21  发布在  Git
关注(0)|答案(5)|浏览(113)

我试图建立一个monorepo完整的CI/CD管道,在www.example.com上开发nx.dev那里我只构建和部署在提交中更改的应用程序和服务。
我的云构建链接到我的github仓库,当一个更改被推送时,它会启动一个构建。首先安装npm,然后构建更改后的应用程序。
根据nx www.example.com上的nrwls文档https://nx.dev/guides/monorepo-affected#ci,他们说使用

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在本地构建时,它工作得很好,并成功地确定了要构建哪些服务。
我认为它失败的原因是因为当cloud build checkout git仓库时,它只 checkout 了提交,而没有以前的提交信息。因此它不能引用前一个提交。
有什么办法可以解决这个问题吗?还是我错过了什么?
谢谢!

6yoyoihd

6yoyoihd1#

你也许可以用一个表情来表达。

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"
9q78igpj

9q78igpj2#

我也面临着同样的问题,原因是受影响的需要深入检查,因为它与master不同。因此,GHA中的以下更改将解决此问题:

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

v1l68za43#

Cloud Build既不获取分支也不获取历史。
在构建中包含存储库历史记录
Cloud Build不会 checkout 任何其他分支或历史记录。这样做是为了提高效率,这样构建就不必为了构建一个提交而等待获取整个存储库和历史。
所以他们建议在构建过程中获取历史。例如,这是一个如何将.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 .

如果你有一个私有的仓库,there is an article描述认证过程。

j8yoct9x

j8yoct9x4#

正如另一个人所提到的,其他分支不会被提取。
除了触发测试/构建/部署的分支之外,您还必须获取提交或分支。在我们的例子中,我们使用一个分支来表示最后一次成功的构建。
这是我们脚本的一个例子(在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
px9o7tmv

px9o7tmv5#

为了让这个在云构建中工作,你需要首先“unshallow”git clone。我发现,通过将版本“写入”到一个文件中,并在构建过程中持久化,可以更轻松地使用云构建:

# 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

相关问题