热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于GitLab+Jenkins的DevOps赋能实践

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

    随着微服务、中台架构的兴起,DevOps也变得非常关键,毕竟是一些基础设施层面的建设,如果搞好了对后面的研发工作会有很大的效率提升。关于DevOps本身的概念,网上已经非常多了,在园子里随便搜索一些都一堆概念,我就不再重复介绍了。下面直接进入正题,怎么使用GitLab+Jenkins来完成DevOps的建设。

    在开始实战演练之前,首先用一张图来展示一下这次实践所要完成的功能:

    #

    在这个流程中,分为3个环境,分别是预览环境、预发环境和生产环境,普通开发者接受到任务以后,在GitLab中基于feature分支进行开发,然后把开发好的需求申请合并到dev分支,在申请合并的过程中,会触发构建流水线进行编译、单元测试、接口测试、发布环境等系列校验,当pipeline完成以后,组长就可以在代码审查后,进行合并到dev分支。这个时候又会触发dev分支的构建流水线,然后再完成一遍上述的流程,把代码发布到预发环境。最后由项目负责人定期把dev合并到master分支,完成生产环境版本发布。

    首先,在GitLab中创建一个测试项目:

#

    这个项目是在lizongshenblogs的group下面的applications子group下的一个项目,代表了这是一个源代码项目。

接下来再为这个项目创建3个流水线配置,主要目的是为了让代码和配置分离:

#

     在3个配置项目中,分别存放了相应的Jenkinsfile,用于Jenkins流水线的构建配置,接下来开始配置Jenkins。首先进行Jenkins的全局配置:在Jenkins的Manage Jenkins - Configure System下面配置Gitlab Connection,如图:

#

 

在这里需要注意,这个connection是需要一个gitlab的访问令牌,可以在gitlab的个人设置 - 访问令牌里面生成,生成完成之后,填入到相应的Credentials里面:

#

 

 最后测试一下,连接是否成功,只要显示success,就可以了。

 

 接下来就可以配置具体pipeline了,首先使用Jenkins的New Item分别创建3个流水线类型的项目:

 #

 

    在Jenkins中新建3个流水线类型的项目,分别叫feature-pipeline、dev-pipeline、master-pipeline,然后对这3个项目分别进行配置,先来看feature-pipeline的配置:

    首先要配置的项是Build Triggers,在其中勾选Opened Merge Request Events,并且把Rebuild open Merge Requests设置成On push to source branch:

#

 

 

 然后点击Advanced按钮,进行高级设置:

#

 

这里需要注意的地方是原分支是任何分支,目标分支是dev分支,然后生成一个Secret token,这个token在配置gitlan webhooks的时候会用到。

接下来是配置Pipeline项:

#

 

 

     这个地方需要配置具体的流水线仓储的地址,在credentials的地方,使用账号密码登录到gitlab即可。

    dev流水线和master流水线配置略有不同,其中dev分支需要配置成accepted merge request events,意思就是当组长接受合并请求的时候触发:

#

 

 

     而master分支需要改变的地方是匹配的分支,表示只接受从dev分支到master分支的合并请求:

#

 

 

     到这里Jenkins的配置已经配置完成,接下来再回到gitlab进行联动配置,首先配置项目的webhoos,在项目的Integrations Settings里面添加一个webhooks:

#

 

 

    其中URL就填写Jenkins的Build Triggers项目自动生成的那个URL,secret token是在Build Triggers的高级选项里面生成的那个token,触发的选项选择Merge request events,表示当合并请求的时候进行触发,点击保存,gitlab和Jenkins的配置基本上就完成了。

    最后看一下3个项目中的Jenkinsfile:

pipeline {
    agent {
        label 'slave-pipeline'
    }
    options {
        gitLabConnection('gitlab')
    }
    stages {
        stage('Prepare'){
            steps{
                script{
                        git branch: '${gitlabSourceBranch}', changelog: false, credentialsId: 'gitlab', poll: false, url: 'https://gitlab.com/lizongshenblogs/applications/devopsdemo.git'
                               
                        script {
                            GIT_COMMIT_ID = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
                            IMAGE_TAG = "${GIT_COMMIT_ID}-snapshot"
                            INGRESS_HOST = "preview-${gitlabSourceRepoName}-${gitlabMergeRequestIid}"
                            MR_URL = "${gitlabSourceRepoHomepage}/merge_requests/${gitlabMergeRequestIid}"
   
                            build_tag = "feature-${gitlabSourceRepoName}-${gitlabSourceBranch}-${GIT_COMMIT_ID}"
                            currentBuild.displayName = "#" + BUILD_NUMBER + "_" + gitlabMergeRequestIid + "_" + build_tag
                        }
                }
            }
       
        }
   
        stage('Build') {
       
            when {
                expression {
                    "${gitlabTargetBranch}" == 'dev'
                }
            }
           
            steps {
                script {
                    updateGitlabCommitStatus name: 'Build', state: 'running'
   
                    try {
                   
                        echo "开始编译..."
                       
                    } catch(Exception ex){
                        updateGitlabCommitStatus name: 'Build', state: 'failed'
                        throw ex;
                    } finally {
   
                    }
   
                    updateGitlabCommitStatus name: 'Build', state: 'success'
   
                }
            }
        }
        stage('Test') {
            steps {
                script {
                    updateGitlabCommitStatus name: 'Test', state: 'running'
   
                    try {
                        echo "开始进行单元测试..."
                    } catch(Exception ex){
                        updateGitlabCommitStatus name: 'Test', state: 'failed'
                        throw ex;
                    } finally {
   
                    }
                   
                    updateGitlabCommitStatus name: 'Test', state: 'success'
                     
                }
            }
        }
        stage('Deploy') {
            steps {
                script {
                    updateGitlabCommitStatus name: 'Deploy', state: 'running'
   
                    try {
                        echo "开始进行发布..."
 
                    } catch(Exception ex){
                        updateGitlabCommitStatus name: 'Deploy', state: 'failed'
                        throw ex;
                    } finally {
   
                    }
                   
                    updateGitlabCommitStatus name: 'Deploy', state: 'success'
                    addGitLabMRComment comment: "App ${gitlabSourceRepoName} preview link: ${gitlabSourceRepoName}"
                }
            }
        }
    }
   
    post {
        failure {
            updateGitlabCommitStatus name: 'Complete', state: 'failed'
        }
        success {
            updateGitlabCommitStatus name: 'Complete', state: 'success'
        }
    }
}

 其中updateGitlabCommitStatus就可以实时地把Jenkins的构建状态发回到gitlab中去:

#

 

    点击这些构建状态,就可以实时地查看到构建日志。在这里gitlab和Jenkins的配置基本上就全部完成了,接下来再看一下gitlab中关于代码管理配置,一般情况下,dev分支和master分支是不允许直接push代码的,只允许从需求分支中合并代码,这就需要在gitlab的       Settings - Repository - Protected Branches中把dev和master保护起来:

#

 

     另外还可以设置只有当流水线成功了以后,才可以进行合并:

#

 

    通过这样一些保护措施,就可以让dev和master分支变得相对稳定。由于篇幅有限,如果有不明白的地方,可以私下找我相互交流。DevOps是一个很广泛的话题,今天讲的GitLab+Jenkins这套流程只是DevOps中的一部分,完全实现DevOps还需要更多的流程配合,以后有机会再为大家分享。


推荐阅读
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • SOA架构理解理解SOA架构,了解ESB概念,明白SOA与微服务的区别和联系,了解SOA与热门技术的结合与应用。1、面向服务的架构SOASOA(ServiceOrien ... [详细]
  • 博客_2018年博客总结
    本文由编程笔记#小编为大家整理,主要介绍了2018年博客总结相关的知识,希望对你有一定的参考价值。前言     ... [详细]
  • Istio是一个用来连接、管理和保护微服务的开放平台。Istio提供一种简单的方式来为已部署的服务建 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • DockerDataCenter系列(四)-离线安装UCP和DTR,Go语言社区,Golang程序员人脉社 ... [详细]
  • Jenkins教程:使用Jenkins进行持续集成
    【注】本文译自:https:www.edureka.coblogjenkins-tutorial本文将重点介绍Jenkins架构和Jenkins构建管道,并向您展示如何在Jenki ... [详细]
  • python项目python完整项目
    广告关闭腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元ÿ ... [详细]
  • docker 多物理机容器_Docker(1) 什么是 Docker
    ​1|0学习Docker前的必备知识1|1环境配置的烦恼软件开发最大的麻烦事之一,就是环境配置相信每位编程初学者都会在环境配置上倒腾很久,而作为老师也会 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有