手动部署 Odoo 是很多开发人员日常需要反复执行的工作:通过 SSH 连接服务器、拉取最新代码、重启服务、更新模块,然后等待变更生效。这个过程并不快捷,当项目包含多个自定义模块时,还很容易出错。GitHub Actions 可以同时解决这两个痛点:自动化部署流程,并为你的 Odoo 项目提供 CI(持续集成)能力。对于需要服务器权限的私有模块部署场景,它是一个理想方案:每次你向 GitHub 提交代码,工作流就可以触发,自动把变更部署到服务器。
本文将带你使用 GitHub Actions 为 Odoo 项目搭建一套 CI/CD(持续集成 / 持续部署)工作流。整个流程包含以下步骤:
1. 准备可对接 GitHub Actions 的项目仓库
2. 在 GitHub 中将服务器凭证保存为机密变量
3. 通过 SSH 将自定义模块部署到服务器
4. 每次提交代码后自动重启 Odoo 服务
读完本文后,你只需向 GitHub 推送提交记录,就能让 Odoo 部署变得快速且稳定。下面我们开始。
前置条件
开始之前,请确认已经准备好以下资源:
• 托管在 GitHub 上的 Odoo 项目仓库,仓库内存放自定义插件(custom_addons/ 目录)
• 部署服务器:一台 VPS 或云主机(示例使用 Ubuntu),服务器上已经装好并运行 Odoo(原生部署或 Docker 部署均可),并且拥有服务器 SSH 访问权限
• Git 和 YAML 基础知识
第 1 步:规划 Odoo 仓库目录结构
整洁的仓库结构会大幅简化自动化流程。这种部署方案最简单的目录布局,就是让仓库本身直接作为插件目录:
custom_addons/ <-- 该目录即为你的 Git 仓库
├── sales_extension/
│ ├── __manifest__.py
│ └── ...
├── inventory_reports/
│ ├── __manifest__.py
│ └── ...
├── requirements.txt
├── .github/
│ └── workflows/
│ └── deploy.yml
└── README.md
要点说明:
• 每个自定义模块放在仓库根目录下,这样仓库可以直接克隆到服务器的 /opt/odoo/custom_addons,该路径需要和 odoo.conf 里的 addons_path 配置保持一致
• 在 requirements.txt 中列出所有额外的 Python 依赖包
• 工作流文件存放在 .github/workflows/ 目录下
• GitHub 会自动识别该目录下所有 .yml 工作流文件
第 2 步:在 GitHub 仓库添加机密变量
GitHub Secrets 会加密保存敏感信息,避免密钥写进代码库。在仓库页面依次打开: Settings > Secrets and variables > Actions > New repository secret
添加以下机密变量:
• SSH_PRIVATE_KEY:gh_actions_key 私钥文件内容
• SSH_HOST:服务器 IP 或主机名
• SSH_USER:部署账号(deployer)
你还需要在服务器上手动克隆一次仓库(路径 /opt/odoo/custom_addons),配置远程地址,实现免账号密码拉取代码(使用新生成的 GitHub 个人访问令牌):
git remote set-url origin https://<your_token>@github.com/<username>/<repository>.git
第 3 步:编写部署任务
创建 .github/workflows/deploy.yml,该任务会在向 main 分支推送代码时触发:
name: Deploy Odoo
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.2.2
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
set -e
cd /opt/odoo/custom_addons
git pull origin main
sudo systemctl restart odoo
这是一个 GitHub 工作流示例:仅靠一份 YAML 文件,原本繁琐、容易出错的流程就变成自动化流水线,每次推送代码都会自动部署到服务器并重启服务。