在ZUUL服务的核心进程中,MERGER也是一个比较重要的部分。通过gerrit触发的commit事件,由该进程预先在ZUUL本地的workspace做代码合并操作,后续的测试job也是基于ZUUL本地的workspace进行的。下面将从ZUUL源代码的角度,剖析MERGER进程的启动流程。
merge_root =self.config.get('merger','git_dir')
默认 '/var/lib/zuul/git'
merge_email =self.config.get('merger','git_user_email')
merge_name =self.config.get('merger','git_user_name')
3.2. 初始化Merger类,用于封装对git的命令行操作
self._makeSSHWrappers(working_root, connections)
ZUUL MERGER对git命令的封装是使用Python开源库GitPython的方式。
GitPython需要设置环境变量'GIT_SSH'对应一个到gerrit server的SSH Wrapper
cmd_line ='ssh -i %s $@\n'% key (该key在zuul.conf文件中配置)
更多详细介绍:https://gitpython.readthedocs.io/en/stable/
3.3. 注册gearman worker
绑定gear Server信息 ,创建到gear server的连接对象,添加到未激活连接列表中。
启动PollLoop线程,处理数据包
启动ConnectLoop线程,激活列表中还未激活的连接
3.4. 启动线程轮询gearman server已注册的task
self.thread = threading.Thread(target=self.run)
job =self.worker.getJob()
ifjob.name =='merger:merge':self.merge(job)
elifjob.name =='merger:update':self.update(job)
else:job.sendWorkFail()
流程图如下:
领取专属 10元无门槛券
私享最新 技术干货