devops-5:从0开始构建一条完成的CI CD流水线
从0开始构建一条完成的CI CD流水线
tools {
maven 'apache-maven-3.8.6'
}
docker pull jenkins/agent:latest
maven工具包的准备
wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
- central:中央仓库,是由Maven社区提供的资源仓库,它包含了大量的常用程序库组件(jar包)。默认Maven的中央仓库地址为:http://repo1.maven.org/maven2/
- local:本地仓库,是存放maven环境本地的一个文件夹,此文件夹在第一次运行Maven命令时就创建了。Maven在执行构建任务时,根据依赖关系从中心仓库、或远程仓库下载依赖组件到本地仓库,然后本地仓库的内容供项目引用。
- remote:远程仓库,例如项目需要指定外部其他公司、或开源组织的jar包,这些依赖组件通用性等原因,未纳入Maven中央仓库,这个时候就要手动指定一个私有的远程仓库来拉取依赖。

<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<repositories>
<repository>
<id>springsource-repos</id>
<name>SpringSource Repository</name>
<url>http://repo.spring.io/release/</url>
</repository>
</repositories>

mvn clean install -Dmaven.repo.local=/home/maven/local_repo/
mvn clean install -s /home/maven/settings.xml
[root@node01 agent-jenkins]# ls
apache-maven-3.8.6.tar.gz Dockerfile jenkins-agent kubectl.tar.gz
[root@node01 agent-jenkins]# cat Dockerfile
FROM jenkins/agent:latest USER root ADD apache-maven-3.8.6.tar.gz /opt/
ADD kubectl.tar.gz /usr/local/bin/
ENV PATH $PATH:/opt/apache-maven-3.8.6/bin/
COPY jenkins-agent /usr/local/bin/
CMD ["/bin/sh","-c","/usr/local/bin/jenkins-agent"]
# docker build -t registry.example.com:5000/jenkins/agent:v1 .
# docker push registry.example.com:5000/jenkins/agent:v1
apiVersion: "v1"
kind: "Pod"
metadata:
name: jenkins-agent
namespace: "default"
spec:
containers:
- env:
- name: "MAVEN_HOME"
value: "/opt/apache-maven-3.8.6/"
image: "registry.example.com:5000/jenkins/agent:v1"
imagePullPolicy: "IfNotPresent"
name: "jnlp"
resources:
limits:
memory: "2G"
cpu: "1500m"
requests:
memory: "1G"
cpu: "100m"
volumeMounts:
- mountPath: "/root/.m2"
name: "m2"
readOnly: false
- mountPath: "/home/jenkins/agent"
name: "workspace-volume"
readOnly: false
- mountPath: "/usr/bin/docker"
name: "docker-client"
readOnly: true
- mountPath: "/var/run/docker.sock"
name: "docker-engine"
readOnly: true
volumes:
- hostPath:
path: "/root/.m2"
type: "DirectoryOrCreate"
name: "m2"
- hostPath:
path: "/home/jenkins"
name: "workspace-volume"
- hostPath:
path: "/usr/bin/docker"
type: File
name: "docker-client"
- hostPath:
path: "/var/run/docker.sock"
type: Socket
name: "docker-engine"
- m2:这个是用作maven的本地仓库路径,使用hostpath挂载到了本地目录,当然也可以存储到某些共享存储中,目的就是让依赖包只下载一次。
- workspace-volume:这个是将jenkins的工作目录也使用hostpath挂载。
- docker-client:docker命令的挂载,用于build、push等命令
- docker-engine:docker engine的挂载,用于build、push等



- Git
- Git Parameter
- DingTalk
- build user vars plugin
pipeline {
agent {
kubernetes {
cloud 'kubernetes-internal' //指定cloud name
inheritFrom 'jenkins-agent' //指定podTemplate,新版本已经不再用label指定
namespace 'default'
}
}
environment {
GIT_CERT = credentials('vfan-gitlab') //gitlab用户凭证
HARBOR_HOST = 'registry.example.com:5000'
SERVER_NAME = 'simple-java-maven-app'
}
/* tools {
maven 'apache-maven-3.8.6' 镜像有maven环境了,可以不指定
} */
options {
buildDiscarder(logRotator(numToKeepStr: '10')) //保持历史构建的最大个数
timeout(20) //默认单位分钟,20分钟
timestamps() //Pipeline开始时间以及每个step执行开始时间
}
parameters {
choice(
name: 'GIT_REPO_URL',
choices: 'http://10.85.122.128:880/vfan/simple-java-maven-app.git',
description: 'Git Repo example environment'
)
choice(
name: 'GIT_TYPE',
choices: ['branch', 'tag'],
description: 'Git Repo example brance'
)
choice(
name: 'GIT_REPO_BRANCE',
choices: ['master', 'dev', 'test'],
description: 'Git Repo example brance'
)
gitParameter name: 'GIT_TAG',
type: 'PT_TAG',
branch: 'master',
branchFilter: '.*',
defaultValue: '',
selectedValue: 'TOP',
sortMode: 'DESCENDING_SMART',
listSize: '1',
description: 'Select you git tag.'
choice(
name: 'ENVIRONMENT',
choices: ['INT', 'DEV', 'PROD'],
description: 'Select deployment environment'
)
}
stages {
stage('git clone branch') {
when {
expression { params.GIT_TYPE == "branch" }
}
steps {
git(
branch: params.GIT_REPO_BRANCE,
credentialsId: env.GIT_CERT,
url: params.GIT_REPO_URL
)
}
post {
success {
sh '''
echo "use branch build"
git status
'''
}
}
}
stage('git clone tag') {
when {
expression { params.GIT_TYPE == "tag" }
}
steps {
checkout([$class: 'GitSCM',
branches: [[name: "${GIT_TAG}"]],
userRemoteConfigs: [[credentialsId: env.GIT_CERT, url: params.GIT_REPO_URL]]])
}
post {
success {
sh '''
echo "use tag build"
git status
'''
}
}
}
stage('Maven Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Deliver') {
steps {
sh './jenkins/scripts/deliver.sh'
}
}
stage('Docker build && push') {
steps {
withCredentials([usernamePassword(credentialsId: 'harbor-auth', passwordVariable: 'HARBOR_PASSWD', usernameVariable: 'HARBOR_USER')]) {
sh '''
echo "Other operations..."
echo "Start building..."
date -d "+8 hour" +%Y%m%d_%H%M%S > /tmp/date
BUILD_TIME=`cat /tmp/date`
docker build --build-arg APP_NAME=simple-java-maven-app -t ${HARBOR_HOST}/${SERVER_NAME}:${GIT_REPO_BRANCE}_${BUILD_TIME} .
echo "Build complete."
docker login $HARBOR_HOST -u $HARBOR_USER -p $HARBOR_PASSWD
docker push ${HARBOR_HOST}/${SERVER_NAME}:${GIT_REPO_BRANCE}_${BUILD_TIME}
docker rmi ${HARBOR_HOST}/${SERVER_NAME}:${GIT_REPO_BRANCE}_${BUILD_TIME}
'''
}
}
}
stage('Deploy to k8s'){
input{
message "Should we continue deploy?"
ok "Yes, we should."
}
environment {
// 提前创建好secret file类型的凭据
KUBE_CONFIG_INT = credentials('mycluster_int')
// KUBE_CONFIG_DEV = credentials('mycluster_dev')
// KUBE_CONFIG_PROD = credentials('mycluster_prod')
}
steps{
sh'''
BUILD_TIME=`cat /tmp/date`
case $ENVIRONMENT in
"INT")
kubectl set image deployment ${SERVER_NAME} --kubeconfig=${KUBE_CONFIG_INT} app=${HARBOR_HOST}/${SERVER_NAME}:${GIT_REPO_BRANCE}_${BUILD_TIME}
kubectl rollout status deployment ${SERVER_NAME} --kubeconfig=${KUBE_CONFIG_INT}
;;
"DEV")
kubectl set image deployment ${SERVER_NAME} --kubeconfig=${KUBE_CONFIG_DEV} app=${HARBOR_HOST}/${SERVER_NAME}:${GIT_REPO_BRANCE}_${BUILD_TIME}
kubectl rollout status deployment ${SERVER_NAME} --kubeconfig=${KUBE_CONFIG_DEV}
;;
esac
echo "Deployment complete."
'''
}
}
}
post {
success{
echo 'Deployment succeeded.'
dingtalk (
robot: 'myapp-dingding-robot',
type: 'MARKDOWN', // 发什么类型的消息,有TEXT、LINK、MARKDOWN、和ACTION_CARD,参考https://jenkinsci.github.io/dingtalk-plugin/guide/pipeline.html
at: [],
atAll: false,
title: 'Jenkins发版成功',
text: [
"## 构建结果:**${currentBuild.result}**",
'---',
"## 构建信息",
'---',
"- 项目名称:${SERVER_NAME}",
"- 构建环境:${ENVIRONMENT}",
"- 构建分支:${GIT_REPO_BRANCE}",
"- 构建标签:${GIT_TAG}",
"- 项目地址:${GIT_REPO_URL}",
"- 构建用户:${env.BUILD_USER}"
],
// messageUrl: '',
// picUrl: '',
// singleTitle: '',
// btns: [],
// btnLayout: '',
// hideAvatar: false
)
}
failure{
echo "Deployment failed."
dingtalk (
robot: 'myapp-dingding-robot',
type: 'MARKDOWN', // 发什么类型的消息,有TEXT、LINK、MARKDOWN、和ACTION_CARD,参考https://jenkinsci.github.io/dingtalk-plugin/guide/pipeline.html
at: [],
atAll: false,
title: 'Jenkins发版失败',
text: [
"## 构建结果:**${currentBuild.result}**",
'---',
"## 构建信息",
'---',
"- 项目名称:${SERVER_NAME}",
"- 构建环境:${ENVIRONMENT}",
"- 构建分支:${GIT_REPO_BRANCE}",
"- 构建标签:${GIT_TAG}",
"- 项目地址:${GIT_REPO_URL}",
"- 构建用户:${env.BUILD_USER}"
],
// messageUrl: '',
// picUrl: '',
// singleTitle: '',
// btns: [],
// btnLayout: '',
// hideAvatar: false
)
}
}
}

devops-5:从0开始构建一条完成的CI CD流水线的更多相关文章
- 【软件工程】《构建之法》 & Git+ & CI/CD
<构建之法> & Git+ & CI/CD 个人阅读作业#2 项目 内容 本作业所属课程 2020春季软件工程(罗杰 任健) 本作业要求 个人阅读作业#2 我的课程目标 具 ...
- .Net Core DevOps -免费用Azure四步实现自动化发布(CI/CD)
前言 linux 大行其道的今天想必大家都已经拥抱 core 了吧,通常的方案都是 gitlab+jenkins+centos,但是这样的方案不适合我这种懒人,一直在寻求简单的解决方案,在寻求方案的过 ...
- 基于Kubernetes构建企业Jenkins master/slave CI/CD平台
搭建平台目的: k8s中搭建jenkins master/slave架构,解决单jenkins执行效率低,资源不足等问题(jenkins master 调度任务到 slave上,并发执行任务,提升任务 ...
- 通读《构建之法》与CI/CD工具尝试
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 作业要求 我在这个课程的目标是 积累软件开发经验,提高工程能力 这个作业在哪个具体方面帮助我实现目标 通读课 ...
- Jenkins自动化CI CD流水线之3--参数化构建
一. 背景 如果只是简单的构建,jenkins自己默认的插件可以做,但是如果我们想要在构建过程中有更多功能,比如说:选择性构建.传参.项目指定变量等等其他功能,基础的参数化构建可以实现一些简单功能,但 ...
- DevOps on DevCloud|如何采用流水线践行CI/CD理念【华为云技术分享】
[摘要] 持续集成/持续交付(CI/CD,Continuous Integration/Continuous Deployment)在DevOps CMALS理念中具有支柱性地位,因而CI/CD流水线 ...
- 从0到1了解 CI/CD
现代软件开发的需求加上部署到不同基础设施的复杂性使得创建应用程序成为一个繁琐的过程.当应用程序出现规模性增长,开发团队人员变得更分散时,快速且不断地生产和发布软件的流程将会变得更加困难.为了解决这些问 ...
- 用 GitHub Action 构建一套 CI/CD 系统
缘起 Nebula Graph 最早的自动化测试是使用搭建在 Azure 上的 Jenkins,配合着 GitHub 的 Webhook 实现的,在用户提交 Pull Request 时,加个 r ...
- 【Devops】【docker】【CI/CD】关于jenkins构建成功后一步,执行的shell命令详解+jenkins容器运行宿主机shell命令的实现方法
1.展示这段shell命令 +详解 #================================================================================= ...
- Xamarin XAML语言教程构建进度条ProgressBar
Xamarin XAML语言教程构建进度条ProgressBar Xamarin XAML语言教程构建进度条ProgressBar,ProgressBar被称为进度条,它类似于没有滑块的滑块控件.进度 ...
随机推荐
- ROM,RAM,内存
ROM是用来存放最基本的程序的,不是系统程序(windows),而是主板自带的最基本的程序, 无法被删除,更改.只能读取. 操作系统是放在硬盘里的,在开机时会在内存中加载,所以windows7比win ...
- Crypto入门 (七) Railfence (栏栅密码,正常型和W型)
前言: Crypto中分三类,分别是编码.古典密码.现代密码,栏栅密码属于古典密码中得特殊移位密码,密钥只有 一个k,表示栏栅得长度.所谓栏栅密码就是将要加密得明文分成k个一组,然后取每组得第一个字符 ...
- CentOS查看已安装的服务与卸载服务。。
1:使用rpm查看, rmp -qa | grep servername rpm -qa 查看以安装的所有服务,grep过滤我们需要看的服务. 2:使用yum查看<此命令恕在下未能完全理解,可能 ...
- vue再请求头加token
Vue:全局拦截所有请求,并在请求头中添加token - 道祖且长 - 博客园 (cnblogs.com) util.js export function sessionSet(user){ let ...
- Linux调用python文件的同时传参
创建python文件内容如下: 计算两个数相加并打印,需要传递两个参数 vi sum.py import sys def calc(a,b): c=a+b return c a1=int(float( ...
- 中文数据导入到hive,出现乱码
中文数据导入到hive,出现乱码 解决方法: 右键要导入的数据文件,选择用Notepad++打开,然后点击"编辑"-->转为UTF-8,最后保存即可. 然后在上传到指定路径下 ...
- jenkins freestyle deploy web
gitlab connection 选择定义好的gitlab仓库 参数化构建过程 git参数 名称 branch 描述 自定义 参数类型 分支 默认值 $branch 选项参数 名称 Status 选 ...
- Goravel ORM 新增模型关联,用 Golang 写关联也可以跟 Laravel 一样简单
关于 Goravel Goravel 是一个功能完备.具有良好扩展能力的 Web 应用程序框架.作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用.框架风格与 Laravel 保持一致,让 ...
- 车企-TSP系统通用架构设计
最近一年用于参与到了新能源车企的管理系统的开发,并且主要从事架构设计与重难点功能开发的工作,因此有了一些小心得,特此记录(PS:整体和甲方在需求上扯皮,以及协调所有供应商这些项目管理上的事情比做开发耗 ...
- 一文了解清楚kafka消息丢失问题和解决方案
前言 今天分享一下kafka的消息丢失问题,kafka的消息丢失是一个很值得关注的问题,根据消息的重要性,消息丢失的严重性也会进行放大,如何从最大程度上保证消息不丢失,要从生产者,消费者,broker ...