如何在Devcontainer需重建时保证作业顺序,无需强制重建?
解决方案
核心问题分析
当你把rebuild-devcontainer加入needs依赖后,若该作业因Devcontainer无变更被标记为skipped(跳过状态),GitHub Actions会默认跳过所有依赖它的下游作业——哪怕这些作业自身的if条件原本满足,这就是Devcontainer未改动时foo和bar作业被完全跳过的原因。
修复方案
修改build-foo和build-bar的if条件,同时兼顾两个逻辑:
- 子项目自身有变更(
needs.changes.outputs.foo/bar == 'true') rebuild-devcontainer作业要么成功完成(Devcontainer有变更且重建完毕),要么被跳过(Devcontainer无变更)
修改后的build-foo作业配置
build-foo: name: Build foo runs-on: ubuntu-latest container: image: ghcr.io/${{ secrets.GHCR_USER }}/our-devcontainer credentials: username: ${{ secrets.GHCR_USER }} password: ${{ secrets.GHCR_TOKEN }} needs: [ changes, rebuild-devcontainer ] # 关键修改:允许rebuild作业成功或跳过的情况 if: needs.changes.outputs.foo == 'true' && (needs.rebuild-devcontainer.result == 'success' || needs.rebuild-devcontainer.result == 'skipped') steps: - name: Checkout sources uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2, 2023-04-13 - name: Login to GHCR uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0, 2023-09-12 with: registry: ghcr.io username: ${{ secrets.GHCR_USER }} password: ${{ secrets.GHCR_TOKEN }} - name: Build foo in devcontainer working-directory: foo run: make foo
build-bar作业同理修改
将build-bar的if条件替换为:
if: needs.changes.outputs.bar == 'true' && (needs.rebuild-devcontainer.result == 'success' || needs.rebuild-devcontainer.result == 'skipped')
效果验证
- Devcontainer有变更时:
rebuild-devcontainer运行成功后,build-foo/build-bar会根据自身变更条件决定是否执行,保证了顺序依赖 - Devcontainer无变更时:
rebuild-devcontainer被跳过,build-foo/build-bar直接按自身变更规则执行,不会被强制跳过
内容的提问来源于stack exchange,提问作者sshine
相关产品推荐
相关产品推荐

