GitHub Actions Python 持续集成教程:从入门到部署,新手也能快速上手

GitHub Actions Python 持续集成教程:从入门到部署,新手也能快速上手 一

文章目录CloseOpen

为什么GitHub ActionsPython项目的“自动化管家”?

你可能听过Jenkins、GitLab CI这些持续集成工具,但对个人开发者和小团队来说,GitHub Actions简直是“量身定制”。我之前帮朋友的Django项目搭CI时,他一开始非要用Jenkins,结果配了三天环境还没跑通——又是装插件又是配服务器,最后放弃了。后来换GitHub Actions,半小时就跑通了第一个工作流,他自己都说“早知道这么简单就不折腾了”。

到底它好在哪?咱们拿数据说话。下面是我整理的主流CI工具对比表,你一看就明白:

工具名称 免费额度 GitHub集成度 配置难度 适合场景
GitHub Actions 公共仓库完全免费,私有仓库每月2000分钟 ⭐⭐⭐⭐⭐(原生集成,无需额外配置) ⭐⭐(YAML语法简单,模板丰富) 个人项目、中小团队、GitHub托管代码
GitLab CI 私有仓库免费,需自建Runner ⭐⭐⭐⭐(仅支持GitLab仓库) ⭐⭐⭐(配置类似,但需熟悉GitLab生态) 已使用GitLab托管代码的团队
Jenkins 开源免费,但需自建服务器 ⭐⭐(需装插件对接GitHub) ⭐⭐⭐⭐(需懂Java,插件配置复杂) 大型企业、复杂定制化流程

(表格说明:数据基于各工具官网2023年公开信息整理,免费额度可能随政策调整)

GitHub Actions最打动我的是“零门槛”——你仓库在GitHub上,直接就能用,不用额外租服务器。去年我给一个Python命令行工具加持续集成,连服务器都没买,靠GitHub的免费Runner跑了半年,测试、打包、发版本全自动化,省了不少事。而且它的YAML配置文件就存在仓库里,和代码一起管理,你改了配置还能回溯历史版本,这点比Jenkins的“黑盒配置”靠谱多了。

GitHub官方博客里提到,现在全球有超过300万开发者在用Actions,其中Python项目占比很高,就是因为它对新手太友好了。你想想,写几行配置文件,就能让代码提交后自动“体检”(测试)、“洗澡”(格式化)、“上车”(部署),这不就是咱们程序员梦寐以求的“摸鱼神器”吗?

3步搭建Python项目的自动化工作流(附实战案例)

说了这么多好处,咱们直接上干货。我拿一个Flask Web项目举例,带你从0到1配好“提交代码→自动测试→自动部署到服务器”的全流程。你跟着做,1小时内绝对能跑通,亲测连我那个只会写print("Hello World")的朋友都学会了。

第一步:写个“工作流说明书”——YAML配置文件

GitHub Actions的核心是“工作流文件”,就像给电脑写个说明书:“当我做A时,你就执行B、C、D步骤”。这个文件要放在仓库的.github/workflows/目录下,随便起个名字,比如ci-cd.yml

先看个最简单的模板,我给你标上注释:

name: Python自动测试与部署 # 工作流名称,随便起

on: [push, pull_request] # 触发条件:推送代码或提PR时运行

jobs: # 定义要做的“任务”

test: # 第一个任务:运行测试

runs-on: ubuntu-latest # 在Ubuntu系统上跑

steps: # 任务步骤

  • name: 拉取代码 # 步骤1:把仓库代码拉到服务器
  • uses: actions/checkout@v4 # 用别人写好的“拉代码”工具

  • name: 安装Python # 步骤2:装Python环境
  • uses: actions/setup-python@v5

    with:

    python-version: "3.9" # 指定Python版本

  • name: 安装依赖 # 步骤3:装项目依赖
  • run: | # 这里写Linux命令

    python -m pip install upgrade pip

    pip install -r requirements.txt # 假设你有requirements.txt

  • name: 运行测试 # 步骤4:跑测试用例
  • run: pytest tests/ # 假设测试文件在tests目录

    你可能会问:“这些uses: actions/...是啥?” 这是GitHub Actions的“插件市场”,别人写好的通用步骤(比如拉代码、装Python),你直接拿来用就行,不用重复造轮子。上面这个文件虽然简单,但已经能实现“提交代码后自动跑测试”了——是不是比你手动敲命令快多了?

    我刚开始写YAML时,总记不住语法,后来发现一个笨办法:去GitHub Actions市场搜“python”,看别人的示例代码,复制粘贴改一改就行。比如装Python的actions/setup-python,点进去就有详细用法,比看文档直观10倍。

    第二步:给代码“体检”——自动测试+规范检查

    光跑测试还不够,咱们得让代码“更健康”。比如自动检查有没有语法错误、变量名规不规范,甚至帮你格式化代码。我之前维护一个Python脚本,因为没加代码检查,结果两个人写的代码风格差太远,合并时天天吵架。后来加了自动检查,代码提交前就会报错“变量名要用小写+下划线”,现在团队代码整齐多了。

    咱们给刚才的配置文件加两段:

    # 在steps里加这两个步骤(放在“运行测试”前面)
    
  • name: 代码规范检查
  • run: |

    pip install flake8 # 装代码规范检查工具

    flake8 app/ count select=E9,F63,F7,F82 show-source statistics # 检查app目录

  • name: 自动格式化代码
  • run: |

    pip install black # 装自动格式化工具

    black app/ # 自动把app目录的代码格式化成标准风格

    git config global user.name "GitHub Actions" # 配置Git提交者

    git config global user.email "actions@github.com"

    git add app/ # 把格式化后的代码提交回去

    git commit -m "Auto-format code by GitHub Actions" || echo "No changes to commit"

    这里有个小技巧:flake8可以自定义检查规则,比如select=E9只检查会导致运行错误的语法问题,忽略那些“一行不能超过79个字符”的强迫症规则(如果你不喜欢太严格的话)。而black更狠,直接帮你把代码格式化成统一风格,连空格都给你调好,再也不用争论“括号后面要不要加空格”了。

    我之前给一个Django项目加了black自动格式化,刚开始团队成员很抗拒:“凭什么电脑改我的代码?” 结果用了一周就真香了——提交代码后自动变整齐,Review时再也不用揪格式问题,沟通效率至少提升50%。

    第三步:让代码“自己上线”——自动打包与部署

    测试通过、代码也规范了,最后一步就是部署。如果你是开发Python库,可能想自动发到PyPI;如果是Web项目,可能想部署到云服务器或Heroku。我以“部署到云服务器”为例,教你怎么配。

    你得在服务器上准备好“接收代码”的方式,比如用SSH登录。但GitHub Actions怎么知道你的服务器密码?这里要用“密钥”而不是明文密码——在GitHub仓库的“Settings→Secrets→Actions”里,添加服务器的IP、SSH用户名、私钥,名字随便起(比如SERVER_IPSSH_USERSSH_KEY)。

    然后在配置文件里加个“部署任务”:

    deploy: # 第二个任务:部署(注意和test任务并列)
    

    needs: test # 依赖test任务:只有test通过了才部署

    runs-on: ubuntu-latest

    steps:

  • name: 拉取代码
  • uses: actions/checkout@v4

  • name: 部署到服务器
  • uses: appleboy/ssh-action@master # 用SSH登录服务器的工具

    with:

    host: ${{ secrets.SERVER_IP }} # 从刚才设置的Secrets里取IP

    username: ${{ secrets.SSH_USER }} # 取用户名

    key: ${{ secrets.SSH_KEY }} # 取私钥

    script: | # 在服务器上执行的命令

    cd /path/to/your/project # 进入项目目录

    git pull # 拉取最新代码

    pip install -r requirements.txt # 装依赖

    supervisorctl restart flask-app # 重启服务(假设用supervisor管理)

    这里的needs: test很重要,保证只有测试通过的代码才会部署,避免把bug推到线上。我之前就吃过亏,没加这个条件,结果一次测试没通过的代码被部署了,线上直接报错,还好发现及时回滚了。

    如果你是开发Python库,想自动发到PyPI,可以把部署步骤换成:

  • name: 打包成Wheel
  • run: |

    pip install wheel

    python setup.py sdist bdist_wheel

  • name: 发布到PyPI
  • uses: pypa/gh-action-pypi-publish@release/v1

    with:

    user: __token__

    password: ${{ secrets.PYPI_TOKEN }} # 在PyPI申请的token,存在GitHub Secrets里

    是不是很简单?现在你提交代码,GitHub就会自动跑测试、检查代码、甚至帮你发到PyPI,全程不用你动手。

    最后想说,持续集成这东西,不用追求一步到位。你可以先配个简单的“自动测试”,跑通了再加“代码检查”,最后加“自动部署”。我见过很多人一开始想配个“无所不能”的工作流,结果被YAML语法劝退了。其实像搭积木一样,一块一块加,反而更容易上手。

    如果你按这些步骤试了,不管成功还是遇到问题,都欢迎回来告诉我!要是你有更简单的配置技巧,也记得分享给我,咱们一起把Python开发变得更“懒”更高效~


    你开发的Python项目要是必须在Windows环境下测试,完全不用愁,GitHub Actions早就想到这点了。你在写那个YAML配置文件的时候,找到runs-on那一行——就是指定运行环境的地方,默认可能是ubuntu-latest(Linux系统),你直接把它换成windows-latest就行,这就会让GitHub用Windows系统来跑你的工作流了。要是你还需要在Mac系统测试,同理换成macos-latest,操作起来和用Ubuntu时一模一样,根本不用学新东西。

    比如你项目里用了Windows特有的库,或者某个功能只能在Windows下跑通,就直接把runs-on: ubuntu-latest改成runs-on: windows-latest,剩下的步骤基本不用动。像咱们平时用的pip install -r requirements.txt这种安装依赖的命令,在Windows环境下照样能用,不用特意改命令格式。不过有个小细节得注意,Windows的文件路径用的是反斜杠,而Linux和Mac用正斜杠/,要是你脚本里写了绝对路径,记得在Windows环境下换成C:xxxyyy这种格式,不然可能会报路径错误。但大部分时候,用相对路径或者Python的pathlib库处理路径,就能避开这个问题,整体来说适配起来特别简单,试一次就知道多方便了。


    配置YAML文件时总报错,新手怎么快速排查问题?

    新手最常见的YAML错误是缩进不对(YAML对空格缩进非常严格,不能用Tab键)或语法错误(比如冒号后没加空格)。推荐两个工具:一是GitHub的“工作流编辑器”(仓库→Actions→新建工作流→选择模板),会实时提示语法错误;二是在线YAML验证工具(如YAML Lint),把配置文件复制进去就能检查格式问题。 刚开始可以直接复制文章里的示例代码,改完后先提交到分支测试,避免影响主分支。

    GitHub Actions的免费额度够用吗?个人开发者会超支吗?

    完全够用!公共仓库(开源项目)的工作流运行时间是免费的,没有上限;私有仓库每月有2000分钟免费额度,按“工作流运行时间”计算(比如一个任务跑5分钟,每天跑10次,一个月才1500分钟)。个人开发者的小项目(比如每天触发几次测试+部署)根本用不完,就算偶尔超了,GitHub也会发邮件提醒,不会直接扣费,放心用。

    我的Python项目需要在Windows环境下测试,GitHub Actions支持吗?

    支持!在YAML文件的runs-on字段里改系统就行:runs-on: windows-latest(Windows系统)或runs-on: macos-latest(Mac系统),和Ubuntu用法一样。比如测试需要Windows特有的库,直接把runs-on: ubuntu-latest换成windows-latest,步骤里的命令用Windows语法(比如pip install -r requirements.txt在Windows下同样适用)。

    不小心提交了错误代码,工作流已经触发,能中途停止吗?

    可以!在仓库页面点击“Actions”,找到正在运行的工作流(显示“黄色圆圈”状态),点击进入详情页,右上角有“Cancel workflow”按钮,点击即可停止。如果经常误触,可以在on字段里限制触发条件,比如只在推送到main分支或特定标签时运行(例:on: push: branches: [main]),避免每次提交都触发。

    除了Python项目,GitHub Actions还能用于其他语言吗?

    当然!GitHub Actions是通用的CI/CD工具,支持Java、JavaScript、Go等几乎所有编程语言。比如前端项目可以用它自动打包React/Vue代码,后端Java项目自动编译JAR包,甚至可以用来定时运行Python爬虫(设置on: schedule:

  • cron: “0 8 *”,每天早上8点自动执行)。核心逻辑和Python项目类似:定义触发条件→选运行环境→写步骤命令,换汤不换药。
  • 0
    显示验证码
    没有账号?注册  忘记密码?