Git Action多工作流并行时如何串行执行?解决构建号冲突
解决GitHub Actions并行工作流导致TestFlight构建号冲突的串行执行方案
方案一:利用GitHub Environments的并发限制(推荐)
GitHub原生支持通过concurrency字段限制同一组的工作流串行执行,无需额外依赖:
- 进入仓库的
Settings > Environments,创建一个专属环境(例如testflight-deploy)。 - 在你的CI/CD工作流文件中添加
concurrency配置:
concurrency: # 若需同一分支串行,保留-${{ github.ref }};所有分支都串行则移除 group: testflight-deploy-${{ github.ref }} # 设置为false表示排队等待,true则取消正在运行的同组工作流 cancel-in-progress: false
配置后,同一group下的工作流会自动串行,后触发的会等待前一个完成后再执行,从根源避免构建号读取冲突。
方案二:Git仓库锁文件机制
通过在Git仓库中创建锁文件实现串行控制,适合需要更自定义逻辑的场景:
- 工作流启动时尝试创建并推送锁文件,失败则重试等待;
- 完成构建上传后删除锁文件,确保后续工作流能获取锁。
示例工作流片段:
steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 获取部署锁 run: | # 循环尝试创建锁文件并推送,直到成功 until git add .testflight-deploy.lock && git commit -m "Acquire deploy lock" && git push; do echo "锁已被占用,等待30秒后重试..." sleep 30 done continue-on-error: false # 此处放置你的Fastlane构建、上传TestFlight的步骤 - name: 释放部署锁 # 无论工作流成功或失败都执行,避免死锁 if: always() run: | rm .testflight-deploy.lock git add .testflight-deploy.lock git commit -m "Release deploy lock" git push
注意:需确保工作流拥有仓库的推送权限,可通过配置permissions: write-all或更精细的权限实现。
方案三:外部锁服务(如Redis)
如果团队已有基础设施,可借助Redis等分布式锁服务实现跨工作流的串行控制:
- 工作流启动时通过Redis的
SETNX命令尝试获取锁,并设置过期时间防止死锁; - 获取锁后执行构建,完成后删除锁。
示例代码片段:
steps: - name: 获取Redis锁 run: | until redis-cli -h $REDIS_HOST -a $REDIS_PASSWORD SET testflight-deploy-lock "locked" NX EX 3600; do echo "锁已被持有,等待30秒后重试..." sleep 30 done env: REDIS_HOST: ${{ secrets.REDIS_HOST }} REDIS_PASSWORD: ${{ secrets.REDIS_PASSWORD }} # Fastlane构建与上传步骤 - name: 释放Redis锁 if: always() run: | redis-cli -h $REDIS_HOST -a $REDIS_PASSWORD DEL testflight-deploy-lock env: REDIS_HOST: ${{ secrets.REDIS_HOST }} REDIS_PASSWORD: ${{ secrets.REDIS_PASSWORD }}
内容的提问来源于stack exchange,提问作者JIn Park
相关产品推荐
相关产品推荐

