Alan Hou的个人博客

【翻译中】Odoo 14开发者指南第十九章 使用Odoo.sh管理、部署和测试

全书完整目录请见:Odoo 14开发者指南(Cookbook)第四版

本章中,我们将讲解如下内容:

引言

2017年,Odoo发布了Odoo.sh,一个全新的云端服务。Odoo.sh是一个让测试处理、部署和Odoo实例监控都尽可能简单的平台。本章中,我们将来看Odoo.sh 的运作方式,以及何时应使用它来代替其它部署选项。

ℹ️本章假定你能使用Odoo.sh。这是一个付费服务,你需要订阅码来访问该平台。如果你是一个Odoo合作伙伴,可能获取到免费的Odoo.sh订阅码。否则需要通过https://www.odoo.sh/pricing来进行购买。

即使你没有订阅码也可以学习本章,其中有大量的截图可帮助你了解这个平台。

技术准备

本章的技术准备包含在线Odoo平台。

本章中使用的所有代码可通过GitHub仓库进行下载:https://github.com/PacktPublishing/Odoo-12-Development-Cookbook-Third-Edition/tree/master/Chapter19。

观看如下视频来查看实时代码操作:

探讨Odoo.sh的一些基本概念

本节中,我们将来了解一些Odoo.sh平台的功能。并解答一些基础问题,如应在何时使用它,以及其原因。

什么是Odoo.sh?

Odoo.sh是提供能够托管自定义模块Odoo实例的平台。简单地说,这是Odoo的平台即服务云(PaaS)解决方案。它完全集成GitHub:任何带有效Odoo模块的GitHub仓库可以分分钟在 Odoo.sh上启动。同期你可以通过测试多个分支来查看开发进度。一旦将实例迁移至生产,可以通过生产数据库的拷贝来测试一些新功能,这有助于避免回退。它还会进行每日备份。简单地说通过Odoo.sh,你可以有效部署Odoo实例,哪怕是你对DevOps一窍不通。它自动使用最优配置来设置Odoo实例。注意Odoo.sh用的是Odoo企业版。此处无法使用Odoo社区版。

为什么要引入Odoo.sh?

在引入 Odoo.sh之前,有两种托管Odoo实例的方式。第一种是使用在线Odoo,是一种软件即服务(SaaS)云端服务。第二种方式是自有主机选项,这时你需要自己托管Odoo实例并在自己的服务器上进行配置。这两种试都各有优缺点。使用在线Odoo选项,你无需执行任何配置或部署,因为它是一种SaaS服务。但是,你无法在这个平台上使用自定义模块。另一方面,通过自有主机选项,你可以使用自定义模块,但是需要自己完成所有事务。你需要购买服务器、配置Nginx、设置邮件服务器、每日备份以及安全配置。

出于这一原因,出现了对既提供在线Odoo的易用性又拥有自有主机的灵活性的需求。Odoo.sh让你无需进行复杂配置即可以使用自定义模块。它还提供了一些附加选项,如测试分支、预发布(staging)分支和自动化测试。

ℹ️使用在线Odoo无法进行自定义并非完全属实。通过Odoo Studio和其它技术,你可以进行自定义。但自定义的范围相对较小。

何时应使用Odoo.sh?

如果你无需自定义或者仅需在在线Odoo中进行少量的自定义,应该继续使用在线Odoo。这样可以既节省时间又节约成本。而如果你希望进行大量的自定义并且有专业DevOps工程师的协助,那么应选择自有主机选项。Odoo.sh 适合那此对Odoo自定义有着良好的掌握而又没有DevOps专业知识的人。通过Odoo.sh,无需执行复杂的配置,你可以马上就开始使用,并进行自定义。它甚至已经配置好了邮件服务。

在你使用敏捷方法开发大型项目时Odoo.sh会有很大的帮助。这是因为在Odoo.sh中,你可以同步测试多个开发分支并在几分钟内在生产环境上部署开发的稳定版。你甚至可以将测试开发内容分享给终端用户。

Odoo.sh的有哪些功能?

Odoo投入了大量的时间来开发Odoo.sh平台,因此它内置了很多的功能。让我们了解一下Odoo.sh的功能。注意Odoo会保持新增功能。这个版块中,我讨论的是在编写本书时可以使用的一些功能,但还有其它未表述的功能:

创建一个Odoo.sh账户

本节中,我们将创建一个Odoo.sh账户以及一个针对自定义插件的空仓库。

准备工作

学习本节,你会需要一个用于添加自定义模块的GitHub账户。你还将需要一个Odoo.sh订阅码。如果你是Odoo官方合作伙伴,你将可以获取到免费的 Odoo.sh订阅码。否则,你需要通过https://www.odoo.sh/pricing来进行购买。

如何实现…

按照如下步骤来创建一个Odoo.sh账户:

  1. 打开https://www.odoo.sh并点击顶部菜单中的Sign in。这会将你重定向到GitHub页面:
    TODO
  2. 进行仓库的授权,然后会重定向回到 Odoo.sh。填写表单来部署实例:
    TODO
  3.  这会部署实例并重定向到Odoo.sh控制面板。等待构建状态成功,然后,你可以通过下图中显示的CONNECT按钮连接到你的实例:
    TODO

运行原理…

Odoo.sh平台与GitHub相集成。你需要对Odoo.sh进行完全授权,这样它才能访问到你的仓库。Odoo.sh还会创建网页钩子(webhook)。GitHub网页钩子会在有新提交或仓库中新增了分支时通知Odoo.sh。初次登录时,Odoo.sh会将你重定向到GitHub。GitHub会显示一个类似第1步快照中的页面,其中你需要对所有的公有和私有仓库进行授权访问。如果你不是仓库的所有者,会看到向所有者请求访问的按钮。

在对Odoo.sh授予仓库权限之后,你将会被重定向回到Odoo.sh,这里你可以看到部署Odoo实例的表单。需要添加如下信息来创建新实例:

一旦提交了这个表单,你的Odoo实例会进行部署并且你会被重定向到Odoo.sh控制面板中。这里你将可以看到第一个构建。构建会花费几分钟,然后你就可以连接到自己的Odoo实例了。如果查看左侧的面板,你会看到在生产和预发布版块中没有分支,只在开发版块中有一个分支。在接下来的几个小节中,我们将学习如何创建预发布和生产分支。

扩展知识…

目前Odoo.sh仅能配合GitHub使用。尚不支持其它版本控制系统,如GitLab和bitbucket。如果想要使用GitHub以外的系统,可以使用通过子模块来使用中间GitHub仓库关联到你的实际仓库。未来,Odoo会支持GitLab以及bitbucket,但按照Odoo官方的说法这在当前的优先级不高。这里所推荐的方法只是在你想要使用GitLab或bitbucket时的一种变通方式。

添加和安装自定义模块

如同在探讨Odoo.sh的一些基本概念一节中所述,在Odoo.sh平台中,你可以添加自定义的Odoo模块。这个平台集成了GitHub,因此在已注册的仓库中添加新的提交会在对应的分支中新建构建。本节中,我们将在自己的仓库中添加自定义模块并在Odoo.sh中访问该模块。

准备工作

本例中我们将选择第十八章 自动化测试用例中的my_library模块。在本节中你可以使用任意有效Odoo模块,但这里我们会使用该模块及测试用例,因为Odoo.sh平台会自动执行所有的测试用例。为进行简化,我们在本书GitHub仓库的Chapter19/r0_initial_module/my_library中添加了这一模块。

如何实现…

按照如下步骤来对 Odoo.sh添加你自己的自定义模块:

  1. 在本地机器获取你的git仓库,在其中添加my_library仓库,然后执行如下命令来将该模块推到GitHub仓库中:
  2. 在Odoo.sh中打开你的项目。此处,你会发现针对这次提交的新构建。它会开始运行测试用例并会出现下图的内容:
    TODO
  3. 在从你的Odoo.sh项目中拉取了新提交后,你可以在右侧看到安装的进度。等待安装完成,然后通过点击绿色的CONNECT按钮来完成安装。它会打开安装有my_library模块的Odoo实例:
    TODO

访问并测试my_library模块。注意这不是一个生产构建,因此你可以按喜欢的方式进行测试。

运行原理…

在第1步中,我们在GitHub仓库中上传了my_library模块。通过网页钩子Odoo.sh 会马上被告知到这些修改。然后Odoo.sh会开始构建新实例。它会安装你的所有自定义模块及依赖。通过这些安装的模块新构建会自动执行测试用例。

ℹ️默认Odoo.sh仅会安装自定义模块及它们的依赖。如果你想要修改这一行为,你可以通过全局设置中的模块安装版块来进行。我们将在下面的几节中深入地讲解这些设置。

在HISTORY标签中,你将能够查看分支的完整历史记录。此处,你可以找到有关这个构建的基本信息。它会显示提交信息、作者信息和提交的GitHub链接。在右侧,你会获取到构建的实时进展。注意这些在开发版块中的构建将使用演示数据安装该模块。在接下来的几个小节中,你将详细看到生产、开发和预发布分支之间的区别。

在一次成功构建后,你会看到一个连接到该实例的按钮。默认,你将通过admin用户有来进行连接。使用下拉菜单中的CONNECT,可以转而使用demo和门户用户来进行登录。

扩展知识…

Odoo.sh会为每个新的提交创建一个新的构建。可以在分支的SETTINGS标签中修改这一行为:

TODO

此处你可以对分支进行“静音”。如果你点击 Ignore new commits复选框,Odoo.sh会停止监听新提交且不会再生成新的构建。另一个选项是Behavior upon new commits。修改这一选项会更新已有构建而不会为新提交创建一个新的构建。

管理分支

在Odoo.sh中,你可以配合生产分支创建多个开发和预发布分支。本节中,我们将创建不同类型的分支并查看它们之间的不同。你将了解如何开始、测试和部署新功能的完整工作流。

准备工作

访问https://www.odoo.sh/project并打开我们在创建一个Odoo.sh账户一节中所创建的项目。我们将创建一个针对新功能的开发分支,然后在预发布分支中进行测试。最后,我们将在生产分支中合并这一功能。

如何实现…

本节中,我们将在Odoo.sh中创建所有类型的分支。此时我们在生产环境中没有任何分支,因此我们会先创建一个生产分支。

创建生产分支

现在,我们在开发版块中只有一个master分支。master分支的最后一次构建显示一个绿色标签Test: success,意思是所有的自动化测试用例都成功运行了。我们可以将该分支移到PRODUCTION分支中,因此测试用例状态显示一切正常。为将master分支移到PRODUCTION分支中,你只需将master分支从开发版块拖拽到生产版块即可,如下图所示:

TODO

这会创建PRODUCTION分支。可以通过右侧的connect按钮访问生产分支。一旦你打开了生产实现,会注意到在生产数据库中没有安装应用。这是因为生产实例要示你或你的终端客户根据需求安装并配置操作。注意这是生产实例,因此为保持该实例运行,你需要输入企业订阅号。

创建开发分支

你可以直接通过浏览器创建开发分支。点击开发版块旁边的加号 (+) 按钮。这会显示两种类型的输入。一种是要fork(复刻)的分支,另一个是开发分支的名称。在填写完后,点击Enter键。

这会通过复刻给定分支新建分支,如下图所示:

TODO

小贴士:如果你希望通过用户界面创建开发分支,可以通过GitHub直接进行创建。如果在GitHub仓库中添加了一个新分支,Odoo.sh会自动新建一个开发分支。

开发中的分支通常是新功能分支。作为示例,我们将在library.book模型中新增字段。按照如下步骤来在图书模型中新增HTML字段:

  1. 在声明文件中提升模块版本:
  2. 在library.book模型中新增字段:
  3. 在图书的表单视图中新增一个description字段:
  4. 通过在Terminal中执行如下命令推送新功能分支中的修改:

这会在Odoo.sh中新增一个构建。在成功构建后,你可以通过访问该实例测试这个新功能。你将能够在图书的表单视图中看到一个新的HTML字段。注意这个分支为开发分支,因此新功能仅在该分支中可用。生产分支并未进行任何修改。

创建预发布分支

一旦你完成了开发分支并且测试用例已成功运行,可以将该分支移到STAGING版块中。这是预发布版块。这里会通过生产数据库的拷贝来测试新功能。有助于我们发现在生产数据库中可能产生的问题。从生产分支移到STAGING分支中,只需要将该分支拖拽到STAGING版块中即可。

TODO

一旦你将DEVELOPMENT分支移到STAGING版块中,就可以使用生产数据测试新的开发代码了。如同其它的构建一样,你可以通过右侧的CONNECT按钮访问STAGING分支。本例中唯一的不同是你将可以查看生产数据库中的数据。此处开发模块仅当你在声明文件中增加模块版本号之后都会自动更新。如果你还没修改模块版本,则需要手动升级模块来查看新功能。

ℹ️预发布分支将使用生产数据库的拷贝,因此预发布实例会拥有真实的客户和邮箱。出于这一原因,在预发布分支中会禁用真实的邮件,来避免在测试预发布分支的新功能时误发送邮件给客户。

在生产分支中合并新功能

在通过生产数据中(预发布分支中)测试了新的开发之后,可以将新开发部署到PRODUCTION分支中。和此前一样,你只需要从STAGING分支拖拽到PRODUCTION分支中。这会将新功能合并到master分支中。如同STAGING分支,开发模块仅在声明文件中增加了模块版本号时才会合并新功能的分支。然后,这个新模块即对终端客户可用。

TODO

运行原理…

在前例中,我们执行了部署新功能到开发分支的完整工作流。如下列表讲解了Odoo.sh中不同类型分支的用途:

这是如何将新功能合并到生产分支中的完整工作流。下一节中我们将了解这些分支中可以使用的其它选项。

访问调试选项

Odoo.sh提供针对分析和调试的不同功能。本节中,我们将探讨所有这些功能和选项。

如何实现…

我们将在本节中使用相同的Odoo.sh项目。每个选项将在不同的版块中显示,并带有截图。

分支历史

读者已经在前面小节中了解到这一功能。HISTORY标签显示完整的分支历史 。你可以通过这里连接相应的构建:

TODO

邮件捕捉器

预发布分支使用生产数据库的拷贝,因此它拥有客户的信息。测试预发布分支可能会向真实客户发送邮件。这也是为什么邮件功能仅在生产分支中启用。预发布分支和开发分支不会发送真实邮件。如果想要在部署功能到生产分支前测试邮件系统的话,可以使用邮件捕捉器来查看所有的发出邮件的列表。在预发布分支和开发分支中均可使用邮件捕捉器。

邮件捕捉器会显示所有邮件的发送源和附件,如下图所示:

TODO

网页 Shell

通过SHELL标签,可以访问网页shell。此处你可以访问到源代码、日志、文件存储等等。它通过nano和Vim等编辑器提供所有的shell功能。你可以通过pip来安装Python包并维护多个标签。

查看下图,你可以通过SHELL标签来访问网页shell:

TODO

以下是根目录下的目录结构:

代码编辑器

如果你不习惯使用网页shell。Odoo.sh还提供了一个全功能的编辑器。这里你可以访问Python shell、Odoo shell和终端命令行。还可以通过此处编辑源代码,如给出的截图中所示。在修改了源代码之后,可以通过顶部的Odoo菜单重启服务:

TODO

日志

通过LOGS标签栏,可以访问实例的所有日志。你可以无需重载页面就查看到实时日志。可以通过此处过滤日志。这允许我们查看生产服务中的问题。以下是在LOGS标签中可以查找到的不同日志文件:

参见下图。它会显示生产分支的实时日志:

TODO

护展知识…

一些常用的git命令在模块的顶部中可以使用,如下图所示。你可以通过使用左侧的Run按钮来运行它们。这些命令无法进行编辑,但如果你想要修改命令的话,可以从这里拷贝命令并在shell中运行:

TODO

获取你的实例的备份

备份是生产服务器的基础操作。Odoo.sh提供了内置的备份工具。本节中我们将演示如何通过Odoo.sh下载及还原备份。

如何实现…

在生产分支中,你可以通过顶部的backup标签访问到所有有关备份的信息。这会显示一个备份列表:

TODO

通过顶部的按钮,可以执行一些备份操作,如下载dump,执行手动备份或从备份还原。

运行原理…

Odoo每日自动对生产实例进行备份。Odoo还在每次你合并一个新开发分支及更新模块时进行自动备份。你也可以通过顶部的按钮进行手动备份。

Odoo.sh总共保留三个月内Odoo生产实例的14个完整备份:7天的日备份、4周的周备份以及3个月的月备份。通过backup标签,你可以访问一个月备份(7个日备份和4个周备份)。如果想要获取更早的备份,可以通过Odoo.com寻求帮助。

如果你通过自有主机或在线 Odoo 迁移到Odoo.sh,可以使用Import Database按钮导入数据库。如果直接在生产分支中导入数据库,可能会产生问题。避免这一问题,应首先在预发布分支中导入数据库。

查看你的构建的状态

每当前进行新提交时,Odoo.sh都会创建一个新的提交。它还会执行自动化测试用例。要管理所有这些,Odoo.sh有其自己的runbot。本节中,我们将通过runbot查看所有这些构建的状态。

如何实现…

点击顶部的Builds菜单来打开runbot。这里你可以查看所有分支和它们的提交的完整概览:

TODO

通过点击Connect,你可以连接实例。可以通过分支的背景色来查看构建的状态。

运行原理…

在runbot界面中,你可以对构建进行更多的控制。可以通过这里连接到之前的构建。不同的颜色显示了构建的状态。绿色表示一切正常,黄色表示警告,可予以忽略,但推荐进行解决。红色表示严重问题,需要在将生产分支合并到生产分支前进行修复。红色和黄色在connect按钮旁显示有感叹号图标。点击它弹出错误和警告日志。通常,你需要搜索安装日志来查找错误和警告日志,但这个弹窗会过滤掉其它日志,仅显示错误和警告日志。这表示每当构建变红或黄时,你应当到这里来在合并到生产分支前修复这些错误和警告。

非活跃开发分支在一段时间后会被删除。通常,在添加一个Commit按钮时会新建一个构建。如果想不进行新提交就重新激活这个构建的话,你可以使用右侧的rebuild按钮。预发布分支的构建也会在一段时间后删除,只有最后一个会保持激活状态。

扩展知识…

通过顶栏中的Status菜单,可以查看实例的整体数据。平台上的各服务都有持续的监控。在Status界面,你可以查看到服务可用性的数据,这会通过平台的监控系统自动进行计算。它会显示包含服务启动时间的数据。Status页面会显示服务的输入和输出数据。状态页面会显示如下信息:

TODO

Odoo.sh的所有选项

Odoo.sh在设置菜单下提供了一些其它的选项。本节中,我们将学习用于在平台上修改指定事项默认行为的所有重要选项。

准备工作

我们将使用与前面小节相同的Odoo.sh项目。你可以通过顶栏中的设置菜单来访问所有的Odoo.sh设置。如果你无法查看这个菜单,那么表示正在访问一个共享项目并且没有管理员权限。

如何实现…

通过顶栏中的设置菜单打开设置页面。我们会在下面的版块中来查看各个选项。

项目名

你可以通过这个选项修改Odoo.sh项目的名称。输入框中的Project Name可用于生成生产分支URL。开发分支也使用这个项目名称来作为前缀。本例中,我们的功能分支的URL会类似https://parthgajjar-odooshdemo-feature-branch-260887.dev.odoo.com。

小贴士:这个选项会修改生产URL,但不能去除掉*.odoo.com。如果你希望在自定义域名上运行生产分支,可以在生产分支的设置标签栏中添加自定义域名。你还需要在自己域名的DNS管理器中添加一个CNAME。

协作者

可以通过添加协作者在分享项目。此处,你可以通过他们的GitHub ID来搜索和添加一个新协作者。协助者可拥有Admin或User访问权限。具有管理员访问权限的协作者可以进行所有(包含设置)的访问。而具有用户权限的协作者将会拥有受限的访问权限。他们可以看到所有构建,但无法访问生产或预发布分支的备份、日志、shell或email,但他们具有开发分支的所有访问权限:

TODO

ℹ️你还将需要对这些用户授予GitHub仓库的访问权限;否则他们将无法通过浏览器新建仓库。

对公访问

使用这个选项,你可以与终端用户分享构建。这可用于演示或测试。实现这点,你需要启用Allow public access复选框:

TODO

注意预发布分支和生产分支有着相同的密码。但是在开发分支中,你将拥有如下表中这样的用户名和密码:

用户名密码
adminadmin
demodemo
portalportal

模块安装

这会修改针对开发分支的模块安装的方法。它提供3个选项,如下图所示:

TODO

默认设置为仅安装我的模块。这个选项会在新的开发分支中安装所有你自己的自定义模块及它们的依赖模块。自动化测试用例仅针对这些模块执行。第二个选项是完整安装。这个选项安装所有模块并对所有这些模块执行自动化测试用例。最后一个选项是安装列表中模块。在这个选项中,你将需要传递一个逗号分隔的模块列表,如sales,purchases和my_library。这个选项会安装给定的模块及它们的依赖。

这个设置仅应用于开发构建。预发布构建复制生产构建,因此它们会有在生产分支中安装的相同模块并对在声明文件中拥有更新版本的模块执行测试用例。

子模块

子模块选项在你使用私有模块作为子模块时使用。这一设置仅需对私有子模块使用;公有子模块可以正常运行,没有任何问题。无法对公下载私有仓库,因此你需要给Odoo.sh该仓库的权限。按照如下步骤来对私有子模块添加权限:

  1. 在输入框中复制私有子模块仓库的SSH URL并点击Add。
  2. 复制所显示的Public Key。
  3. 在GitHub私有仓库的设置中添加这一对公密钥作为部署密钥(bitbucket和GitLab中也有类似的设置):
    TODO

数据库worker

你可以在生产构建中提升worker的数量。这在拥有更多用户时会非常有用,单个worker可以处理25个后台用户或25000个日网站访客。这个公式并不完美,根据用法会存在变化。这个选项并不是免费的,提升worker的数据会增加Odoo.sh订阅的计费:

TODO

这些Database Worker是多线程的,每一个可以处理15个并发请求。拥有足够的 worker来对进入的请求进行服务非常有必要,便worker的数量的增加并不会提升请求处理时间的速度。它仅用于处理大量的并发用户。

预发布分支

预发布分支用于使用生产数据库测试新开发模块。默认Odoo.sh仅给出一个预发布分支。如果你运行一个拥有大量开发者的大型项目,这可能会成为开发过程中的瓶颈,因此你可以支付更多费用来增加预发布分支的数量:

TODO

扩展知识…

配置选项外,设置菜单中还显示一些与平台相关的数据。

数据库大小

这一版块将展示你的生产数据库的大小。Odoo.sh平台对数据库的收费为$1/GB/月。这个选项有助于对你的数据库进行跟踪。所显示的数据库大小针对生产数据库,它不包含预发布和开发分支的数据库:

TODO

Odoo 源代码修订

这一版块将显示Odoo项目的GitHub修订版号码。它会显示针对社区版、企业版和在平台中当前使用的主题项目的修订版哈希。源代码每周会自动更新。这个选项有且于在本机上获取完全一致的版本。你还可以通过仓库中的git命令在网页shell中查看它。

退出移动版