我试图建立一个用nx.dev开发的monorepo完整CI / CD管道,在这里我仅构建和部署提交中已更改的应用程序和服务。
我的云构建链接到我的github存储库,当推送更改时,它开始构建。首先安装npm,然后构建更改的应用程序。
根据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存储库时,它仅签出提交,而没有签出任何先前的提交信息。因此,它不能引用先前的提交。
有什么办法解决还是我错过了什么?
谢谢!
答案 0 :(得分:1)
我遇到了同样的问题,受影响的原因需要深入结帐,因为它与 "write_disposition":"MIRROR"
不同。因此,GHA 中的以下更改将解决它:
master
答案 1 :(得分:0)
您也许可以使用表达式来做到这一点。
operator()
这就是我通过github操作做到的
npm run affected:build -- --base=$(git rev-parse HEAD~1) --head=origin/master
答案 2 :(得分:0)
Cloud Build既不获取分支,也不获取历史记录。
Including the repository history in a 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 .
如果您有私有存储库,请there is an article描述身份验证过程。
答案 3 :(得分: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