[英]Poor man's Gitlab CE and Jenkins integration
更新答案中的脚本现在已过时,因为Jenkins 的 Gitlab 插件现在可以将构建状态报告回 Jenkins。
我正在尝试集成 Gitlab CE 8.4 和 Jenkins。 我读过 Jenkins CI 集成在 Gitlab EE 中可用,但目前它不是一个选项。
我已经设置了 Jenkins gitlab 插件和 Web 钩子,并推送到我的 repo 触发器构建 Jenkins 作业。 但是,这些构建未显示在相应 Gitlab 页面的“构建”选项卡中。 如果我将 .gitlab-ci.yml 文件提交到存储库,网络钩子仍然有效,Jenkins 作业运行,但“构建”页面显示构建被卡住,因为没有定义运行器。
事实上,我还没有设置任何 Gitlab CI runner,因为据我所知,它们与 Jenkins 无关。
我想保留我的 Jenkins 工作,因为那里发布了一些有用的信息,我也想在 Gitlab 页面上显示它的状态。 在这方面,我正在考虑为 Gitlab CI runner 编写一个简单的脚本,它可以从 Jenkins 作业中捕获控制台输出并将其转换为 Gitlab。 像运行 wget 或 curl 之类的东西,因为 Jenkins 提供了 API 来查看作业的输出。
但是,关于 Gitlab CI 和 .gitlab-ci.yml 的文档以及示例是有限的。
我怎么能写那个作业文件? 我认为 Gitlab 收到工作的标准输出是否正确?
是的,Gitlab-CI 打印作业的标准输出并与退出代码相关。
我的解决方案包括已安装的 Gitlab-CI runner 和从.gitlab-ci.yml
调用的 python 脚本,它从CI_BUILD_REF
环境变量中获取 git commit ID,连接到 Jenkins 主机,找到相应的构建控制台,通过urllib2.urlopen(...).readlines()
读取输出urllib2.urlopen(...).readlines()
,并将其打印到标准输出。
它使用由 Jenkins Git 插件提供的bySHA1
url 来查找构建控制台。
该脚本还会查找以单词Finished:
开头的行,并根据该单词Finished:
以退出代码退出:如果是SUCCESS
则为 0,如果为FAILURE
或UNSTABLE
则为 1。
脚本文本:
import urllib2
import os
import sys
import time
TIMEOUT = 5
def get_build_console_for_sha1(url, sha1):
return '{}/scm/bySHA1/{}/consoleText'.format(url, sha1)
def parse_console(build_con):
retcode = 0
if build_con:
total_read_lines = 0
finished_line = None
while not finished_line:
current_read_lines = 0
try:
for line in urllib2.urlopen(build_con,
None, TIMEOUT).readlines():
current_read_lines += 1
if current_read_lines >= total_read_lines:
print line,
total_read_lines += 1
sys.stdout.flush()
if line.startswith('Finished: '):
finished_line = line
except urllib2.HTTPError as e:
if e.code == 404:
time.sleep(2)
pass
if 'FAILURE' in finished_line or 'UNSTABLE' in finished_line:
retcode = 1
print "retcode = ", retcode
return retcode
def main():
URL = 'JENKINS_JOB_URL'
sha1 = os.getenv('CI_BUILD_REF')
bc = get_build_console_for_sha1(URL, sha1)
return parse_console(bc)
if __name__ == '__main__' :
sys.exit(main())
此外, .gitlab-ci.yml
:
jenkins-translate:
script:
- python jenkins-translate.py
缺点很明显:按下取消按钮实际上会取消翻译,而不是 Jenkins 作业,没有指向 Jenkins 作业页面的可点击链接。
至少它会告知 Jenkins 的工作状态。
更新。 此脚本不授权给 Jenkins,它假设安全设置宽松,每个人都可以看到作业输出。
更新2 。 Jenkins-Gitlab 插件现在可以将构建状态报告回 Gitlab,这将废弃此脚本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.