zoukankan      html  css  js  c++  java
  • 避免代码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)

    效果

  • 相关阅读:
    restframework 使用OrderingFilter实现排序
    restframework 使用django_filters 实现过滤
    Serializer 嵌套使用
    docker 运行scrpyd
    flutter-lol云顶之弈助手app
    微信小程序上传多张图片,后端只保存了最后一张的Bug
    ettercap局域网arp欺骗,轻松窃密
    GoLang邮件发送Demo(继上篇msmtp)
    Mac下命令行发邮件【搭配php(shell_exec...)等脚本语言,轻松发邮件,告别各种依赖库】
    我的第一个RN应用(漂亮的首页和笑话列表)
  • 原文地址:https://www.cnblogs.com/mascot1/p/9963984.html
Copyright © 2011-2022 走看看