前言
最近部门进行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
- 编写启动脚本
- 集成应用项目
其实在外企比较常见的CICD一般会与jira集成,通过jira跟踪每次build然后进行发布
由于当前部门研发人员不多管理的项目不超过50个这套方案也算够用。
整体使用流程相对简单
- 首先开发人员提交merge request, project owner 同意合并分支
- 开发人员登陆jenkins 执行build
- jenkins 流水线开始执行
- 下载执行分支代码,编译,构建镜像,推送镜像
- 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后的架构与实现方案