cicd 01--构建通用的CI流程

2024-05-30 23:48
文章标签 通用 流程 构建 01 ci cicd

本文主要是介绍cicd 01--构建通用的CI流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

cicd 01--构建通用的CI流程

  • 1 介绍
  • 2 CI构建过程
    • 2.1 参数配置说明
    • 2.2 pipeline 脚本
    • 2.3 测试流程
  • 3 注意事项
  • 4 说明

1 介绍

笔者在 docker笔记3–配置jenkins 和 k8s笔记7.3–基于gitlab、jenkins、helm、k8s的CI/CD 中介绍了jenkins的安装和基于helm 的k8s 流程。本文基于上述基础继续分享一个构建和发布镜像的通用jenkins流程,以便于为企业中所有的服务实现镜像发布。

2 CI构建过程

本案例中涉及多种agent,比如普通的slave节点可以访问gitlab仓库,aliyun-build可以用来访问上传镜像,但是不能访问gitlab;因此需要通过多个节点协调操作,在slave节点上拉取镜像,然后拷贝到aliyun-build中,在build机器上build镜像并上传到仓库,最后在slave机器上给repo打一个tag。

本案例中为了实现一个通用的build流程,并没有为不同的镜像配置不同build环境,而是为其封装一个通用的build_docker.sh 脚本,用户按照需要改动即可。

若遇见不同的环境,例如A 镜像需要 java9、B镜像需要 java11 的打包环境,那么可以将其某个机器上build好生成可执行文件,然后在 build_docker.sh 中下载所需文件后再打包;也可以封装一个专用的build code的镜像,先运行该镜像build 可执行文件,然后再继续生成的文件build 处生产环境所需的镜像。

2.1 参数配置说明

  1. 拉取指定gitlab repo 代码
    对应参数:gitlab_repo (sre设置为下拉选项目)
  2. 切换到指定的分支
    对应参数:branch_name (用户自填)
  3. 确定镜像版本号, 格式最好为yyyymmddvx(x为具体数字,例如 20210814v1)
    对应参数:image_version (用户自填)
  4. 确定dockerhub仓库后缀, 格式为命名空间/仓库名称(例如 yourNamespace/xg_nginx)
    对应参数:dockerhub_repo (用户自填)
  5. 通过该分支根目录下的 build_docker.sh 和 Dockerfile 来构建镜像,并将镜像推送到对应的dockerhub中

build_docker.sh 案例
以下为build_docker.sh 案例,每个分支都要参考该方法写一个 build_docker.sh, 并确保执行 bash build_docker.sh dockerhub_repo image_version 后能正常推送到docker仓库

#!/bin/bashdocker_image_name=xg_nginx # 需要将此处的xg_nginx 替换为dockerhub_repo 中的后缀function usage() {
cat <<_EOF
usage:bash build_docker.sh -h|--help|dockerhub_repo image_versionfor example, bash build_docker.sh yourNamespace/xg_nginx 20210816v1
_EOF
}function build_docker() {docker build -t $docker_image_name:$2 .if [ $? -eq 0 ]; thenecho "build_docker $docker_image_name:$2, success"elseecho "build_docker $docker_image_name:$2, failed"exit 1fidocker tag $docker_image_name:$2 registry-vpc.cn-shanghai.aliyuncs.com/$1:$2if [ $? -eq 0 ]; thenecho "tag $docker_image_name:$2, success"elseecho "tag $docker_image_name:$2, failed"exit 1fidocker push registry-vpc.cn-shanghai.aliyuncs.com/$1:$2if [ $? -eq 0 ]; thenecho "push registry-vpc.cn-shanghai.aliyuncs.com/$1:$2, success"elseecho "push registry-vpc.cn-shanghai.aliyuncs.com/$1:$2, failed"exit 1fidocker rmi $docker_image_name:$2docker rmi registry-vpc.cn-shanghai.aliyuncs.com/$1:$2
}case "$1" in-h)usage;;--help)usage;;*)build_docker $1 $2;;
esac

2.2 pipeline 脚本

gitlab_repo = "${params.gitlab_repo}"
def split = gitlab_repo.split("/")
def repo_name = split[1]
branch_name = "${params.branch_name}"
image_version = "${params.image_version}"
dockerhub_repo = "${params.dockerhub_repo}"
repo_url = "git@gitlab.yourCompany.com:${gitlab_repo}.git"println("gitlab_repogitlab_repo branch=${gitlab_repo} ${branch_name}")
println("repo_name=${repo_name}, image_version=${image_version}")
println("dockerhub_repo=${dockerhub_repo}")default_description = "${gitlab_repo} ${branch_name}:${image_version}"
currentBuild.description = "${default_description}"pipeline {agent anyenvironment {repo_name1 = "${repo_name}"}stages {stage('Clean workspace') {agent { node { label 'aliyun-build' } }steps {sh """rm -rf /nas/jenkins/sre_workspace/build_docker_sre/\${repo_name1}_\${branch_name} || true"""}}stage("Clone Repo"){agent { node { label 'slave' } }steps {deleteDir()dir("${repo_name1}_${branch_name}"){git(url: "${repo_url}",credentialsId: '73d3xxxx-xxxx-xxxx-xxxx-xxxxxxxx9274',branch: "${branch_name}")}}}stage('Scp to aliyun-build') {agent { node { label 'slave' } }steps {sh """pwdscp -r \${repo_name1}_\${branch_name} aliyun-build:/nas/jenkins/sre_workspace/build_docker_sre/if [ \$? -ne 0 ]thenecho "Found some error when copy the repo"fi"""}}stage('Build docker images') {agent { node { label 'aliyun-build' } }steps {sh """cd /nas/jenkins/sre_workspace/build_docker_sre/\${repo_name1}_\${branch_name}/if [ ! -f Dockerfile ]thenecho "No available dockerfile in workspace"fiif [ ! -f build_docker.sh ]thenecho "No available build_docker.sh in workspace"fibash build_docker.sh \${dockerhub_repo} \${image_version}pwd ls"""}}stage('Set tag') {agent { node { label 'slave' } }steps {dir("${repo_name1}_${branch_name}"){sh """git tag -m "Build docker image ${image_version} for ${branch_name}/${image_version}" \${branch_name}/\${image_version}git describegit push origin \${branch_name}/\${image_version}"""}}}}post {always {echo 'I have finished'}success {echo "build ${gitlab_repo} ${branch_name}:${image_version}, succeed!"sh """curl -X POST -H "Content-Type: application/json" -d '{"msg_type":"text","content":{"text":"build_docker_sre notify: ${gitlab_repo} ${branch_name}:${image_version}, succeed!"}}' https://open.feishu.cn/open-apis/bot/v2/hook/6caa4463-xxxx-xxxx-xxxx-89ac0e9e39c8"""}failure {echo "build ${gitlab_repo} ${branch_name}:${image_version}, failed!"sh """curl -X POST -H "Content-Type: application/json" -d '{"msg_type":"text","content":{"text":"build_docker_sre notify: ${gitlab_repo} ${branch_name}:${image_version}, failed!"}}' https://open.feishu.cn/open-apis/bot/v2/hook/6caa4463-xxxx-xxxx-xxxx-89ac0e9e39c8"""}}
}

2.3 测试流程

jenkins 执行参数如下:
在这里插入图片描述
执行结果如下:
在这里插入图片描述

3 注意事项

  1. 涉及多个不同节点的时候需要配置不同节点的访问权限,也要配置 jenkins 拉取 gitlab 的权限。

4 说明

软件环境:
jenkins 版本:2.299
参考文档:
jenkins 官方文档

这篇关于cicd 01--构建通用的CI流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1017091

相关文章

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

基于Python构建一个高效词汇表

《基于Python构建一个高效词汇表》在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤,本文将解析一个使用Python实现的n-gram词频统计工具,感兴趣的可以了解下... 目录一、项目背景与目标1.1 技术需求1.2 核心技术栈二、核心代码解析2.1 数据处理函数2.2 数据处理流程

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

使用JavaConfig配置Spring的流程步骤

《使用JavaConfig配置Spring的流程步骤》JavaConfig是Spring框架提供的一种基于Java的配置方式,它通过使用@Configuration注解标记的类来替代传统的XML配置文... 目录一、什么是 JavaConfig?1. 核心注解2. 与 XML 配置的对比二、JavaConf

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件