Jenkins部署Docker与Jenkins流水线

news/2024/7/12 2:35:46 标签: jenkins, docker, 运维

Jenkins部署Docker与Jenkins流水线

文章目录

  • Jenkins部署Docker与Jenkins流水线
    • @[toc]
    • 六、Jenkins自动化部署到Docker容器
      • 1. 外挂文件的方式在docker容器中启动
      • 2. 将构建运行放入docker容器中(不构建镜像)
      • 3. 将构建运行放入docker镜像中(采用dockerfile)
    • 七、Jenkins集群/并发构建
      • 1. 创建多主机,拥有构建环境
      • 2. 配置Jenkins节点
      • 3. 配置Jenkins节点
      • 4.配置并发构建/通过标签匹配构建
    • ==**八、流水线 pipeline**==
      • 1. 创建一个简单的pipeline工厂
      • 2. 基本语法
      • 3. 安装Blue Ocean插件
      • 4. 使用pipeline自动打包docker镜像
        • 1. 从git上拉取代码
        • 2. 添加maven构建
        • 3. jar包发布到服务器上
      • 5. 使用JenkinsFile创建多分支job
        • 1. 在BlueOcen中创建流水线
        • 2. 设置Jenkinsfile文件的位置
        • 3. 自动Scan成功
        • 4. 多分支运行
      • 6. 声明式流水线
      • 7. 脚本式流水线
    • 九、Jenkins项目构建选择特定的分支

接上篇

六、Jenkins自动化部署到Docker容器

docker_7">1. 外挂文件的方式在docker容器中启动

  • # 拉取 JDK 11 的Docker镜像
    docker pull openjdk:11
    
    # 移动 宿主机上的jar包
    mv /jenkins/build_jar/first1/jenkins_demo-1.0-SNAPSHOT.jar  /docker/jenkins_jar/
    
    # 启动镜像 需要做端口映射与容器卷映射
    docker run -d -p 8081:8081 --privileged=true --name demo_out -v /docker/jenkins_jar/first:/jar_packet openjdk:11 java -jar /jar_packet/jenkins_demo-1.0-SNAPSHOT.jar
    
    
    -d 后台运行
    -p 将宿主机和容器的8081端口进行映射
    privileged=true 容器内拥有管理员权限
    -v 将宿主机jar包与容器内jar包进行关联映射
    java -jar /jar_packet/jenkins_demo-1.0-SNAPSHOT.jar 启动jar包
    
    # 查看容器是否启动
    docker ps
    
    #访问我们之前的网站可以看到 jar包已经被启动了
    
    
    

docker_36">2. 将构建运行放入docker容器中(不构建镜像)

  • 修改Jenkins构建前设置

    在这里插入图片描述

  • 修改部署后操作

  • 重新构建,已经成功构建在容器中

dockerdockerfile_52">3. 将构建运行放入docker镜像中(采用dockerfile)

  • 1.编写dockerfile,放入项目中,注意不能和依赖的包同级

  • 写好可以尝试使用 docker build it demo .来尝试构建一下

    dockerfile">FROM openjdk:11
    EXPOSE 8081
    
    WORKDIR /docker/jenkins_jar
    
    ADD first /jar_packet/first
    ENTRYPOINT ["java","-jar","/jar_packet/jenkins_demo-1.0-SNAPSHOT.jar"]
    
    
  • 2.修改构建设置

  • 修改Jenkins构建前设置

    在这里插入图片描述

  • 修改构建后设置

    在这里插入图片描述

  • 重新构建,查看docker镜像是否被生成,jar包是否被启动
    在这里插入图片描述

七、Jenkins集群/并发构建

集群化构建可以有效提升构建效率,尤其是团队项目比较多或者子项目比较多的时候,可以并发在多台机器上执行构建。

1. 创建多主机,拥有构建环境

同上

2. 配置Jenkins节点

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. 配置Jenkins节点

将节点连接成功后,同步在节点主机上复制好Jenkins的一些jar包,这些都是不需要手动去操作的,同时还会自动启动一些jar文件。

4.配置并发构建/通过标签匹配构建

八、流水线 pipeline

流水线既能作为任务的本身,也能作为JenkinsFile

使用流水线可以让我们的任务从ui手动操作,转换为代码化,像dockerdockerfile一样,从shell命令到配置文件,更适合大型项目,可以让团队其他开发者同时参与进来,同时也可以编辑开发JenkinsWebUI不能完成的更复杂的构建逻辑,作为开发者可读性也更好。

1. 创建一个简单的pipeline工厂

  • 1.1 创建一个pipeline工程

    在这里插入图片描述

  • 1.2 配置pipeline工程

    在这里插入图片描述

  • 1.3 编写构建脚本

    pipeline { //定义一个流水线脚本
    	agent any //设置一个执行器,如上面配的节点
    
    	stages { //所有工作的开始
    		stage('拉取git代码') { //一项工作的开始,括号里的是该工作的名称
    			steps { //声明式脚本往这里面写
    				echo '拉取完成' //控制台打印
    			}
    		}
    		
    		stage('构建代码') { //一项工作的开始,括号里的是该工作的名称
    			steps { //声明式脚本往这里面写
    				echo '构建完成' //控制台打印
    			}
    		}
    	}
    }
    
    
  • 1.4 运行工程

  • 1.5 查看输出日志

    在这里插入图片描述

    在这里插入图片描述

  • 1.7 可以从指定阶段再来一次

    在这里插入图片描述

2. 基本语法

pipeline 定义一个流水线脚本

agent 指示 Jenkins 为整个流水线分配一个执行器(在 Jenkins 环境中的任何可用代理/节点上)和工作区。

stages 全部的工作都在这里执行

stage 每个工作开始

steps jenkinsfile 声明式脚本往这里面写

echo 写一个简单的字符串到控制台输出。

3. 安装Blue Ocean插件

  • 3.1 安装插件

    在这里插入图片描述

  • 3.2 打开插件,它为我们提供了一套更简单明了的ui界面

    在这里插入图片描述

  • 3.3 功能更加强大

docker_218">4. 使用pipeline自动打包docker镜像

1. 从git上拉取代码

  • 1.1 通过流水线语法生成代码

    在这里插入图片描述

    在这里插入图片描述

  • 加入语法中

    在这里插入图片描述

2. 添加maven构建

  • 2.1 引入maven

    添加

    tools{
     maven "maven-3.8.6"
    }
    后面的名称是你在global tool中配置的maven的name
    
  • 2.2 使用命令打包

    sh "mvn clean package" //sh表示执行一行命令
    
    sh """ 
    		mvn clean package
    
    	 """
    	 //这种是表示多行命令
    	 
    

    因为我们的pom文件不在工作目录下,我们需要cd到子文件夹中

    cd jenkins_demo/

    //所以构建命令为
    sh """ 
    		cd jenkins_demo/
    		mvn clean package
    	 """
    
  • 2.3 启动后,可以看到包已经被构建在文件中
    在这里插入图片描述

3. jar包发布到服务器上

  • 3.1 构建语法

    在这里插入图片描述

    在这里插入图片描述

  • 3.2 将构建的语法放入到脚本中

    pipeline { //定义一个流水线脚本
    	agent any //设置一个执行器,如上面配的节点
    	
    	tools{
    	    maven "maven3"
    	}
    
    	stages { //所有工作的开始
    		stage('拉取git代码') { //一项工作的开始,括号里的是该工作的名称
    			steps { //声明式脚本往这里面写
    			    git credentialsId: 'efca258b-ab2a-48d7-bc23-17e2a69945ba', url: 'https://gitee.com/lv-hao/jenkins_demo.git'
    				echo '拉取完成' //控制台打印
    			}
    		}
    		
    		stage('构建代码') { //一项工作的开始,括号里的是该工作的名称
    			steps { //声明式脚本往这里面写
    			    sh """ 
                	cd jenkins_demo
    	            mvn clean package
                    """
    				echo '构建完成' //控制台打印
    			}
    		}
    
    		stage('清理旧代码') { //一项工作的开始,括号里的是该工作的名称
    			steps { //声明式脚本往这里面写
    			    sshPublisher(publishers: [sshPublisherDesc(configName: 'LinuxServer', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''rm -rf /docker/jenkins_jar/firstPipeline/*
    					rm -f /docker/jenkins_jar/dockerfile
    
    					docker stop demo
    					docker rm -f demo
    					docker rmi -f demo''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    				echo '清理旧代码完成' //控制台打印
    			}
    		}
    
    
    		stage('部署运行') { //一项工作的开始,括号里的是该工作的名称
    			steps { //声明式脚本往这里面写
    			    sshPublisher(publishers: [sshPublisherDesc(configName: 'LinuxServer', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''mkdir -p /docker/jenkins_jar/firistPipeline
    					mv /jenkins/build_jar/firistPipeline/* /docker/jenkins_jar/firistPipeline/''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/firistPipeline', remoteDirectorySDF: false, removePrefix: 'jenkins_demo/target', sourceFiles: '**/jenkins_demo/target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''mv /jenkins/build_jar/dockerfile /docker/jenkins_jar/dockerfile
    					
    					cd /docker/jenkins_jar
    					
    					docker build -t demo .
    					
    					docker run -d -p 8081:8081 --name demo demo''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/', remoteDirectorySDF: false, removePrefix: 'jenkins_demo/docker', sourceFiles: 'jenkins_demo/docker/dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    				echo '部署运行完成' //控制台打印
    			}
    		}
    		
    		
    	}
    }
    
    
  • 3.3 保存运行后,可以看到我们的项目在docker中成功被启动

5. 使用JenkinsFile创建多分支job

主要是为了解决在git上针对不同的分支做不同的构建

1. 在BlueOcen中创建流水线

  • 创建流水线

    在这里插入图片描述

2. 设置Jenkinsfile文件的位置

  • 在这里插入图片描述

3. 自动Scan成功

在这里插入图片描述

4. 多分支运行

  • 这样,Jenkins就为我们按照分支内不同的JenkinsFile去构建了不同的流水线

    在这里插入图片描述

6. 声明式流水线

  • 好处

    • 更像是在Jenkins Web UI中操作
    • 可读性比较高
    • 可以使用Blue Ocean UI自动生成
    • 支持语法检查
  • 坏处

    • 代码逻辑能力比脚本弱,不能完成特别复杂的任务

7. 脚本式流水线

  • 好处
    • 更少的代码和弱规范要求
    • 更灵活的自定义代码操作
    • 不受约束,可以构建特别复杂的工作流和流水线
  • 坏处
    • 读写对编程要求比较高
    • 比声明式流水线代码更加复杂

九、Jenkins项目构建选择特定的分支

  1. 安装Git Parameter

    在这里插入图片描述

  2. 在项目的设置中添加设置

    在这里插入图片描述

    在这里插入图片描述

  3. 此时我们就可以通过选择具体分支来部署了

    在这里插入图片描述

至此,我们已经可以通过Jenkins来实现一些中小型系统的CI/DI了,希望大家都去试试吧。

如果对你有帮助的话,记得点个赞再走哦!🤠

在这里插入图片描述


http://www.niftyadmin.cn/n/203745.html

相关文章

关于大模型实践的一些总结

随着近期ChatGPT的迅速出圈,加速了的大模型时代变革。以Transformer、MOE结构为代表的大模型,传统的单机单卡训练模式肯定不能满足上千亿参数的模型训练,这时候我们就需要解决内存墙和通信墙等一系列问题,在单机多卡或者多机多卡进…

和数软件荣获上海市“专精特新”企业荣誉认定

近日,上海市经济和信息化委员会公示了2022年上海市“专精特新”企业名单。根据《关于组织开展2022年创新型中小企业评价、专精特新中小企业认定和复核工作的通知》(沪经信企〔2022〕776号),经专家评审和综合评估,上海和…

语音识别whisper

Whisper是一个通用的语音识别模型,它使用了大量的多语言和多任务的监督数据来训练,能够在英语语音识别上达到接近人类水平的鲁棒性和准确性1。Whisper还可以进行多语言语音识别、语音翻译和语言识别等任务2。Whisper的架构是一个简单的端到端方法&#x…

LeetCode_367. 有效的完全平方数

题目描述 给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。 完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。不能使用任何内置的库函数,如 sqrt 。 …

Java实现将正整数分解质因数例输入100输出100=2×2×5×5,判断100-200之间有多少素数这两个代码程序

目录 前言 一、实现将正整数分解质因数例输入100输出1002255 1.1运行流程(思想) 1.2代码段 1.3运行截图 二、判断100-200之间有多少素数 1.1运行流程(思想) 1.2代码段 1.3运行截图 前言 1.因多重原因,本博文…

多元时间序列 | GRU门控循环单元多变量时间序列预测(Matlab完整程序)

多元时间序列 | GRU门控循环单元多变量时间序列预测(Matlab完整程序) 目录 多元时间序列 | GRU门控循环单元多变量时间序列预测(Matlab完整程序)预测结果评价指标基本介绍程序设计参考资料预测结果 评价指标 训练集数据的R2为:0.98197 测试集数据的R2为:0.97913 训练集数…

如何使用在线工具将模糊的图片变得清晰

拍摄照片时,由于各种原因,例如光线、手持稳定等问题,照片可能会出现模糊。这通常会使您需要重新拍摄照片,但现在,您可以使用在线工具将模糊的图片变得清晰。以下是一些使用在线工具将模糊的图片变得清晰的方法。 1.使…

SpringBoot 利用 Redis缓存,结合 Aop 与自定义注解实现接口节流

接口的节流是开发过程中为了防止单一微服务模块突然遭受太多并发导致用户服务不流畅而产生的业务需求,就是实现在固定时间内访问同一个接口的次数也固定。 开发过程中通常采用redis去作为缓存去快存快取,对于需求次数较多的数据可以存储在redis内部&…