如何配置Travis Matrix实现双部署至不同AWS S3存储桶?
问题:Travis Matrix实现双部署到不同AWS S3存储桶
我已经配置了Travis Matrix的构建逻辑,分两个环境分别执行不同的构建命令,但不知道怎么设置部署步骤,想把两个不同的构建产物推送到两个不同的AWS S3存储桶,现有配置如下:
node_js: - 8 cache: yarn: true matrix: include: - env: MHTD=USER1 - env: MHTD=USER2 install: - if [ "$MHTD" = "USER1" ]; then yarn build-web:"$BUILD_NAME"; fi - if [ "$MHTD" = "USER2" ]; then yarn build-web:"$BUILD_NAME1"; fi
解决方案
这里有两种清晰的实现方式,你可以根据自己的需求选择:
方式一:通过环境变量+条件判断统一管理部署
这种方式适合两个部署逻辑差异不大的场景,我们可以在环境变量里加入桶名,然后在deploy步骤里根据MHTD的值匹配对应的配置:
node_js: - 8 cache: yarn: true matrix: include: # 给每个环境添加对应的桶名和构建命令变量 - env: MHTD=USER1 BUCKET_NAME=user1-s3-bucket BUILD_NAME=web-user1 - env: MHTD=USER2 BUCKET_NAME=user2-s3-bucket BUILD_NAME1=web-user2 install: - if [ "$MHTD" = "USER1" ]; then yarn build-web:"$BUILD_NAME"; fi - if [ "$MHTD" = "USER2" ]; then yarn build-web:"$BUILD_NAME1"; fi deploy: provider: s3 # 注意:这些AWS凭证需要提前在Travis的项目设置里加密配置 access_key_id: $AWS_ACCESS_KEY_ID secret_access_key: $AWS_SECRET_ACCESS_KEY bucket: $BUCKET_NAME # 读取对应环境的桶名 skip_cleanup: true # 关键!必须开启,否则Travis会清理构建产物 local_dir: dist # 替换成你的构建产物实际目录,比如build、public等 on: # 可以根据需要限制部署的分支,比如只在master分支触发 branch: master # 确保只在我们定义的两个环境下执行部署 condition: $MHTD = USER1 || $MHTD = USER2
方式二:在Matrix的每个条目里单独定义部署配置
如果两个部署的逻辑差异较大(比如用不同的AWS凭证、不同的产物目录),直接在每个matrix条目里写独立的deploy配置会更清晰:
node_js: - 8 cache: yarn: true matrix: include: - env: MHTD=USER1 BUILD_NAME=web-user1 # 单独定义这个环境的构建命令 install: yarn build-web:"$BUILD_NAME" # 单独配置USER1的S3部署 deploy: provider: s3 access_key_id: $AWS_USER1_ACCESS_KEY_ID secret_access_key: $AWS_USER1_SECRET_ACCESS_KEY bucket: user1-s3-bucket skip_cleanup: true local_dir: dist-user1 # 如果USER1的产物目录不同,这里单独指定 on: branch: master - env: MHTD=USER2 BUILD_NAME1=web-user2 install: yarn build-web:"$BUILD_NAME1" # 单独配置USER2的S3部署 deploy: provider: s3 access_key_id: $AWS_USER2_ACCESS_KEY_ID secret_access_key: $AWS_USER2_SECRET_ACCESS_KEY bucket: user2-s3-bucket skip_cleanup: true local_dir: dist-user2 on: branch: master
关键注意事项
skip_cleanup: true必须设置:Travis默认会在部署阶段清理所有构建生成的文件,不开启这个选项的话,你的产物会被删掉,导致部署空内容。- AWS凭证的安全处理:不要把AWS密钥直接写在配置文件里,用Travis的加密功能处理:
- 终端执行
travis encrypt AWS_ACCESS_KEY_ID=你的密钥ID --add,Travis会自动把加密后的变量加到你的.travis.yml里。
- 终端执行
- 产物目录要准确:
local_dir必须指向你构建命令生成的文件所在的目录,比如如果yarn build-web把文件生成到build文件夹,就填build。
内容的提问来源于stack exchange,提问作者Aleksandr Maiorov
相关产品推荐
相关产品推荐

