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 - firebase 部署错误:“公共目录 'dist/browser' 不存在,无法将托管部署到站点 PROJECT-ID”