7、Jenkins+Nexus3+Docker+K8s实现CICD

文章目录


提示:本章主要记录各基本环境搭建好后如何配置Jenkins流水线部署微服务到K8s

基本环境配置

主机 操作系统 IP 备注
物理主机 Win11 192.168.6.1 Jenkins、Nexus3、Docker Desktop
虚拟主机1 CentOS7 192.168.6.11 k8s-master
虚拟主机2 CentOS7 192.168.6.12 k8s-worker

前提:

  1. K8s集群已经搭建好
  2. Nexus3搭建好docker私服
  3. 物理主机上安装好DockerDesktop并且能够登录docker私服
  4. 配置k8s的所有节点上的docker能访问docker私服并拉取镜像
  5. win11物理主机安装好了jdk11、maven3.8.4、jenkins2.426.1、Nexus3、DockerDesktop
  6. win11能够无密码远程ssh访问虚拟主机1

一、Jenkins安装必要插件

1、Git、 Gitee
2、Maven Integration
3、Publish Over SSH、SSH server
4、Docker plugin

注:可能还有一些其它插件

二、Jenkins系统配置

  1. 配置jenkins所在物理主机上Git安装位置

  2. 配置jenkins所在物理主机上Maven安装位置

  3. 配置win11物理主机远程访问虚拟主机1(k8s-master)

  4. 配置win11物理主机DockerDesktoop安装路径

  5. 配置win11物理主机jdk安装路径

三、新建流水线

1、选择Pipeline

2、参数化构建,这里配置Git参数

3、用Git拉取Jenkinsfile,用Jenkinsfile来运行流水线脚本

四、在项目工程里添加Jenkinsfile、deploy.yml

Jenkinsfile内容如下:

groovy 复制代码
pipeline {
    agent any
	// 声明全局变量
	environment{
	    nexusUserName='admin'
        nexusPwd='xxx'
        nexusAddr='192.168.6.1:8082'
        nexusRepository='repository'

	}
    
    stages {
        stage('Git拉取代码') {
            steps {
                checkout scmGit(branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee-auth', url: 'https://gitee.com/MonochromeContrast/mytest.git']]) 
				echo 'Git拉取代码 - SUCCESS'
            }
        }
		
		stage('Maven构建项目') {
            steps {
                bat 'D:\\Maven\\bin\\mvn clean package -DskipTests'
				echo 'Maven构建项目 - SUCCESS'
            }
        }
        
        stage('Docker制作镜像') {
            steps {
                bat '''move "target\\*.jar"  "docker\\"
                docker build -t %JOB_NAME%:%tag% .\\docker\\'''
				echo 'Docker制作镜像 - SUCCESS'
            }
        }
        
        stage('推送镜像到Nexus镜像仓库') {
            steps {
                bat '''docker login -u %nexusUserName% -p %nexusPwd% %nexusAddr%
                docker tag %JOB_NAME%:%tag% %nexusAddr%/%nexusRepository%/%JOB_NAME%:%tag%
                docker push %nexusAddr%/%nexusRepository%/%JOB_NAME%:%tag%'''
				echo '推送镜像到Nexus镜像仓库 - SUCCESS'
            }
        }

        stage('将yml文件推送到k8s-master服务器'){
            steps{
                sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s-master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'deploy.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '将yml文件推送到k8s-master服务器 - SUCCESS'
            }
        }

        stage('远程执行k8s部署命令'){
            steps{
                bat 'ssh root@192.168.6.11 kubectl apply -f /k8s/myapp/deploy.yml'
            }
        }
    }
}

deploy.yml文件的内容如下:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: dev
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      imagePullSecrets:
        - name: docker-secret
      containers:
      - name: test
        image: 192.168.6.1:8082/repository/test:v6.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
---

apiVersion: v1
kind: Service
metadata:
  namespace: dev
  labels:
    app: test
  name: test
spec:
  selector:
    app: test
  ports:
  - port: 8081
    targetPort: 8080
  type: NodePort
  
---
 
 apiVersion: networking.k8s.io/v1
 kind: Ingress
 metadata:
   namespace: dev
   name: test
 spec:
   ingressClassName: ingress
   rules:
   - host: felix.test.com
     http:
       paths:
       - path: /
         pathType: Prefix
         backend:
           service:
             name: test
             port:
               number: 8081

五、在项目工程里添加Dockerfile

bash 复制代码
FROM openjdk:11
COPY mytest.jar /usr/local/
WORKDIR /usr/local
CMD java -jar mytest.jar

总结

提示:前面的基础配置跟着做就行,重点要理解Jenkinsfile里写的每一个步骤

主要用Jenkins的片段生成器来生成每一步的脚本:

  1. 生成Git拉取代码的流水线脚本

  2. 用指定目录下的maven执行Maven构建项目命令(因为该操作是在jenkins所在win11系统下进行的,所以这里用的是windows批处理命令。如果是centos系统,这里就得相应选择sh)

  3. Docker制作镜像

  4. 将制作好的镜像推送到Nexus镜像仓库(这里用%%包起来的是引用的环境变量,nexus镜像仓库信息都配置到了Jenkinsfile文件的环境变量里)、
    提示:windows批处理命令里引用变量用%%,shell命令应用变量则是${}

  5. 将deploy.yml文件推送到k8s-master服务器(deploy.yml文件是部署k8s的描述性文件)
    我们之前已经配置好了Jenkins与远程服务器的连接(k8s-master),而且指定了远程服务器文件夹位置:

6.远程访问虚拟主机1(k8s-master),执行部署服务的命令


提示:这里必须满足两个条件:

(1)、win11能无密码远程访问虚拟主机1(k8s-master)

bash 复制代码
 ssh root@192.168.6.11
 // 不需要输入密码就是ok的

(2)、jenkins服务所拥有的账户身份必须能无密码远程访问虚拟主机1(要和在命令行测试的账户一致),否则这里有个坑,流水线会卡在这一步。

相关推荐
默 唁4 小时前
win11系统 Docker Desktop提示Docker Engine stopped解决全过程记录
docker·容器
计算机毕设定制辅导-无忧学长5 小时前
Docker 与持续集成 / 持续部署(CI/CD)的集成(一)
ci/cd·docker·容器
Yuanymoon6 小时前
Docker 修改配置后无法启动问题
运维·docker·容器
[奋斗不止]7 小时前
Jenkins 通过 Execute Shell 执行 shell 脚本 七
jenkins·jenkins shell·jenkins 执行sh
阿猿收手吧!9 小时前
【Docker】Docker中卷的类型、区别及应用
开发语言·docker·容器·eureka
[奋斗不止]10 小时前
Pipeline 获取 Jenkins参数
jenkins·jenkins 参数·pipeline 参数
tingting011910 小时前
jenkins 2.380配置从节点
运维·jenkins
[奋斗不止]10 小时前
Pipeline 定义 Parameter 显示在Jenkins 构建中
jenkins·jenkins 参数·pipeline 自定义参数
青啊青斯10 小时前
Windows搭建CUDA大模型Docker环境
windows·docker·容器
提笔忘字的帝国11 小时前
Centos 7安装docker
linux·docker·centos