4

我正在尝试建立一个使用 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 存储库时,它只检出提交而没有检出以前的提交信息。因此它不能引用之前的提交。

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

谢谢!

4

4 回答 4

1

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

steps:
   - uses: actions/checkout@v2
     with:
       fetch-depth: 0
于 2021-03-04T09:20:14.403 回答
0

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

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"


于 2020-03-01T17:54:30.647 回答
0

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

在构建中包含存储库历史记录

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

所以他们建议在构建期间获取历史记录。例如,这是一个 hacky 示例,您可以如何将 .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 .

如果您有私有存储库,则有一篇描述身份验证过程的文章。

于 2020-03-25T16:12:12.340 回答
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
于 2020-05-22T03:26:53.223 回答