我目前正致力于将Web应用程序(服务器Python,前端Node.js)持续部署到Google App Engine。当应用程序被推送到开发或主服务器时,CI服务器分为四个阶段:安装依赖项,构建,测试,部署。在这些步骤中没有错误。在推动开发时,它应该在开发版本上的GAE上传而不迁移流量。推送master时,它应该在prod版本上的GAE上传并自动迁移流量。
我写了一些非常类似于使用TravisCI和CircleCI在GAE上进行持续部署的Google文档,但我可以看到有关App Engine上提供的文件的奇怪行为。
我所说的奇怪的行为是在使用命令部署到GAE时:
gcloud app deploy app.yaml --no-promote -v dev
我可以在GAE上看到dev版本更新,并且所提供的文件不一样,但有时它对应于好的文件,有时它对应于(非常)旧的提交,并不总是相同的,具有几个星期前被推了。无论如何,deploy命令的输出(带有调试级别)表示有时某些静态文件被“跳过”,有时则没有。我知道,在部署到现有版本时,App Engine会识别哪些文件已被修改并应该上传。不幸的是,例如,当我修改单个字符时,该文件并不总是被视为已修改且未上载。
在尝试查找问题时,我看到文件已上传到Google云端存储中的存储桶中,并使用sha1sum重命名。 在CI服务器上,关于静态文件的“部署”阶段的输出表明它已经很好地上传,当我查看存储桶中的上传文件时,它是好的版本。对我的我来说,GitLab方面没问题。
DEBUG: Uploading [/builds/apps/ex-app-name/static/main.js] to [2d660f94a0ec70a64892a1539938bf404d4d45f9]
INFO: Uploading [/builds/apps/ex-app-name/static/main.js] to [2d660f94a0ec70a64892a1539938bf404d4d45f9]
最近,我发现以前版本的所有文件都在同一个存储桶中。这些文件之间的冲突最终可以解释所有遇到的问题和着名的奇怪行为。例如,当我给命令deploy提供一个空桶(使用--bucket选项)时,似乎第一次部署成功,但不是第二次部署和其他部署......
以下是我的.gitlab-ci.yml:
的内容stages:
- install
- build
- test
- deploy
variables:
CI_PROJECT_ID: ex-ci-project-id
PROJECT_ID: ex-project-id
APP_NAME: ex-app-name
image: eu.gcr.io/$CI_PROJECT_ID/$APP_NAME:latest
install_dependencies:
stage: install
script:
- pip install -r requirements.txt -t lib
- cd client
- npm install
cache:
key: "$CI_PIPELINE_ID/$CI_BUILD_REF_NAME"
paths:
- client/node_modules
- lib
build_app:
stage: build
script:
- cd client
- npm run build
cache:
key: "$CI_PIPELINE_ID/$CI_BUILD_REF_NAME"
paths:
- client/node_modules
- static
- lib
test_app:
stage: test
script:
- cd client
- npm test
cache:
key: "$CI_PIPELINE_ID/$CI_BUILD_REF_NAME"
paths:
- client/node_modules
- static
- lib
deploy_app_dev:
stage: deploy
script:
- /google-cloud-sdk/bin/gcloud app deploy app.yaml --verbosity=debug --no-promote -v dev
environment: development
only:
- develop
cache:
key: "$CI_PIPELINE_ID/$CI_BUILD_REF_NAME"
paths:
- static
- lib
deploy_app_prod:
stage: deploy
script:
- /google-cloud-sdk/bin/gcloud app deploy app.yaml --verbosity=debug --promote -v prod
environment: production
only:
- master
cache:
key: "$CI_PIPELINE_ID/$CI_BUILD_REF_NAME"
paths:
- static
- lib
我的问题是:
我很确定GitLab CI会将好文件发送到App Engine,所以我认为问题不在这里。 欢迎提出所有建议/建议。
提前谢谢!
卢瓦克