持续集成 gerrit 提交触发 redmine 和 bugzilla 对应 id 状态更改

不二家的小球迷 · August 16, 2017 · 2086 hits

背景

开发根据Bugzilla和Redmine中的bug和issue,会做相应的需求开发,在开发完毕以后,会根据bug id或者issue id提交git commit message。

例如

fix |#0000>修复bug
feat|#00001>新增需求

我们的开发代码在提交以后,之前是需要手动打开Bugzilla或者Redmine,然后手动修改对应的状态,希望可以实现代码提交以后自动更改对应id状态。

那么这个需求怎么实现呢?

是需要打通Gerrit Redmine and Bugzilla的连接,思路是通过中介Jenkins实现


先找到到Redmine和Bugzilla的REST API

Redmine: http://www.redmine.org/projects/redmine/wiki/Rest_api

Bugzilla: https://bugzilla.readthedocs.io/en/latest/

然后实现离线更改Redmine和Bugzilla状态


1、Redmine的实现,可以借助python-redmine的库

def _redmine(url, key, issueId):
redmine = Redmine(url, key=key, requests={'verify': False})

# issue status_id分为6种,1:new,2: In Progress,3:Resloved,
# 4:Feedback,5: Closed
redmine.issue.update(issueId, status_id=3)

只要传入对应配置的Redmine的url,自己个人的token,自己的user token可以在登录之后,在我的账号下查看。

我的账号下,有一个API访问键,然后点击显示

这里的issue id是在Redmine新建issue以后,固有id。

2、Bugzilla的实现,直接通过requests库实现。

最初的设想也是通过,python-bugzilla的库实现,但是很奇怪,一直我们的url和token一直调不通,后来直接参考 https://bugzilla.readthedocs.io/en/latest/, 里面关于update bug的描述,直接用requests实现,也很简单。

def _bugzilla(url, key, bugId):
headers = {'Content-Type': 'application/json'}
bug_update = {
'ids': [bugId],
'status': 'RESOLVED',
'resolution': 'FIXED'
}

url = '{url}/bug/{id}?api_key={key}'.format(url=url, id=bugId,
key=key)
response = requests.put(url, headers=headers,
data=json.dumps(bug_update), verify=False)
assert response.status_code == 200

这里的url和key,同样是在部署之后的本地获取,key值是在登录之后,在账号下的API值里面生成获取。

这里的bugId就是对应的是bug的id。

小贴士,这里的status如果需要改成Resovled和Closed需要增加一个resolution字段。

此时,我们已经实现了离线触发更改Redmine和Bugzilla状态,那么下面的用Jenkins中介已经很容易实现了。

Jenkins内的配置

只需要在Jenkins内配置Gerrit事件触发,是选择Change Merged,然后加上需要监控的项目就行。

小贴士:如果我们不想我们的job发生的成功或者错误对当前的代码提交有任何影响,可以勾上Slient Mode。

集成配置

最后只需要将git commit message内的id字符取出,判断是Redmine或者是Bugzilla,然后更改对应id的状态即可。

欢迎加入我们

写在最后,我们的日常工作就是这些小而有意思的内容,如果想加入我们,可以看这封华米招聘

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up