GitHub Actions工作流使用最佳实践:如何选择多工作流/多Job/多Step
GitHub Actions workflow/job/step 选型最佳实践
我们可以先从三个层级的核心差异和适用边界入手,再结合你提到的Python项目跑测试+lint的场景做判断:
核心判断维度
你可以先对照以下几个问题快速缩小选型范围:
- 两个任务的触发规则是否完全一致?
- 两个任务的运行环境、依赖配置是否完全相同?
- 是否需要两个任务的运行结果互相独立,其中一个失败不影响另一个执行?
- 是否需要并行运行来节省整体执行时间?
- 是否需要给两个任务配置独立的权限、通知、准入规则?
方案1:同一job下拆分多个step
适用场景
- 两个任务依赖完全相同的运行环境,不需要单独配置环境参数
- 两个任务有强先后依赖,前序任务失败后后续任务没有执行必要
- 项目规模小,希望尽可能节省CI运行时长、简化配置
示例配置(Python场景)
jobs: code-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.11" - run: pip install -r requirements.txt flake8 pytest - run: flake8 . # lint检查step - run: pytest . # 单元测试step
优缺点
- 优点:无需重复安装环境,资源消耗低,配置简单
- 缺点:任务串行执行,前一个失败后一个不会运行,无法单独查看两个任务的执行状态
方案2:同一workflow下拆分多个独立job
适用场景
- 两个任务的触发规则完全一致(比如都是PR提交、push到主干时触发)
- 需要两个任务独立返回执行结果,互不阻塞
- 两个任务的环境配置不同,比如测试需要跨多Python版本/多系统运行,lint只需跑一次
示例配置(Python场景)
name: Code Check on: [push, pull_request] jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.11" - run: pip install flake8 - run: flake8 . test: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.9", "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - run: pip install -r requirements.txt pytest - run: pytest .
优缺点
- 优点:多job并行执行,整体耗时更短,两个任务结果独立,可单独配置执行规则(比如测试的多版本矩阵),PR页面可以单独设置两个检查项为合并准入条件
- 缺点:每个job需要单独初始化环境,会多消耗一点CI运行时长
方案3:拆分为两个独立workflow
适用场景
- 两个任务的触发规则完全不同,比如lint仅在PR时触发,测试需要定时每日运行、打tag时也运行
- 两个任务属于完全独立的业务域,比如一个是代码检查,另一个是生产部署,分开管理更清晰
- 需要给两个任务配置完全独立的权限、通知规则、运行权限
优缺点
- 优点:配置完全隔离,不会互相影响,管理灵活度最高
- 缺点:配置重复度高,不方便统一管理触发规则
Python项目测试+lint场景选型建议
绝大多数常规Python项目的测试+lint检查场景,优先选择同一workflow下拆分两个独立job的方案,既可以并行执行节省时间,也能独立查看两个检查的结果,满足PR合并准入的要求。如果是极小的个人项目,依赖安装耗时远低于检查执行耗时,也可以选择同一job下拆分step的方案,简化配置。
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

