我正通过Gitlab管道将我网站的前端部署到amazon s3。我以前的部署已成功运行,但最近的部署却没有。这是错误:
Completed 12.3 MiB/20.2 MiB (0 Bytes/s) with 1 file(s) remaining
upload failed: dist/vendor.bundle.js.map to s3://<my-s3-bucket-name>/vendor.bundle.js.map Unable to locate credentials
根据我的秘密变量,我定义了四个。它们是两个不同存储桶的S3凭证变量(AWS_ACCESS_KEY_ID & AWS_SECRET_ACCESS_KEY)
。一对用于测试分支,另一对用于生产分支。
不是 - 生产环境变量是受保护的而其他变量则不是。 这是我运行的部署脚本:
#/bin/bash
#upload files
aws s3 cp ./dist s3://my-url-$1 --recursive --acl public-read
那么为什么我会收到此凭据位置错误?当然它应该自动获取环境变量(未受保护的变量)并部署它们。我是否需要在作业中定义变量并参考它们?
答案 0 :(得分:4)
(我多次遇到此问题-为其他有相同错误的人添加另一个答案-其他原因)。
快速清单。
转到设置-> CI / CD->变量并检查:
AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
环境变量。protected
-它们只能针对protected
个分支(例如master
)运行。如果仍然发生错误:
AWS_SECRET_ACCESS_KEY
不包含任何特殊字符(可能导致奇怪的错误)。答案 1 :(得分:1)
实际的问题是命名变量时发生冲突。对于这两个分支,变量分别称为AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
。但是问题不仅仅在于重命名它们,因为管道仍然没有选择它们。
我将密码打印到日志中,以确定哪个密码被哪个分支使用,但发现两个密码都未被使用。解决方案是为每个分支的每个密码(例如PRODUCTION_ACCESS_KEY_ID
和TESTING_ACCESS_KEY_ID
)使用唯一的名称,并在构建脚本中引用它们:
deploy_app_production:
environment:
name: production
url: http://modius-life-portal-ui-production.s3-website.eu-west-1.amazonaws.com/
before_script:
- echo "Installing ruby & dpl"
- apt-get update && apt-get install -y ruby-full
- gem install dpl
stage: deploy
tags:
- nv1
script:
- echo "Deploying to production"
- sh deploy.sh production $PRODUCTION_ACCESS_KEY_ID $PRODUCTION_SECRET_ACCESS_KEY
only:
- master
在deploy.sh
中,我提到了传入的变量(尽管最终我确实切换到了dpl):
dpl --provider=s3 --access-key-id=$2 --secret-access-key=$3 --bucket=<my-bucket-name>-$1 --region=eu-west-1 --acl=public_read --local-dir=./dist --skip_cleanup=true
答案 2 :(得分:0)
您是否尝试过以交互方式在本地运行GitLab管道脚本中使用的Docker映像?
这样,您可以验证没有拾取环境变量确实是问题所在。 (即,如果您在本地设置相同的环境变量,并且可以正常工作,那么是的,这就是问题所在。)
我怀疑凭证可以很好地被拾取,也许它们只是不具有执行请求的操作所需的所有权限。我知道该错误消息另有说明,但是在涉及权限问题时,S3错误消息往往会产生误导。