Google Cloud Build 无法运行 NX 受影响:应用程序,因为它无法引用 master~1 提交

Posted

技术标签:

【中文标题】Google Cloud Build 无法运行 NX 受影响:应用程序,因为它无法引用 master~1 提交【英文标题】:Google Cloud Build cannot run NX affected:apps because it cannot reference the master~1 commit 【发布时间】:2019-10-31 15:40:20 【问题描述】:

我正在尝试建立一个使用 nx.dev 开发的 monorepo 完整 CI/CD 管道,在其中我只构建和部署在提交中发生更改的应用和服务。

我的云构建链接到我的 github 存储库,当推送更改时,它会启动构建。首先 npm install 然后构建更改的应用程序。

根据 nx https://nx.dev/guides/monorepo-affected#ci 上的 nrwls 文档,他们说要使用

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 存储库时,它只检查提交而没有检查以前的提交信息。因此它不能引用之前的提交。

有什么办法可以解决这个问题还是我错过了什么?

谢谢!

【问题讨论】:

你有没有想过这个问题?看起来,在 nx-examples 存储库中,他们正在使用 CircleCI 来缓存文件中的最后一次提交:github.com/nrwl/nx-examples/blob/master/.circleci/…。我正在尝试对 Google Cloud 做同样的事情,我在其中构建受影响的应用程序并创建 docker 映像并推送到容器注册表。 @pjlamb12 我最终只是切换到 Gitlab CI 并且效果很好。从未与 Cloud Build 合作过。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

你也许可以用表达式来做到这一点。

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"


【讨论】:

【参考方案3】:

Cloud Build 既不获取分支也不获取历史记录。

Including the repository history in a build

Cloud Build 不会检查任何其他分支或历史记录。这是 为提高效率而完成,因此构建不必等待获取 整个存储库和历史记录只是为了构建一个提交。

因此他们建议在构建期间获取历史记录。例如,这是一个如何将 .git 文件夹添加到构建工作区的 hacky 示例,以便 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 描述身份验证过程。

【讨论】:

【参考方案4】:

正如另一个人提到的,其他分支没有被提取。

除了触发您的测试/构建/部署的分支之外,您还必须获取提交或分支。在我们的例子中,我们使用代表最后一次成功构建的分支。

这是我们的脚本示例(在 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

【讨论】:

以上是关于Google Cloud Build 无法运行 NX 受影响:应用程序,因为它无法引用 master~1 提交的主要内容,如果未能解决你的问题,请参考以下文章

将 env 变量从 Google 的 Secret Manager 加载到在 Google Cloud Run 上运行但未通过 Cloud Build 部署的 Docker 容器中?

Cloud Build 无法部署到 Google App Engine - 您无权充当 @appspot.gserviceaccount.com

Google Cloud Build - 查看日志权限

Google Cloud Build - firebase 部署错误:“公共目录 'dist/browser' 不存在,无法将托管部署到站点 PROJECT-ID”

在 Google Cloud Build 上使用 Docker Buildkit

私有 VPC 网络上的 Google Cloud Build