Jenkins实现CICD流程(jenkins checkout)
wptr33 2024-11-17 02:41 17 浏览
CICD
持续集成(Continuous Integration)、持续交付(Continuous Delivery) 、持续部署(Continuous Deployment)
项目提交到github,然后Jenkins通过github的变化拉取代码进行maven构建,并把构建好的项目Jar包制作成image上传到doker或者阿里云仓库中,k8s集群再从镜像仓库中拉取镜像进行部署运行,整个过程全是自动化的,这个过程就是CICD的过程。
1.环境准备
基础环境准备[在jenkins那台机器上安装]
- 安装java
(1)找到jdk资源上传到指定机器
#上传jdk到服务器的文件夹中
java/jdk-8u181-linux-x64.tar.gz
#解压jdk
tar -zxvf jdk-8u181-linux-x64.tar.gz
(2)配置jkd环境变量
#编辑文件
vim /etc/profile
#添加如下内容
export JAVA_HOME=/usr/local/java/jdk1.8.0_181
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
#使配置文件生效
source /etc/profile
#测试
java -version
- 安装maven
(1)找到maven资源上传到指定机器
#上传mavne到服务器的文件夹中
java/apache-maven-3.6.2-bin.tar.gz
#解压jdk
tar -zxvf apache-maven-3.6.2-bin.tar.gz
(2)配置maven环境变量
#编辑文件
vim /etc/profile
#添加如下内容
export MAVEN_HOME=/usr/local/maven/apache-maven-3.6.2
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
#使配置文件生效
source /etc/profile
#测试
mvn -version
(3)配置maven的阿里云镜像
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
- 安装配置git
(1)下载安装
yum install git
(2)配置git
#全局设置
git config --global user.name "yp1527"
git config --global user.email "abm520@126.com"
#生成公钥并上传到github【公钥路径:/root/.ssh/id_rsa.pub】
ssh-keygen -t rsa -C "abm520@126.com"
安装配置Jenkins
jenkins官网:https://jenkins.io/
入门指南:<https://jenkins.io/zh/doc/pipeline/tour/getting-started/
(1)在对应的文件中上传jenkins war包:java/jenkins.war
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
(2)启动jenkins[记得当前机器安装了jdk/jre,不然运行不了]
#后台运行并暴露8080端口
nohup java -jar jenkins.war --httpPort=8080 &
#查看日志
tail -f nohup.out
(3)win浏览器访问w2的ip 192.168.0.23:8080
#查看密码
cat /root/.jenkins/secrets/initialAdminPassword
(4)安装推荐的插件
(5)创建一个用户
username:yangping
password:yangping
(6)安装配置git,maven【 在jenkins上使用centos的java,git,maven等】 [系统管理]->[全局工具配置]->[Maven、JDK、Git等]
配置好后点击应用并保存。
jenkins配置从github上拉取代码并用maven进行构建
1.新建pipeline任务
在流水线中输入任务执行脚本【从git拉取代码后开始maven构建项目】
然后“保存和立即构建“,同时可以查看“Console Output”
来到w2节点:ls /root/.jenkins/workspace/springboot-demo
至此,我们已经可以通过在jenkins上手动构建的方式,拿到github上的代码,并且用maven进行构建。
git push触发jenkins自动构建
当用户进行git commit/push提交代码到github时,能够通知jenkins自动构建
注意:jenkins的ip一定要是github能够访问到的地址
(1)在github上配置jenkins的webhook地址http://121.40.56.193:8080/springboot-demo
(2)生成Personal access tokens
Jenkins访问github需要授权,所以在github上生成token交给jenkins使用,即 Personal access tokens github的Settings[个人信息右上角]-->Developer settings-->Personal access tokens-->Generate new token,最后保存好该token,比如:72f048b514e95d6fe36f86d84374f2dcce402b43
(3)jenkins安装插件
01 安装github plugin插件:[系统管理]->[插件管理]->[可选插件]
02 安装gitlab插件和gitlab hook插件:[系统管理]->[插件管理]->[可选插件]
(4)配置GitHub Server
[系统管理]->[系统配置]->[找到github服务器]->[添加github服务器]然后按照下面图片步骤进行操作
然后进行测试,最后点击最下面的保存
build镜像并push镜像到仓库
经过前面的步骤,我们已经可以获取到代码,并且用maven进行构建了,最终拿到一个target/xxx.jar。此时我们可以把jar包制作成Image并上传到阿里云仓库。
(1)准备一个文件,名称为springboot-demo-build-image.sh
#新建一个scripts目录
mkdir /root/.jenkins/workspace/scripts/
vi /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
(2)编写springboot-demo-build-image.sh文件
# 进入到springboot-demo目录
cd ../springboot-demo
# 编写Dockerfile文件
cat <<EOF > Dockerfile
FROM openjdk:8-jre-alpine
COPY target/springboot-0.0.1-SNAPSHOT.jar /springboot-demo.jar
ENTRYPOINT ["java","-jar","/springboot-demo.jar"]
EOF
echo "Dockerfile created successfully!"
# 基于指定目录下的Dockerfile构建镜像
docker build -t registry.cn-hangzhou.aliyuncs.com/yp2018/springboot-demo:v1.0 .
# push镜像,这边需要阿里云镜像仓库登录,在w2上登录
docker push registry.cn-hangzhou.aliyuncs.com/yp2018/springboot-demo:v1.0
(4)增加pipeline脚本
node {
def mvnHome
stage('Preparation') {
git 'https://github.com/yp1527/springboot-demo.git'
}
stage('Maven Build') {
sh "mvn clean package"
}
stage('Build Image') {
sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh"
}
}
(5)注意
# 01 文件权限
/root/.jenkins/workspace/springboot-demo@tmp/durable-7dbf7e73/script.sh: line 1: /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh: Permission denied
# 解决
chmod +x /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
# 02 docker没有运行
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
# 解决
systemctl start docker
systemctl enable docker
# 03 push权限
docker login --username=18224401527 registry.cn-hangzhou.aliyuncs.com
Kubernetes拉取镜像运行
经过前面的步骤,现在已经能够把镜像push到镜像仓库了,接下来就是k8s拉取镜像并且运行在集群中。根据前面的经验,肯定再创建一个stage,然后运行sh脚本,脚本中执行内容,包括yaml文件。【因为springboot项目要通过ingress进行外面访问所以要保证ingress-conttroller运行】
(1)编写springboot-demo.yaml文件【 在/root/.jenkins/workspace/scripts/目录下创建springboot-demo.yaml】
# 以Deployment部署Pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-demo
spec:
selector:
matchLabels:
app: springboot-demo
replicas: 1
template:
metadata:
labels:
app: springboot-demo
spec:
containers:
- name: springboot-demo
image: registry.cn-hangzhou.aliyuncs.com/yp2018/springboot-demo:v1.0
ports:
- containerPort: 8080
---
# 创建Pod的Service
apiVersion: v1
kind: Service
metadata:
name: springboot-demo
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: springboot-demo
---
# 创建Ingress,定义访问规则
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: springboot-demo
spec:
rules:
- host: yp.k8s.demo
http:
paths:
- path: /
backend:
serviceName: springboot-demo
servicePort: 80
(2)编写k8s-deploy-springboot-demo.sh文件【vi /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh】
#删除服务
kubectl delete -f /root/.jenkins/workspace/scripts/springboot-demo.yaml
#部署服务
kubectl apply -f /root/.jenkins/workspace/scripts/springboot-demo.yaml
#打印
echo "k8s deploy success!"
(3)编写pipeline脚本
node {
def mvnHome
stage('Preparation') {
git 'https://github.com/yp1527/springboot-demo.git'
}
stage('Maven Build') {
sh "mvn clean package"
}
stage('Build Image') {
sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh"
}
stage('K8S Deploy') {
sh "/root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh"
}
}
注意:在k8s集群中的woerk节点上如果不能执行 kubectl 命令,是因为没有权限,可以把master节点中的.kube目录下的config内容复制到worker节点同样的地方就可以了。
# 给k8s-deploy-springboot-demo.sh执行权限
chmod +x /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh
Push代码到git进行测试,验证Jenkins是否会拉取代码进行maven构建代码,然后根据Jar包进行生成Image并上传到阿里云仓库,最后k8s集群从阿里云仓库拉取进行进行部署运行。
至此一个项目的CICD过程搭建完成。
相关推荐
- Linux高性能服务器设计
-
C10K和C10M计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,DanKegel提出了著名的C10问题:一台服务器上同时...
- 独立游戏开发者常犯的十大错误
-
...
- 学C了一头雾水该咋办?
-
学C了一头雾水该怎么办?最简单的方法就是你再学一遍呗。俗话说熟能生巧,铁杵也能磨成针。但是一味的为学而学,这个好像没什么卵用。为什么学了还是一头雾水,重点就在这,找出为什么会这个样子?1、概念理解不深...
- C++基础语法梳理:inline 内联函数!虚函数可以是内联函数吗?
-
上节我们分析了C++基础语法的const,static以及this指针,那么这节内容我们来看一下inline内联函数吧!inline内联函数...
- C语言实战小游戏:井字棋(三子棋)大战!文内含有源码
-
井字棋是黑白棋的一种。井字棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、三子旗等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时...
- C++语言到底是不是C语言的超集之一
-
C与C++两个关系亲密的编程语言,它们本质上是两中语言,只是C++语言设计时要求尽可能的兼容C语言特性,因此C语言中99%以上的功能都可以使用C++完成。本文探讨那些存在于C语言中的特性,但是在C++...
- 在C++中,如何避免出现Bug?
-
C++中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知,最佳做法是在编译阶段尽早检测错误。让我们来看看现代C++中的一...
- ESL-通过事件控制FreeSWITCH
-
通过事件提供的最底层控制机制,允许我们有效地利用工具箱,适时选择使用其中的单个工具。FreeSWITCH是一个核心交换与混合矩阵,它周围有几十个模块提供各种功能特性。我们完全控制了所有的即时信息,这些...
- 物理老师教你学C++语言(中篇)
-
一、条件语句与实验判断...
- C语言入门指南
-
当然!以下是关于C语言入门编程的基础介绍和入门建议,希望能帮你顺利起步:C语言入门指南...
- C++选择结构,让程序自动进行决策
-
什么是选择结构?正常的程序都是从上至下顺序执行,这就是顺序结构...
- C++特性使用建议
-
1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...
- C++程序员学习Zig指南(中篇)
-
1.复合数据类型结构体与方法的对比C++类:...
- 研一自学C++啃得动吗?
-
研一自学C++啃得动吗?在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C++的资料从专业入门到高级教程」,点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!个人...
- C++关键字介绍
-
下表列出了C++中的常用关键字,这些关键字不能作为变量名或其他标识符名称。1、autoC++11的auto用于表示变量的自动类型推断。即在声明变量的时候,根据变量初始值的类型自动为此变量选择匹配的...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mysql max (33)
- vba instr (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)