繁体   English   中英

穷人的 Gitlab CE 和 Jenkins 集成

[英]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,如果为FAILUREUNSTABLE则为 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM