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)的更多相关文章

  1. Gitlab源码库里代码提交后,如何触发jenkins自动构建?

    版本库里代码提交后,如何触发jenkins自动构建?这是一个面试题,感觉自己回答的并不好,因为并没有用过这个功能,之前公司实际项目用的是svn版本管理,一般都用立刻构建,和定时任务构建(不管代码是否有 ...

  2. jenkins和svn搭建自动代码构建发布

    jenkins安装和配置 .安装jenkins .yum install java wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins. ...

  3. WebGIS中以version方式实现代码更新后前端自动读取更新代码的方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 前言 GIS代码进行更新后,由于用户前端已有缓存,导致更新的功能不 ...

  4. git merge后如何撤销

    merge后发现冲突太多,或者合并的分支代码并不是最新,那就直接撤销再合并好了. git reset --hard HEAD 用来撤销还没commit 的merge,其实原理就是放弃index和工作区 ...

  5. git merge后,后悔了如何回退

    今天将feature分支的代码merge到develop分支后我后悔了,因为feature分支的功能还没有全部开发完成,我在feature分支上commit是可以的,但是这之后我又把它merge到了d ...

  6. [operator]jenkins+gitlab/Webhook自动构建发布

    开发同事在提交代码到gitlab后,需要使用jenkins对代码进行构建,每次都需要手动操作会很繁琐,如果工程很大,那么也会浪费时间,gitlab的webhook功能,可以在代码提交后自动调用jenk ...

  7. 小伙伴想学Jenkins自动构建发布项目,我:安排上了!!

    写在前面 趁着十一长假,很多小伙伴都在悄悄学习,有些是为了能够顺利通过面试,进入大厂升职加薪.有些则是为了进一步巩固和提高自己的专业技能,希望有朝一日能过成为互联网架构师乃至技术专家.这不,就有小伙伴 ...

  8. jenkins pipeline构建后返回构建结果给gitlab

    jenkins pipeline构建后返回构建结果给gitlab 使用场景 gitlab 合并请求时要求管道任务必须成功,否则无法执行合并操作,又不想使用gitlab ci 工具. 实现方法 1.Ge ...

  9. ITF Demo代码(用VBScript构建的接口测试框架)

    ITF Demo代码(用VBScript构建的接口测试框架) http://blog.csdn.net/testing_is_believing/article/details/20872629

随机推荐

  1. PHP 协程最简洁的讲解

    协程,又称微线程,纤程.英文名Coroutine.协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执 ...

  2. web界面 之 登录 (初稿)

    web登录一般注意以下几点: 1)拥有元素:用户名,密码(密码字符显示与隐藏功能),登录按钮,忘记密码链接(忘记用户名链接),注册链接 2)用户体验: •页面显示,光标默认停在第一个输入框 利用htm ...

  3. ConcurrentDictionary的用法

    private static ConcurrentDictionary<Guid, string> dictDbNames = new ConcurrentDictionary<Gu ...

  4. 关于DAL层使用静态方法,并在WEB层直接调用的问题

    同样的疑惑,记录一下吧: http://bbs.csdn.net/topics/360204198 DAL静不静态看connection等关键资源是否静态 比如下面的代码,就算静态也没事 public ...

  5. openCV 视频分解及合成

    1. 视频分解 import cv2 # ************************** # 分解视频 cap=cv2.VideoCapture('1.mp4')#获取一个视频cap isOpe ...

  6. [Swift] Swift笔记

    开始整理Swift笔记了.打算直接用Playground去写,里面自带的Markup语法和Markdown差不多,显示的效果也不差于博客.而且用Xcode看代码也方便.所以这部分内容不再在博客里记录了 ...

  7. LeetCode题解之Reorder List

    1.题目描述 2.题目分析 首先将链表分为两段,然后将后面的一段反转,再合并两个链表. 3.代码 void reorderList(ListNode* head) { if (head == null ...

  8. The Downside of MySQL Auto-reconnect

    A few days ago I was doing some cleanup on a passive master database using the MySQL client. I didn’ ...

  9. python基础学习22----协程

    协程,又称微线程.英文名Coroutine. 协程最大的优势就是协程极高的执行效率.因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就 ...

  10. Fix_And_Hold 使用及存在问题

    RTKLIB中使用FIXANDHOLD没有对各个卫星的方差进行排序,仅仅是使用了截止高度角.而大软件中进行了排序后,使用30°的截止角作为hold条件. 1.总卫星数与hold卫星数,及ratio,全 ...