多测试环境下Flutter对接云VM的后端配置问题
解决Flutter本地运行对应当前分支后端的问题
不用搞多台VM,单台VM就能实现分支隔离的后端部署,下面给你具体方案:
1. 给每个分支部署独立的PM2实例
当前你的CI脚本不管什么分支推上来,都会杀掉所有PM2进程再重启一个server.js,所以会互相覆盖。改成按分支名创建独立实例就行:
修改你的CI配置文件:
variables: HEROKU_APP_NAME: "room-booking-backend" HEROKU_PRODUCTION_KEY: $HEROKU_PRODUCTION_KEY stages: - deploy # 把原来的production改成通用deploy,支持所有分支 backend-deploy: stage: deploy script: - cd server # 把分支名里的斜杠换成横杠,避免PM2实例名非法 - INSTANCE_NAME="server-${CI_COMMIT_BRANCH//\//-}" # 先删掉旧实例(如果存在),不存在就忽略错误 - pm2 delete $INSTANCE_NAME || true # 生成唯一端口:基于分支名计算,确保和其他分支不冲突 - PORT=$((3000 + $(echo $CI_COMMIT_BRANCH | cksum | cut -d' ' -f1) % 100)) # 启动对应分支的后端实例,指定端口和实例名 - pm2 start server.js --name $INSTANCE_NAME -- --port $PORT
注:如果你的CI不是GitLab CI,把CI_COMMIT_BRANCH换成对应CI的分支环境变量(比如GitHub Actions用GITHUB_REF_NAME)。
2. 本地Flutter动态对接对应分支的后端
Flutter运行时指定当前分支对应的后端地址就行,嫌手动输麻烦可以搞个脚本:
比如在Flutter项目根目录创建run_with_branch_backend.sh:
#!/bin/bash # 获取当前本地分支名 BRANCH=$(git rev-parse --abbrev-ref HEAD) # 和CI里一样的端口计算逻辑,保证端口一致 PORT=$((3000 + $(echo $BRANCH | cksum | cut -d' ' -f1) % 100)) # 启动Flutter并传入后端地址参数 flutter run --dart-define=BACKEND_URL=http://你的VMIP:$PORT
然后给脚本加执行权限:chmod +x run_with_branch_backend.sh,以后直接跑这个脚本就能自动对接当前分支的后端了。
3. 进阶:用Docker做环境隔离
如果担心不同分支的依赖冲突,就用Docker给每个分支跑独立容器,CI脚本改成构建镜像并启动容器,端口映射逻辑和上面一样,好处是每个分支的后端环境完全隔离,不会互相影响。
要不要多台VM?
完全没必要,除非你们团队几十人同时开发,单台VM资源扛不住。上面的方案单台VM就能搞定多人分支的隔离需求。
内容的提问来源于stack exchange,提问作者staplegun
相关产品推荐
相关产品推荐

