Bootstrap

Jenkins+gitlab搭建与使用(三)

文章引导

Jenkins配置自动化发布-Docker
Jenkins集群/并发构建
Jenkins流水线pipeline
Jenkins声明式/脚本式

Jenkins配置自动化发布-Docker

总共有三种方式
1. 文件映射方式(通过docker的目录映射,把容器里面的程序包映射出来,然后通过shell脚本更换程序包后执行docker重启容器命令) 最简单(省空间)
2. 打包为镜像,然后直接运行(适用于云原生环境)
3. 生成新镜像推送到Docker私服(适用于大型云原生环境,Harbor环境)用K8s集群拉取镜像(配合流水线,把打包制作镜像命令全部放在流水线中,然后k8s直接推送镜像,测试环境可以配置k8s提供的CI/CD的curl请求,来实现镜像的切换和镜像的重启)

第一种方式:和最开始的方式差不多,只多了一个重启程序容器的步骤,这里就不过多描述了

第二种方式

1. 在有docker的主机上,创建Dockerfile文件

#指定基础镜像
FROM java:8
#设置工作目录,没有目录会自己创建
workdir /app
#copy不能复制目录上下以外的东西
COPY ./* /app/
#开启容器80端口,但是可以被run时候 -p命令覆盖
EXPOSE 80
#需要在shell环境中运行,那么这样做
ENTRYPOINT ["sh","-c","java -jar /app/ruoyi-admin.jar"]

2. 在Jenkins上配置
构建前先删除,以前的包,服务器改为有docker环境的。
在这里插入图片描述
配置构建操作,进入目标文件夹,停止、删除容器。删除镜像。打包镜像,运行镜像
在这里插入图片描述
开始构建,查看结果
在这里插入图片描述
目标服务器使用docker命令查看是否启动

[root@k8s-node1 ruoyi-master]# docker ps -a | grep ry
fe8f739f2032        ry:v1                  "sh -c 'java -jar /a…"   2 minutes ago       Up 2 minutes                  0.0.0.0:18080->80/tcp   ry

Jenkins集群/并发构建

1. 下载连接Jenkins插件
在这里插入图片描述

2. 先准备另外的两台正常构建的Jenkins,然后在主Jenkins中配置node-Jenkins。
在这里插入图片描述
3. 填写参数
在这里插入图片描述

标签(重要):如果指定用哪一台Jenkins的话,就需要用到标签,再写脚本的时候也会用到此标签。

用法:
Use this node as much as possible意思是:尽可能的使用这台机器(再执行多任务构建的时候,Jenkins会尽力协调构建任务在这台Jenkins上执行)
Only build jobs with label expressions matching this node意思是:匹配到标签后才会用这台机器(指定构建任务在此台Jenkins上执行,用于Jenkins构建的不同环境的Jenkins)

	用法一是包含用法二的,如果Jenkins没有构建环境也不会指派的没有构建环境的Jenkins上

4. 配置代理启动方式(高级可以配置端口等等),其他的不需要配置,然后保存
在这里插入图片描述
添加全局账号
在这里插入图片描述
5. 查看状态(稍等),在循环添加其他的。
在这里插入图片描述
在这里插入图片描述

6. 配置的节点,会在刚才配置的工作目录中生成一个remoting的目录和jar包,jar包已经被启动。
在这里插入图片描述

7. 项目配置并发构建,然后保存
在这里插入图片描述
开始构建(多点几次,发现并发构建,如果不勾选会一个一个的构建和等待构建)
在这里插入图片描述
8. 项目指定构建,配置标签,然后保存
在这里插入图片描述
在指定的节点上构建,因并发数为2,第三个任务的时候就会等待着
在这里插入图片描述

Jenkins流水线pipeline

简介:
流水线既能作为任务的本身,也能作为Jenkinsfile
使用流水线可以让我们的任务从界面(UI)上手动操作,转换为代码化,就像是dockerfile一样,从shell命令到配置文件,更适合大型项目和大型复杂项目,可以让团队其他开发者同时参与进来,同时也可以编辑开发Jenkinswebui不能完成的更复杂的构建逻辑,作为开发者可读性也更好。

常用五个语法:

pipeline: 整条流水线
agent: 指定执行器
stages: 所有阶段
stage:某一阶段,可能多个
steps:阶段内的每一步,可执行命令

示例:

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

解释:
pipeline 所有的pipeline定义在pipeline里 ,常量的定义在此外。
agent表示执行流水线任务的时候指定在哪台节点上执行,any表示所有交给jenkins去自己分配
stages表示具体的操作
stage表示具体的操作中的一步,如拉取代码这一步 stage('拉取代码'),括号里面只是定义一个名字而已
steps就是具体代码/命令操作了

示例一:测试流水线运行流程

1. 安装Pipeline插件,并启用
在这里插入图片描述
2. 建立Pipeline项目
在这里插入图片描述

3. 写一个简单的脚本,然后保存
在这里插入图片描述
Groovy是一门编程语言,运行在JVM虚拟机中的,可以和java完美结合,使得Jenkins的流水线更加强大,写一些复杂的业务逻辑的时候,可以类似与,写一些业务代码一样的(如java代码、写一些if else来实现循环操作)

  1. 开始构建流水线,构建完成,插件流水线步骤和用时
    在这里插入图片描述

如果觉得视图不好看的话,可以使用阶段视图 stage View的插件。
插件名为blue ocean(可视化界面):全新的流水线控制ui,可重复执行某阶段代码插件中心搜索blue ocean安装即可

post
流水线完成后可执行的任务
	always 无论流水线或者阶段的完成状态。
	changed 只有当流水线或者阶段完成状态与之前不同时
	failure 只有当流水线或者阶段状态为"failure”运行
	success 只有当流水线或者阶段状态为"success"运行。
	unstable 只有当流水线或者阶段状态为"unstable"运行。例如:测试失败
	aborted 只有当流水线或者阶段状态为"aborted“运行。例如:手动取消

示例二:构建一个完整的拉取代码、构建、运行的自动化流程
示例结束有语法,供于理解。
创建一个简易的流水线语法模板。

pipeline {
    // agent可以指定执行节点,就是配置label节点标签
    // any参数代表不指定,由enkins分配
    // agent docker 代表在有docker的label节点标签上的节点执行
    agent any
    
    stages {
        stage('拉取代码') {
            steps {
                
             echo '拉取代码成功'
            } 
        }
        stage('执行构建') {
            steps {
                
             echo '执行构建成功'
            }
        }
        stage('发布') {
            steps {
                
                echo '执行发布成功'
            }
        }

    }
}

1. 因拉取Gitlab的流水线语法不会写,那么就需要去找生成器来帮助。在项目里面选择流水线语法。
在这里插入图片描述
2. 选取Git,就可以生成一段拉取Git上的代码示范了
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

生成流水线脚本中的gitlab就是刚才配置账号中的ID。

3. 粘贴到流水线中
在这里插入图片描述
4. 构建,需要配置Maven

因Maven的特殊,首先把Maven使用tools引用进来申明一下,tools中的maven363为配置的maven的Name参数,如第二个图片中。
在这里插入图片描述
Maven所在的位置,然后使用Name框里面的参数
在这里插入图片描述

5. 编写构建命令,使用Maven的mvn命令来构建。

	 // 申明引用maven,mavne363是配置的maven的name,下图是配置maven的参数
    tools {
        
        maven "mavne363"
    }
    
    stages {
        stage('拉取代码') {
            steps {
                git branch: 'main', credentialsId: 'gitlab', url: 'http://10.64.95.111/team1/ruoyi-master.git'
                echo '拉取代码成功'
            } 
        }
        stage('执行构建') {
            steps {
                // 双引号代表执行这一行命令,sh执行命令的时候在工作目录下,就是在此项目的路径下," "
                // 三个双引号代表执行多个命令,如果使用双引号一条一条命令去执行,那么在第一条cd到其他目录的时候
                // 第二条命令不会依赖第一条命令的结果,导致构建时候找pom文件失败。
                // 使用三个双引号会把命令看着整体执行,就不会出现依赖上一条命令失败的结果了
                // 第一个"""表示开始,第二个"""表示结束
                // cd ruoyi-master 表示到需要构建的项目目录,当前目录在默认/root/.jenkins/workspace/下
                // workspace就是工作目录,这个目录下就各个项目文件了。
                // mvn clean package然后执行构建命令。
                // -B 交互式  -f 执行pom文件
                sh """
                
                mvn  -B -f ./pom.xml  clean install
                
                """
                echo '执行构建成功'
            }
        }

6. 配置发布,用到ssh插件,生成语法
在这里插入图片描述
放入语法
在这里插入图片描述
6. 验证
在这里插入图片描述
本示例完整语法:

pipeline {
    agent any
    // 申明引用maven,mavne363是配置的maven的name,下图是配置maven的参数
    tools {
        
        maven "mavne363"
    }
    
    stages {
        stage('拉取代码') {
            steps {
                git branch: 'main', credentialsId: 'gitlab', url: 'http://10.64.95.111/team1/ruoyi-master.git'
                echo '拉取代码成功'
            } 
        }
        stage('执行构建') {
            steps {
                // 双引号代表执行这一行命令,sh执行命令的时候在工作目录下,就是在此项目的路径下," "
                // 三个双引号代表执行多个命令,如果使用双引号一条一条命令去执行,那么在第一条cd到其他目录的时候
                // 第二条命令不会依赖第一条命令的结果,导致构建时候找pom文件失败。
                // 使用三个双引号会把命令看着整体执行,就不会出现依赖上一条命令失败的结果了
                // 第一个"""表示开始,第二个"""表示结束
                // cd ruoyi-master 表示到需要构建的项目目录,当前目录在默认/root/.jenkins/workspace/下
                // workspace就是工作目录,这个目录下就各个项目文件了。
                // mvn clean package然后执行构建命令。
                sh """
                
                mvn  -B -f ./pom.xml  clean install
                
                """
                echo '执行构建成功'
            }
        }
        stage('发布') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'docker', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /root/ruoyi-master
docker  stop ry
docker rm -f ry
docker rmi ry:v1
docker build -t ry:v1 .
docker run -itd --name ry  -p 18080:80 ry:v1''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/ruoyi-master', remoteDirectorySDF: false, removePrefix: 'ruoyi-admin/target/', sourceFiles: '**/ruoyi-admin.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '执行发布成功'
            }
        }

    }
}

Jenkins多分支流水线pipeline

声明式流水线
好处:
1. 更像是在Jenkins web ui中的操作
2. 可读性比较高
3. 可以使用blue ocean自动生成
4. 支持语法检查
坏处:
1.代码逻辑能力比脚本式弱,不能完成特别复杂的任务

脚本式流水线
好处:
1. 更少的代码和弱规范要求
2. 更灵活的自定义代码操作
3.不受约束,可以构建特别复杂的工作流和流水线
坏处:
1. 普遍要求更高的编程水平。 语法检查受限于Groovy语言及环境。
2. 和传统Jenkins模型有很大差异。 与声明式流水线的实现相比, 同一工作流会更复杂

;