GitLab+Jenkins集群+docker CICD集成 – 源码巴士

您所在的位置:网站首页 gitlab集群部署搭建 GitLab+Jenkins集群+docker CICD集成 – 源码巴士

GitLab+Jenkins集群+docker CICD集成 – 源码巴士

2023-03-20 02:20| 来源: 网络整理| 查看: 265

前言

最近部门进行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个这套方案也算够用。

整体使用流程相对简单

首先开发人员提交merge request, project owner 同意合并分支开发人员登陆jenkins 执行buildjenkins 流水线开始执行下载执行分支代码,编译,构建镜像,推送镜像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后的架构与实现方案



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3