Jenkins使用git和maven编写流水线

news2024/10/2 22:30:01

1、写git流水线

初识流水线。从git上拉取代码到虚拟机。

【第一步:创建一个新的流水线】

【第二步:定义名字】

点击下方ok!

【第三步:添加代码描述】

【第四步:编写流水线代码,如果忘记了,参照第五步】

【第五步:自动生成流水线代码--写入第四步中】

#上面的操作生成出来的代码:
node {
    git branch: 'develop', credentialsId: '9a19cd80-bb02-4e8b-b126-f023bdebea7b', url: 'https://gitee.com/wztsl/dz12-demo01.git'
}

【第六步:保存流水线代码】

【第七步:测试流水线代码是否有错】

【第八步:查看代码】

2、写maven流水线

目的:拉取最新代码,将代码打包好,做成镜像,上传到docker中,然后启动容器,外部可以访问。

  • 通过git拉取代码

  • 用Dockerfile检查是否存在容器和镜像,如果存在则删除

  • 编译,打包

  • 创建docker镜像

  • 启动docker容器

    第一段流水线:git拉取代码

【一步一步测试流水线代码:】

node {
    stage('pull code'){
       git credentialsId: '8bea9def-ba4d-433c-a4b3-14c26be75f1b', url: 'https://gitee.com/mayang3366/jenkins-demo1.git'
    }
}

【然后一步一步run测试结果:】

2.第二段流水线:将下载的项目进行打包

node {
    stage('compile'){
#jenkinsDemo1的名字一定要是虚拟机里 /var/lib/jenkins/workspace 路径下存在的。该流水线的目的在于打包该项目。
        dir('/var/lib/jenkins/workspace/jenkinsDemo1'){   
            sh 'mvn clean install'
        }
    }
}

3.第三段流水线:将打包后的项目做成docker镜像

【以上操作,完成第二段流水线就可以实现】

【注意:停掉服务后,删除掉workspace目录下的该项目,希望通过流水线来实现效果。】

【流水线代码如下:】

checkout=0
node {
    stage('pull code'){
       git credentialsId: '8bea9def-ba4d-433c-a4b3-14c26be75f1b', url: 'https://gitee.com/mayang3366/jenkins-demo1.git'
    }
    stage('compile'){
        dir('/var/lib/jenkins/workspace/jenkinsDemo1'){   
            sh 'mvn clean install'
        }
    }
    stage('make docker container'){
        dir('/var/lib/jenkins/workspace/jenkinsDemo1/target'){
            sh "echo FROM openjdk:8 > Dockerfile"
            sh "echo ADD testNginx-1.0-SNAPSHOT.jar /app.jar >> Dockerfile"
            sh "echo RUN bash -c '\"'touch /app.jar'\"' >> Dockerfile"
            sh "echo ENTRYPOINT ['\"'java'\"','\"'-jar'\"','\"'/app.jar'\"'] >> Dockerfile"
            sh "echo  RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime >> Dockerfile"
            sh "docker build -t jenkinsdemo1 ."    
        }
    }
}
## 注意注意:docker build -t jenkinsdemo1 . 命令中的镜像名不能有大写字母。

 

#创建容器并运行,d1是容器名,
docker run --name d1 -p 8888:8888 -d jenkinsdemo1

4.第四段流水线:通过镜像创建容器并启动

checkout=0
node {
    stage('pull code'){
       git credentialsId: '8bea9def-ba4d-433c-a4b3-14c26be75f1b', url: 'https://gitee.com/mayang3366/jenkins-demo1.git'
    }
    stage('check docker container'){
        if(fileExists('/var/lib/jenkins/workspace/jenkinsDemo1/target/Dockerfile')){
            sh 'docker stop d1'
            sh 'docker rm d1'
            sh 'docker rmi jenkinsdemo1'
        }
    }
    stage('compile'){
        dir('/var/lib/jenkins/workspace/jenkinsDemo1'){   
            sh 'mvn clean install'
        }
    }
    stage('make docker container'){
        dir('/var/lib/jenkins/workspace/jenkinsDemo1/target'){
            sh "echo FROM openjdk:8 > Dockerfile"
            sh "echo ADD testNginx-1.0-SNAPSHOT.jar /app.jar >> Dockerfile"
            sh "echo RUN bash -c '\"'touch /app.jar'\"' >> Dockerfile"
            sh "echo ENTRYPOINT ['\"'java'\"','\"'-jar'\"','\"'/app.jar'\"'] >> Dockerfile"
            sh "echo  RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime >> Dockerfile"
            sh "docker build -t jenkinsdemo1 ."    
        }
    }
    stage('start'){
        sh 'docker run --name d1 -p 8888:8888 -d jenkinsdemo1'
    }
}

注意:/var/lib/jenkins/workspace/jenkinsDemo1    “jenkinsDemo1”是项目名,可以有大写字母
     docker rmi jenkinsdemo1   jenkinsdemo1 是镜像名,不可以有大写字母

node:节点,Jenkins支持分布式,可以给节点命名,master是主节点,不要修改。

stage:声明步骤

fileExists:判断文件是否存在

dir:进入某个目录

5.第五段流水线:删除已存在的容器和镜像

checkout是用于判断是否存在镜像和容器的标识,上面的流水线中并未操作它,不声明也不会报错。但是,如果在mvn install时报错,会导致流水线不继续运行,就不会生成Dockerfile文件,那么再次执行流水线时,还是会因为已经有了d1这个容器而启动报错。

研究用什么办法解决这个问题?

1.手动操作解决方式

2.流水线代码解决方式

checkout=0
node {
    stage('pull code'){
       git credentialsId: '8bea9def-ba4d-433c-a4b3-14c26be75f1b', url: 'https://gitee.com/mayang3366/jenkins-demo1.git'
    }
    stage('check docker container'){
       script{
          checkout=sh(
                script: 'docker ps | grep d1',
                returnStatus: true
          )
      }    
    }
    stage('compile'){
        dir('/var/lib/jenkins/workspace/jenkinsDemo1'){   
            sh 'mvn clean install'
        }
    }

    stage('remove docker container'){
        if(checkout==0){
            sh 'docker stop d1'
            sh 'docker rm d1'
            sh 'docker rmi jenkinsdemo1'
        }
    }

    stage('make docker container'){
        dir('/var/lib/jenkins/workspace/jenkinsDemo1/target'){
            sh "echo FROM openjdk:8 > Dockerfile"
            sh "echo ADD testNginx-1.0-SNAPSHOT.jar /app.jar >> Dockerfile"
            sh "echo RUN bash -c '\"'touch /app.jar'\"' >> Dockerfile"
            sh "echo ENTRYPOINT ['\"'java'\"','\"'-jar'\"','\"'/app.jar'\"'] >> Dockerfile"
            sh "echo  RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime >> Dockerfile"
            sh "docker build -t jenkinsdemo1 ."    
        }
    }
    stage('start'){
        sh 'docker run --name d1 -p 8888:8888 -d jenkinsdemo1'
    }
}

说明:

git拉起代码:第一步

打包代码:第三步

把打包后的代码做成镜像:第五步

通过镜像创建容器并运行:第六步

检查是否有容器和镜像存在:第二步

删除已存在的容器和镜像:第四步

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端框架对比与选择

🤖 作者简介:水煮白菜王 ,一位资深前端劝退师 👻 👀 文章专栏: 前端专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧✍。 感谢支持💕💕💕 目…

功能测试详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、测试项目启动与研读需求文档 (一) 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产品中所…

HarmonyOS鸿蒙开发实战(5.0)自定义路由栈管理

鸿蒙HarmonyOS NEXT开发实战往期文章必看(持续更新......) HarmonyOS NEXT应用开发性能实践总结 HarmonyOS NEXT应用开发案例实践总结合集 最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门…

中伟视界:AI算法如何精准识别井下与传送带上堆料,提升矿山安全生产效率,减少事故风险

传送带堆料分为两种情况,一种是传送带的井下堆料检测AI算法,一种是传送带上面的堆料检测AI算法,传送带井下堆料检测AI算法是在带式输送机的漏煤下方井下安装摄像仪,通过视频分析检测井下堆煤情况,当洒煤堆积到一定程度…

31214324

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

T-Mobile AI客户服务:客户体验的新时代

目录 IntentCX的诞生利用AI的力量多方面的合作Nvidia的贡献客户服务的范式转变超越客户服务电信中AI的未来 T-Mobile宣布与著名的人工智能研究实验室OpenAI建立战略合作伙伴关系,这一开创性的举动旨在通过利用AI的力量来彻底改变公司的客户服务运营。 IntentCX的…

《解锁高效流程设计:深度剖析责任链模式与实战应用》

《解锁高效流程设计:深度剖析责任链模式与实战应用》 责任链模式 是一种行为设计模式,它允许多个对象来处理请求,而不预先指定具体的处理者。多个处理对象被连接成一条链,沿着这条链传递请求,直到某个处理对象决定处理…

【前端 25】

Ant Design框架使用教程:构建高效美观的React应用 引言 Ant Design 是一套企业级的 UI 设计语言和 React 组件库,主要用于开发和服务于企业级后台产品。它基于 React,并遵循 Ant Design 设计规范,提供了大量高质量、易用的 React…

Spring Boot集成Milvus快速入门demo

1.什么是Milvus? Milvus 是一种高性能、高扩展性的向量数据库,可在从笔记本电脑到大型分布式系统等各种环境中高效运行。它既可以开源软件的形式提供,也可以云服务的形式提供。 Milvus 是 LF AI & Data Foundation 下的一个开源项目&…

计算机的错误计算(一百零四)

摘要 计算机的错误计算(二十七)引入了错数概念。本节给出更为严格的证明。 本节主要讨论表达式计算结果中错误有效数字的数量,简称之为错数。因为0不含有有效数字,因此,除非特别说明,否则,本节…

【Go】-Websocket的使用

目录 为什么需要websocket 使用场景 在线教育 视频弹幕 Web端即时通信方式 什么是web端即时通讯技术? 轮询 长轮询 长连接 SSE websocket 通信方式总结 Websocket介绍 协议升级 连接确认 数据帧 socket和websocket 常见状态码 gorilla/websocket实…

10-pg内核之锁管理器(五)行锁

概念 数据库采用MVCC方式进行并发控制,读写并不会互相阻塞,但是写之间仍然存在冲突。如果还是采用常规锁那样加锁,则会耗费大量共享内存,进而影响性能。所以行锁通过元组级常规锁和xmax结合的方式实现。一般先通过xmax进行可见性…

Unity 新导航寻路演示(2)

对于静态场景来说,只需要3步 1.为场景Ground添加网格表面组件并烘焙 2.为player添加导航代理 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI;public class PlayerMove : MonoBehaviour {private NavMes…

2D动画转3D角色!无需建模- comfyUI工作流一键生成3d效果图!

如何将2d角色转化成3d角色? 不需要建模,通过一个2d转3d的工作流可以直接将你的2d图片转化成3d效果图。 而且操作特别简单,只需要3个步骤,这篇内容我们来说下这个工作路的使用 工作流特点 任意2D图片转换成3D风格 基于sd1.5模型…

ftdi_sio驱动学习笔记 3 - 端口操作

目录 1. ftdi_port_probe 1.1 私有数据结构ftdi_private 1.2 特殊probe处理 1.3 确定FTDI设备类型 1.4 确定最大数据包大小 1.5 设置读取延迟时间 1.6 初始化GPIO 1.6.1 使能GPIO 1.6.2 添加到系统 1.6.2.1 设置GPIO控制器的基本信息 1.6.2.2 设置GPIO控制器的元信息…

Apache Iceberg 与 Spark整合-使用教程(Iceberg 官方文档解析)

官方文档链接(Spark整合Iceberg) 1.Getting Started Spark 目前是进行 Iceberg 操作最丰富的计算引擎。官方建议从 Spark 开始,以理解 Iceberg 的概念和功能。 The latest version of Iceberg is 1.6.1.(2024年9月24日11:45:55&…

如何在云端使用 Browserless 进行网页抓取?

云浏览器是什么? 云浏览器是一种基于云的组合,它将网页浏览器应用程序与一个虚拟化的容器相结合,实现了远程浏览器隔离的概念。开发人员可以使用流行的工具(如 Playwright 和​ Puppeteer​)来自动化网页浏览器&#…

repo 查看指定日期内,哪些仓库有修改,具体的修改详情

文章目录 想看指定时间段内仓库中修改了哪些具体的文件,是谁修改的,commit的备注信息等详情只想看某段时间内有更改的仓库的修改详情,其他没有修改的仓库不显示。 想看指定时间段内仓库中修改了哪些具体的文件,是谁修改的&#xf…

VSCode#include头文件时找不到头文件:我的解决方法

0.前言 1.在学习了Linux之后,我平常大部分都使用本地的XShell或者VSCode连接远程云服务器写代码,CentOS的包管理器为我省去了不少繁琐的事情,今天使用vscode打开本地目录想写点代码发现#include头文件后,下方出现了波浪线&#…

SparkSQL-初识

一、概览 Spark SQL and DataFrames - Spark 3.5.2 Documentation 我们先看下官网的描述: SparkSQL是用于结构化数据处理的Spark模块,与基本的Spark RDD API不同。Spark SQL提供的接口为Spark提供了更多关于正在执行的数据和计算结构的信息。在内部&a…