Jenkins 流水线

采用Jenkins的自由风格构建的项目,适合用于测试和学习,主要问题有:

  1. 构建过程中整体流程是不可见的,无法确认每个流程花费的时间
  2. 出现问题不方便快速的定位
  3. 无法进行版本化管理
  4. 多个任务中有很多步骤需要重复搭建

Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,可以快速的定位问题。并且整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在git中维护的。

创建流水线项目

image.png

定义流水线

image.png

这里有两种类型:

  • pipeline script : 表示直接在jenkins任务中维护脚本,用于初期测试还是比较好的
  • pipeline script from SCM:表示在版本管理工具中去拉取Jenkinsfile文件,然后执行构建,线上已办采用这种

这里我们先选择pipeline script,然后写一个hello world。
image.png

image.png

pipeline语法

// 所有脚本命令包含在pipeline{}中,表示一条流水线
pipeline {  
	// 指定任务在哪个Jenkins节点执行(Jenkins支持分布式)
    agent any
    
    // 配置全局环境,指定变量名=变量值信息
    environment{
    	host = '192.168.11.11'
    }

    // 存放所有任务的合集
    stages {
    	// 单个任务
        stage('任务1') {
        	// 实现任务的具体流程
            steps {
                echo 'do something'
            }
        }
		// 单个任务
        stage('任务2') {
        	// 实现任务的具体流程
            steps {
                echo 'do something'
            }
        }
        // ……
    }
}

在我们刚刚建的任务重,写一个测试例子:

pipeline {
    agent any

    // 存放所有任务的合集
    stages {
        stage('拉取Git代码') {
            steps {
                echo '拉取Git代码'
            }
        }

        stage('Maven构建打包') {
            steps {
                echo 'Maven构建打包'
            }
        }

        stage('制作Docker镜像') {
            steps {
                echo '制作Docker镜像'
            }
        }

        stage('Docker镜像推送Harbor') {
            steps {
                echo 'Docker镜像推送Harbor'
            }
        }

        stage('目标服务器拉取镜像部署服务') {
            steps {
                echo '目标服务器拉取镜像部署服务'
            }
        }
    }
}

image.png

这里我们可以看到每个阶段的耗时、日志等信息。

自动生成命令

点击流水线语法可以生成脚本命令

image.png

git拉取项目代码命令

image.png

image.png

分支名称使用${branch}替换,最后生成脚本如下:

stage('拉取Git代码') {
    steps {
        checkout([$class: 'GitSCM', branches: [[name: '${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee_ssh_key', url: 'git@gitee.com:xiaolyuh/test.git']]])
        echo '拉取Git代码成功'
    }
}

新增shell命令

image.png

新增sshPublisher: Send build artifacts over SSH命令

image.png

image.png

完整的脚本

定义参数:
image.png

image.png

image.png

完整脚本

pipeline {
    agent any

    // 存放所有任务的合集
    stages {
        stage('拉取Git代码') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee_ssh_key', url: 'git@gitee.com:xiaolyuh/test.git']]])
            }
        }

        stage('Maven构建打包') {
            steps {
                sh ' /var/jenkins_home/maven/apache-maven-3.8.8/bin/mvn clean package -DskipTests'
            }
        }

        stage('制作Docker镜像') {
            steps {
                sh '''mv **/target/*.jar docker/app.jar
                    echo "build Image start"
                    docker build -t $JOB_BASE_NAME:$tag docker/
                    echo "build Image success"'''
            }
        }

        stage('Docker镜像推送Harbor') {
            steps {
                sh '''password=ucTv2l1XeBdgO9tkseoyWVLh47sRN9Py
                    echo "$password" | docker login $harbor_url --username \'robot$devops\' --password-stdin
                    docker tag $JOB_BASE_NAME:$tag $harbor_url/$harbor_object/$JOB_BASE_NAME:$tag
                    echo "push Image start"
                    docker push $harbor_url/$harbor_object/$JOB_BASE_NAME:$tag
                    echo "push Image success"'''
            }
        }

        stage('目标服务器拉取镜像部署服务') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'test-server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''harbor_url=$harbor_url
                port=$port
                tag=$tag
                project_name=$JOB_BASE_NAME
                imageName=$harbor_url/$harbor_object/$JOB_BASE_NAME:$tag
                
                containerId=`docker ps -a | grep ${project_name} | awk \'{print $1}\'`
                if [ "$containerId" != "" ] ; then
                    docker stop $containerId
                    docker rm $containerId
                    echo "Delete Container Success $containerId"
                fi
                
                imageId=`docker images | grep ${project_name} | awk \'{print $3}\'`
                
                if [ "$imageId" != "" ] ; then
                    docker rmi -f $imageId
                    echo "Delete Image Success $imageId"
                fi
                
                password=ucTv2l1XeBdgO9tkseoyWVLh47sRN9Py
                echo "$password" | docker login 192.168.232.7:80 --username \'robot$devops\' --password-stdin
                
                docker pull $imageName
                docker run -d -p $port --name $project_name $imageName
                echo "Start Container Success"
                echo $project_name''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'echo 1')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
    }
}

image.png

通过Jenkinsfile实现流水线任务

在代码库中新增Jenkinsfile文件

image.png

在代码库中新增Jenkinsfile文件,文件内容和上面一样,这样的好处是Jenkinsfile可以通过版本管理工具管理,将整个构建流程代码化,方便管理。

使用Pipeline script from SCM流水线

image.png

image.png

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/13108.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ServletConfig和ServletContext 的介绍和代码实现

目录 ServletConfig ServletConfig 基本介绍 ServletConfig 类能干什么 为什么需要 ServletContext 1. 方案 1-DB 2. 方案 2-ServletCntext 代码实战 ServletContext ServletContext 基本介绍 ServletContext 可以做什么 代码实战 代码实战2 ServletConfig Servle…

SpringBoot单元测试断言 assertions

断言 断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。JUnit 5 内置的断言可以分成如下几个类别: 1、简单断言 2、数组断言 通过 …

原来情感可以这样影响用户体验设计

🔥情绪的基本情况 Emotion:即刻的生理反应, Feeling:物理的或者心理上的,是emotion经过思考后的 Mood:持续时间更长,是一种状态,受到很多因素影响(天气、睡眠&#x…

OpenCV算法加速的一些学习总结

一、概述 算法加速在实际软件层面应用来说 大数据和复杂计算的过程中 算法优化,指降低算法计算复杂度,设计新算法快速求解,比如Hungarian匹配算法。或牺牲一些内存,预计算一些重复计算的过程,减少程序层面的复杂度。 …

微软文字转语音不能试用了,分享三个方法给大家!

最近很多小伙伴告诉我,微软文字转语音不能在线试用了,这是因为微软关闭了官方的使用页面,所以现在不能直接使用微软的网页版进行文字转语音了。 那么我们还有没有更好的方法去“白嫖”微软的文字转语音呢? 答案是肯定的&#xf…

MTU 网卡bond 简介

MTU 最大传输单元MTU(Maximum Transmission Unit,MTU),是指网络能够传输的最大数据包大小,以字节为单位。MTU的大小决定了发送端一次能够发送报文的最大字节数。如果MTU超过了接收端所能够承受的最大值,或者…

被裁后找不到工作,本质上是因为原来的能力就配不上高薪,如果技术好,根本不怕被裁,相当于白送n+1!...

被裁员后,能要求公司补缴公积金吗? 一位网友问: 被裁员了,要求公司把历史公积金全部足额缴纳,现在月薪2.3万,但公司每个月只给自己缴纳300元公积金,结果一次补了二十多万,一次性取出…

Linux工具——yum和vim

目录 🍏Linux软件包管理器-yum🍎yum简介🍎rzsz工具🍎注意事项🍎软件包查看🍎如何安装和卸载软件 🍏Linux编辑器-vim🍎vim的基本概念🍎vim的基本操作🍎vim正常…

Linux基础——FTP原理与配置

Linux基础——FTP原理与配置 一、文件传输协议——FTP服务二、ftp配置文件解析三、FTP服务器搭建 一、文件传输协议——FTP服务 FTP是典型的C/S结构的应用层协议,需要由服务器软件、客户端软件两个部分共同实现文件传输功能 FTP 连接模式 FTP服务器默认使用TCP协议…

盖子的c++小课堂——第十七讲:递归

前言 通知一下,以后每周不定期更新,有可能是周六更新,也可能是周日吧,反正会更新的~~还有我新出的专栏《跟着盖子读论语》,记得订阅一下啊跟着盖子学《论语》_我叫盖子的盖鸭的博客-CSDN博客 三元表达式 三元表达式…

中国版ChatGPT来了!快跟我一起申请文心一言吧

随着ChatGPT的快速进化吸引了全球网友的眼球 国内厂商也纷纷推出了相似的产品 其中百度推出的“文心一言”已经正式开始的相关的测试 很多人都在问 文心一言入口在哪? 文心一言邀请码在哪可以领? 文心一言怎么申请内测? 自从文心一言发…

计算机视觉——yolov5回归与跨网格预测、训练技巧(下篇)

yolov5 1. yolov5网络架构与组件1.1 网络可视化工具 netron1.2 不同模型的配置1.3 Focus 模块1.4 CSPNet 跨阶段局部网络1.5 SPP 空间金字塔池化1.6 PANet 路径聚合网络 2. 损失函数2.1 类别预测2.2 边界框回归2.3 回顾IoU2.4 IoU推广——GIoU loss2.5 IoU推广——DIoU loss2.6…

大四的告诫

👂 LOCK OUT - $atori Zoom/KALONO - 单曲 - 网易云音乐 👂 喝了一口星光酒(我只想爱爱爱爱你一万年) - 木小雅 - 单曲 - 网易云音乐 其实不是很希望这篇文章火,不然就更卷了。。 从大一开始,每天10小时…

腾讯云轻量4核8G12M应用服务器带宽、月流量详细性能评测

腾讯云轻量4核8G12M应用服务器带宽,12M公网带宽下载速度峰值可达1536KB/秒,折合1.5M/s,每月2000GB月流量,折合每天66GB,系统盘为180GB SSD盘,地域节点可选上海、广州或北京,4核8G服务器网来详细…

Praat脚本-037 | 批量把标注TextGrid生成韵律文本

目录 引题方案一方案二方案三获取脚本关注版权说明 引题 Praat是一种非常出色、轻便、开源免费的标注工具,它的最主要用途是标注,即对语音信号中的一些特征、信息进行标注,保存为TextGrid文件,这个TextGrid文件实质 上就是一种文…

Harmony OS 开发指南——源码下载和编译

本文介绍了如何下载鸿蒙系统源码,如何一次性配置可以编译三个目标平台(Hi3516,Hi3518和Hi3861)的编译环境,以及如何将源码编译为三个目标平台的二进制文件。 坑点总结: 下载源码基本上没有太多坑&#xf…

Web前端-Vue2.0框架学习

Web前端-Vue框架学习 1. 前端工程化与Webpack1.1 隔行变色的demo实现1.2 webpack的基本使用1.3 webpac插件1.3.1 webpack-dev-server插件1.3.2 html-webpack-plugin 1.4 webpack中的loader(加载器)1.4.1 css-loader1.4.2 less-loader1.4.3 url-loader &a…

Node【Global全局对象】之【URL】

文章目录 🌟前言🌟URL🌟URL组成部分🌟URL 类🌟url.href🌟url.pathname🌟url.port🌟url.protocol🌟url.search🌟url.searchParams🌟url.hash&#…

C语言模拟银行排队叫号(链队)

一.队列 队列是一种具有先进先出(FIFO)特性的线性数据结构,它只允许在队列的两端进行插入和删除操作。队列的一端称为队尾(rear),另一端称为队头(front)。新元素总是插入在队列的队…

C++进阶——二叉搜索树BST

C进阶——二叉搜索树BST 其实应该是二叉树内容的进阶版本: 二叉树在前面C数据结构阶段已经讲过,本节取名二叉树进阶是因为: map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构二叉搜索树的特性了解,有…
最新文章