百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Jenkins实现CICD流程(jenkins checkout)

wptr33 2024-11-17 02:41 14 浏览

使用kubeadm搭建k8s集群

k8s中的NetWork

k8s中的NetWork-ingress实战

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过程搭建完成。

相关推荐

【推荐】一款开源免费、美观实用的后台管理系统模版

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍...

Android架构组件-App架构指南,你还不收藏嘛

本指南适用于那些已经拥有开发Android应用基础知识的开发人员,现在想了解能够开发出更加健壮、优质的应用程序架构。首先需要说明的是:AndroidArchitectureComponents翻...

高德地图经纬度坐标批量拾取(高德地图批量查询经纬度)

使用方法在桌面上新建一个index.txt文件,把下面的代码复制进去保存,再把文件名改成index.html保存,双击运行打开即可...

flutter系列之:UI layout简介(flutter ui设计)

简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。...

Android开发基础入门(一):UI与基础控件

Android基础入门前言:...

iOS的布局体系-流式布局MyFlowLayout

iOS布局体系的概览在我的CSDN博客中的几篇文章分别介绍MyLayout布局体系中的视图从一个方向依次排列的线性布局(MyLinearLayout)、视图层叠且停靠于父布局视图某个位置的框架布局(M...

TDesign企业级开源设计系统越发成熟稳定,支持 Vue3 / 小程序

TDesing发展越来越好了,出了好几套组件库,很成熟稳定了,新项目完全可以考虑使用。...

WinForm实现窗体自适应缩放(winform窗口缩放)

众所周知,...

winform项目——仿QQ即时通讯程序03:搭建登录界面

上两篇文章已经对CIM仿QQ即时通讯项目进行了需求分析和数据库设计。winform项目——仿QQ即时通讯程序01:原理及项目分析...

App自动化测试|原生app元素定位方法

元素定位方法介绍及应用Appium方法定位原生app元素...

61.C# TableLayoutPanel控件(c# tabcontrol)

摘要TableLayoutPanel在网格中排列内容,提供类似于HTML元素的功能。TableLayoutPanel控件允许你将控件放在网格布局中,而无需精确指定每个控件的位置。其单元格...

想要深入学习Android性能优化?看完这篇直接让你一步到位

...

12个python数据处理常用内置函数(python 的内置函数)

在python数据分析中,经常需要对字符串进行各种处理,例如拼接字符串、检索字符串等。下面我将对python中常用的内置字符串操作函数进行介绍。1.计算字符串的长度-len()函数str1='我爱py...

如何用Python程序将几十个PDF文件合并成一个PDF?其实只要这四步

假定你有一个很无聊的任务,需要将几十个PDF文件合并成一个PDF文件。每一个文件都有一个封面作为第一页,但你不希望合并后的文件中重复出现这些封面。即使有许多免费的程序可以合并PDF,很多也只是简单的将...

Python入门知识点总结,Python三大数据类型、数据结构、控制流

Python基础的重要性不言而喻,是每一个入门Python学习者所必备的知识点,作为Python入门,这部分知识点显得很庞杂,内容分支很多,大部分同学在刚刚学习时一头雾水。...