避免代码merge后无法构建发布问题解决方案(GItlabCI + Jenkins)

Posted mascot1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了避免代码merge后无法构建发布问题解决方案(GItlabCI + Jenkins)相关的知识,希望对你有一定的参考价值。

1.准备工作

目标: 开发人员提交代码后触发GitlabCI ,如果有merge请求则触发Jenkins对源分支在开发环境构建测试。

 

2.GItlab配置

开启仅允许pipeline成功后才能merge选项

技术分享图片

项目注册runner

技术分享图片

项目添加.gitlab-ci.yaml文件

tags: gitlab-runner 的标签

scripts: 调用runner运行的脚本 这里讲脚本做了软连接为gitlabci   后面两个参数分别是 gitlab项目的id  jenkins项目名称

技术分享图片

 

3.Python脚本

这个脚本需要软连接到/usr/bin/gitlabci,主要采用gitlab库和jenkins完成。

# _*_ coding: utf-8 _*_
import gitlab
import jenkins
import time
import sys
import datetime
import os

#获取分支
def GetBranch(projectId):
    startTime = datetime.datetime.now().minute
    while True:
        project = gl.projects.get(projectId)
        lastMerge = project.mergerequests.list()[0]
        nowTime = datetime.datetime.now().minute
        useTime = nowTime  - startTime
        #print(useTime)
        timeout = 5
        if useTime > timeout :
            #raise Exception("获取分支超时!")
            os.system("echo ‘获取分支超时!‘")
            #print("获取分支超时!")
            return ‘‘

        time.sleep(5)
        mergeStatus = lastMerge.changes()[state].encode(utf-8)

        if mergeStatus == opened:
            sourceBranch = lastMerge.changes()[source_branch].encode(utf-8)
            print("SourceBranch -->>>" + sourceBranch)
            os.system("echo ")
            return sourceBranch
        else:
            #raise Exception("No merge request is opened!")
            os.system("echo ‘No merge request is opened!‘")
            #print(‘No merge request is opened!‘)

#触发构建
def JenkinsBuild(projectName,branchName):
    nextBuildNumber = server.get_job_info(projectName)[nextBuildNumber]
    server.build_job(projectName,{gitlabCI : branchName})
    os.system("echo ‘触发成功!‘")
    print("触发成功!  " + "BuildNumber is " + "-->" + str(nextBuildNumber))

    time.sleep(10)
    startTime = datetime.datetime.now().minute
    while True:
        nowTime = datetime.datetime.now().minute
        useTime = nowTime  - startTime
        if useTime > timeout :
            raise Exception("构建超时!")
            #print("构建超时!")
            #exit()
        buildInfo = server.get_build_info(projectName, nextBuildNumber)
        if buildInfo[building] == True:
            print(projectName + "--> Building")
            time.sleep(30)
        elif buildInfo[building] == False:
            result = buildInfo[result].encode(utf-8)
            if result == SUCCESS:
                os.system("echo ‘构建成功!‘")
                print("构建成功!-->" + result)
                return True
            else:
                raise Exception("触发成功 构建失败!--> 请检查项目参数")
                #print("触发成功 构建失败!--> 请检查项目参数")
                #return False

if __name__ == __main__:
    gitUrl=xxxxx
    gitToken=xxxxx
    jenkinsUrl=http://0.0.0.0:8080
    jenkinsUser=xxxxxx
    jenkinsToken=xxxxxxxx
    timeout=5
    projectId=sys.argv[1]
    projectName=sys.argv[2]
    #run
    gl = gitlab.Gitlab(gitUrl,gitToken)
    branchName = GetBranch(projectId)
    #branchName = ‘v1.11.0_release‘
    if branchName != ‘‘:
        server = jenkins.Jenkins(jenkinsUrl,jenkinsUser,jenkinsToken)
        JenkinsBuild(projectName,branchName)

 

效果

以上是关于避免代码merge后无法构建发布问题解决方案(GItlabCI + Jenkins)的主要内容,如果未能解决你的问题,请参考以下文章

git如何避免代码冲突

使用 T-SQL Merge 语句时如何避免插入重复记录

Git 撤销中间某次的提交记录

如何使 sed 避免特定符号后的替换

在Git的PR(Pull Request)提示冲突无法merge合并的解决方案

svn merge树冲突怎么解决