GitLab+Jenkins集群+docker CICD集成

前言

最近部门进行CICD架构升级将引入k8s编排docker容器。借此机会梳理下目前应用部署发布方式。当前架构是我刚到公司时基于gitlab+jenkins+docker+nexus搭建。引入K8S后将调整pod yaml生成方式通过kubectl 命令启动。具体文章请参考

基于GitLab+Jenkins集群+K8S+Docker CICD方案实践

功能介绍及实现方式

  • 代码管理工具选择gitlab社区版
  • 搭建nexus 作为maven私服与dockerhub服务器
  • 通过三台物理机搭建jenkins主从集群
  • jenkins 安装各种插件
  • 通过jenkins流水线编写jenkinsfile
  • 编写dockerfile
  • 编写启动脚本
  • 集成应用项目

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAc3lzdGVtdXBfdjE=,size_20,color_FFFFFF,t_70,g_se,x_16

其实在外企比较常见的CICD一般会与jira集成,通过jira跟踪每次build然后进行发布

由于当前部门研发人员不多管理的项目不超过50个这套方案也算够用。

整体使用流程相对简单

  1. 首先开发人员提交merge request, project owner 同意合并分支
  2. 开发人员登陆jenkins 执行build
  3. jenkins 流水线开始执行
  4. 下载执行分支代码,编译,构建镜像,推送镜像
  5. ssh 登陆到具体物理机执行脚本 停容器 删除老镜像,下载新景象,启动容器

以上所有操作通过如下三个文件完成。

 

 Jenkinsfile

由于项目使用maven多module方式管理,jenkinsfile可以参考如下方式

node {
   stage('prepare') {
        checkout([$class: 'GitSCM', branches: [[name: 'origin/****']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '***********', url: 'http://******']]])  
   }
   stage('build') {
        sh "mvn clean install -pl ${project_name} -am -amd -Dmaven.test.skip=true -P ${build_env}"
        pom_path = sh (script: 'echo ${project_name}/pom.xml', returnStdout: true).trim()
        pom = readMavenPom file: pom_path
        app_name = "${pom.artifactId}"
        source_file= "${pom.artifactId}/target/*.jar"
        jar_file="${pom.artifactId}.jar"
        commit_id = sh (script: 'git rev-parse --short HEAD', returnStdout: true).trim()
        echo "commit id: $commit_id"
        docker_img_name = "${dockerHub}:****/${app_name}"
        echo "docker-img-name: ${docker_img_name}"
        sh "docker build --build-arg APP_NAME=${app_name} --build-arg SOURCE_FILE=${source_file} --build-arg JAR_FILE=${jar_file} -t ${docker_img_name}:${commit_id} ."
        sh "docker login -u **** -p **** ${dockerHub}:****"
        sh "docker push ${docker_img_name}:${commit_id}"
        echo "delete images"
        sh "docker rmi `docker images | grep  '${app_name}' | awk '{print \$3}'`"
   }
   stage('deploy'){
        for (ip in ipList.tokenize(',')){
           def remote = [:]
           remote.name = ip
           remote.host = ip
           remote.user = ****
           remote.password = ****
           remote.allowAnyHosts = true
           sshPut remote: remote, from: 'deploy.sh', into: '/'
           sshCommand remote: remote, command: "chmod 777 /deploy.sh"
           sshCommand remote: remote, command: "docker login -u **** -p **** ${dockerHub}:****"
           sshCommand remote: remote, command: "sh /deploy.sh ${docker_img_name}:${commit_id} ${pom.artifactId} ${nacosServer} ${port}"
         }
      }
}

 总结

CICD 集成其实不难,难点是如何规范的使用。后续也会分享升级为k8s后的架构与实现方案

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值