穷人的Gitlab CE和Jenkins整合

wl2*_*776 10 jenkins gitlab

更新 此脚本现已过时,因为Jenkins中的Gitlab插件现在可以将构建状态报告给Jenkins.

我正在尝试集成Gitlab CE 8.4和Jenkins.我已经读过Jenkins CI集成在Gitlab EE中可用,但目前它不是一个选项.

我已经设置了Jenkins gitlab插件和Web钩子,并推送到我的repo触发器构建的Jenkins作业.但是,这些构建不会显示在相应Gitlab页面的"构建"选项卡中.如果我将.gitlab-ci.yml文件提交到存储库,Web挂钩仍然有效,Jenkins作业会运行,但是"Builds"页面显示构建被卡住,因为没有定义任何跑步者.

实际上,据我所知,我没有设置任何Gitlab CI跑者,因为他们与Jenkins无关.

我想保留Jenkins的工作,因为那里发布了一些有用的信息,我也希望在Gitlab页面上有自己的状态.我正在考虑这个关于Gitlab CI runner的简单脚本,它将从Jenkins作业中捕获控制台输出并将其转换为Gitlab.像运行wget或curl之类的东西,因为Jenkins提供API来查看作业的输出.

但是,有关Gitlab CI和.gitlab-ci.yml的文档以及示例都是有限的.

我怎么能写那份工作档案?我是否正确地认为Gitlab会收到职业的标准?

wl2*_*776 4

是的,Gitlab-CI 打印作业的标准输出并与退出代码相关。

我的解决方案由已安装的 Gitlab-CI 运行程序和从 调用的 python 脚本组成,.gitlab-ci.yml该脚本从CI_BUILD_REF环境变量获取 git commit ID,连接到 Jenkins 主机,找到相应的构建控制台,通过 读取输出urllib2.urlopen(...).readlines(),并将其打印到 stdout。

它使用bySHA1Jenkins Git 插件提供的 url 来查找构建控制台。

该脚本还会查找以该单词开头的行Finished:,并根据该单词后面的内容以退出代码退出:如果是 则为 0 SUCCESS,如果FAILURE, or 则为1 UNSTABLE

脚本文本:

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())
Run Code Online (Sandbox Code Playgroud)

此外,.gitlab-ci.yml

jenkins-translate:
  script: 
    - python jenkins-translate.py
Run Code Online (Sandbox Code Playgroud)

缺点很明显:按取消按钮实际上取消翻译,而不是 Jenkins 作业,没有指向 Jenkins 作业页面的可点击链接。

至少它可以告知 Jenkins 的工作状态。

更新。该脚本未授权 Jenkins,它假设宽松的安全设置,此时每个人都可以看到作业输出。

更新2。Jenkins-Gitlab 插件现在可以将构建状态报告回 Gitlab,从而废弃此脚本。