利用gitlab打造odoo的ci/cd流程

对于odoo,国内很少能看到较为规范的自动化运维流程,基本还停留在人工手动更新的时代,相对于互联网时代难免显得有些落后了,本篇文章将以gitlab的ci/cd功能为蓝本,介绍一个自动化运维odoo开发的可操作流程。

为什么是Gitlab

关于CI/CD,像github等都有自己的一套工具,但是由于github的私有仓库还是有人头的限制,所以这里我们选择了没有人数限制的gitlab。至于国内一些git仓库,鉴于一些众所周知的原因,不(最)做(好)推(不)荐(用)。

创建Gitlab的仓库

Gitlab注册免费,仓库免费,且没有数量限制,这里我们创建一个Project,命名为demo.

然后把自己的代码上传到git仓库中:

创建Runner

Runner,就是运行你项目代码的容器,有两种,一种是gitlab官方提供的共享Runner,有运行次数限制。另一种是自己创建的本地Runner,没有次数限制。因为我们要运行的是odoo,环境搭建相对复杂,这里就使用自己创建的Runner而不用共享Runner了。

在Settings-CI/CD-Runner中,关闭共享Runner,并创建自己的Runner。Gitlab中有关于创建Runner的详细教程,这里不再赘述,需要注意的是推荐使用包安装而不是源码安装的方式进行,因为源码安装可能会有众多坑需要趟。

创建完Runner并启动后,可以在gitlab中看到就绪的Runner:

创建.gitlab-ci.yml文件

.gitlab-ci.yml文件是gitlab进行CI/CD操作的脚本文件,关于yml文件的写法请参考gitlab文档。

这里举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
stages: 
- test
- deploy

unit:
tags:
- OSC
stage: test
script:
- odoo --test-enable -d odootest -u osc_demo --workers=0 -c /etc/odoo/odootest.conf --log-level=test --stop-after-init


deloy:
tags:
- OSC
stage: deploy
script:
- sudo cp -rf $CI_BUILDS_DIR/Z4ysM4if/$CI_CONCURRENT_PROJECT_ID/orssica/osc_demo /home/ubuntu/odoo/odoo-dev/custom/addons/
- sudo service odoo restart
  • stages: 表明pipline的阶段,一般为build,test,delpoy三个。
  • unit和deloy是我们自定义的两个job,gitlab支持编写无数个job。
  • tags:指明要运行这个job的Runner标签,这里的OSC代指得就是我们之前创建得Runner.
  • script: 要运行的脚本命令,这里我们在unit这个job中运行单元测试,然后再deploy这个job中拷贝代码,重启odoo服务。

如果发现job被挂起,并提示说没有可用的Runner,那么你需要使用tags明确的指出使用哪个Runner来运行。

编写Odoo的单元测试

Odoo的单元测试写法可以参考官网教程.

需要注意的是,你可能会发现,自己写的测试脚本并不能运行,这里需要在你的脚本里添加tag:

1
2
3
@tagged('post_install', '-at_install')
class TestDemos(TransactionCase):
...

然后使用命令:

1
odoo --test-enable -d odootest -u osc_demo --workers=0 -c /etc/odoo/odoo.conf --log-level=test --stop-after-init

来测试你的测试脚本是否可能正常运行。

运行Runner

一切就绪以后,我们就可以提交一次代码来验证了,随便在代码中修改一下,然后提交推送到gitlab中,然后我们可以看到:

这里我们看到,由于unittest发生的错误,后边的部署就没有运行。修正单元测试中的错误以后,再次运行脚本就可以了。

分支保护

master肯定不希望被开发人员进行推送的代码,这样会会影响线上程序的稳定,因此我们改变了一下流程,变成了,开发人员只允许推送的v分支,只有合并到master的时候才进行测试和部署代码。

首先,我们需要把master分支保护起来,在settings-respository-Protected Branches中,设置为master分支只允许合并,不允许推送。

然后修改.gitlab-ci.yml文件为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
stages: 
- test
- deploy

unit:
tags:
- OSC
stage: test
only:
- master
script:
- odoo --test-enable -d odootest -u osc_demo --workers=0 -c /etc/odoo/odootest.conf --log-level=test --stop-after-init

deloy:
tags:
- OSC
stage: deploy
only:
- master
script:
- sudo cp -rf $CI_BUILDS_DIR/Z4ysM4if/$CI_CONCURRENT_PROJECT_ID/orssica/osc_demo /home/ubuntu/odoo/odoo-dev/custom/addons/
- sudo service odoo restart

往master上推送就会发现被拒绝:

然后再界面上进行合并分支操作,就会触发自动部署。

总结

这里仅仅是通过gitlab的一个小例子来说明,对于Odoo的开发也是可以规范化正规化的,像其他CI/CD的工具(Jenkins)肯定也是可以的,等有时间我们再来说一下,如何用Jenkins来实现Odoo的自动化部署。

你的支持我的动力