当前位置: 首页 > news >正文

Jenkins运维之路(Jenkins流水线改造Day01)

公司之前所有项目的Pipeline都是在Jenkins里面,每次都需要到不同项目里面去修改和调试,项目少还好,一多起来真的让人头大,所以这次选择直接使用Jenkinsfile SCM的方式来将流水线集成到Git代码库当中,这样能够统一管理,也为后面使用sharelib做准备

这次我使用的是Gitee代码库来存放,后期准备在转移到内部的Gitlab上,操作上大同小异。

1. 目前公司流水线状态

image-20250909153646209

image-20250909153646209

2.创建运维Jenkins专用项目

创建运维专用代码库

代码库结构

├── Ansible
│ └── Readme.md
├── Jenkinsfile
│ ├── HelloWorld-Pipeline.jenkinsfile 这是docker项目的测试流水线(现在不用在意)
│ └── Readme.md
├── Readme.md
├── src
│ └── org
│ └── foo
│ └── Readme.md
└── vars
└── Readme.md

image-20250909153826061

image-20250909153826061

使用Vscode clone代码库,来进行编写,同时Vscode要安装 JenkinsFile Support 插件(可以高亮显示语法)

image-20250909154025654

image-20250909154025654

3.创建Dockerfile文件

创建Dockerfile的时候要和你的项目同名,这样能够方便后面的一些操作

image-20250909154409339

image-20250909154409339

将Pipeline script的内容转移到Jenkinsfile中

image-20250909154617727

image-20250909154617727

推送Jenkinsfile文件到代码库

image-20250909154755350

image-20250909154755350

image-20250909154814216

image-20250909154814216

image-20250909154843841

image-20250909154843841

4.将Jenkins项目连接使用代码库中的jenkinsfile

image-20250909155715452

image-20250909155715452

尝试构建

image-20250909155830855

image-20250909155830855

5.流水线改造

让我们先看下目前流水线,并标注出目前流水线中的问题。

def createVersion() {// 创建了一个方法createVersion()// 定义一个时间戳+构建ID作为版本号,为tag使用return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
}
pipeline {agent { node { label "node47"}}tools {git 'Git'maven 'maven399'jdk 'jdk1701'}// 定义环境变量environment {GIT_REPO_URL = 'git@git.xxxxxx.git'//引用createVersion这个方法_tag = createVersion()}options {timeout(time: 10, unit: 'MINUTES')//这里我增加几个参数来优化一下// 不允许同时执行流水线disableConcurrentBuilds()// 构建时的时间信息timestamps()}parameters {// 这里的参数是在每次构建的过程中输入分支名称,这就不太科学了,这里我们改造成自动获取分支和tag名称//string(name: 'BRANCH_TAG', defaultValue: 'master', description: 'Enter the GF branch to checkout')gitParameter(name: 'BRANCH_TAG',type: 'PT_BRANCH_TAG',defaultValue: 'master',description: '请选择你要部署的分支或Tag',//branchFilter: '^(master|dev|test)$', // 只匹配 master、dev 和 test 分支//tagFilter: 'rel-.*', // 匹配所有以 rel- 开头的标签useRepository: 'git@git.xxxxxx.git', // 这里要使用完整的Git仓库地址quickFilterEnabled: true // 启用快速筛选)}stages {stage('Show info') {steps {script {wrap([$class: 'BuildUser']) {echo "Built by: ${env.BUILD_USER_ID}"currentBuild.description = "Built by: ${env.BUILD_USER_ID}, Branch: ${env.BRANCH_TAG}"}}}}stage('CleanWorkDir') {steps {// Clean before buildcleanWs()}}stage('Checkout') {steps {script {//这里就不在用之前的Git方式了,改为checkout方式//git (credentialsId: "GF-Git", url: "${GIT_REPO_URL}", branch: "${BRANCH_TAG}")//这里引用的环境变量 GIT_REPO_URLcheckout([$class: 'GitSCM', branches: [[name: params.BRANCH_TAG]], userRemoteConfigs: [[url: "${GIT_REPO_URL}", credentialsId: "GF-Git"]]])}}}stage('Build') {steps {echo "Building"sh 'java -version && mvn -v && ls -l'sh 'mvn clean package -Dmaven.test.skip=true'}}stage('PullProject') {steps {sh 'echo PullProject'sh 'ls target/build/'sh 'cd target/build/ && tar zcf easy-dis-im.tar.gz easy-dis-im.jar lib'sh 'ansible easydisim -m copy -a "src=target/build/easy-dis-im.tar.gz dest=/project/pre-release/easy-dis-im/ mode=777"'}}stage('Delpoy') {steps {sh 'echo Delpoy'script {sh 'ssh root@xxxxxx \'cd /project/easy-dis-order && sh deploylib.sh\''sh 'ssh root@xxxxxx \'cd /project/easy-dis-order && sh deploylib.sh\''}}}}post {always{script {println("流水线结束后,经常做的事情")}}success{script {// 检查用户选择的是分支还是标签if (params.BRANCH_TAG.startsWith("rel-")) {echo "选择的是标签,不打标签。"} else if (params.BRANCH_TAG == "master") {// 只有在 master 分支时打标签sh "git tag rel-${_tag}" // 打标签sh "git push origin rel-${_tag}" // 推送标签到远程echo "为分支 ${params.BRANCH_TAG} 打标签 rel-${_tag}。"} else {echo "当前分支 ${params.BRANCH_TAG} 不是 master,不打标签。"}}// 发送成功通知dingtalk (robot: 'BuildBoy',type:'MARKDOWN',title: "success: ${JOB_NAME}",text: ["- 成功构建部署: ${JOB_NAME}项目!\n" +"- 版本: ${BRANCH_TAG}\n" +"- 标签: rel-${_tag}\n" + // 加入标签信息"- 持续时间: ${currentBuild.durationString}\n" +"- 任务: #${JOB_NAME}"])}failure{dingtalk (robot: 'BuildBoy',type:'MARKDOWN',title: "fail: ${JOB_NAME}",text: ["- 失败构建部署:${JOB_NAME}项目!\n- 版本:${BRANCH_TAG}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"])}aborted{dingtalk (robot: 'BuildBoy',type:'MARKDOWN',title: "aborted: ${JOB_NAME}",text: ["- 流水线被取消:${JOB_NAME}项目!\n- 版本:${BRANCH_TAG}\n- 持续时间:${currentBuild.durationString}\n- 任务:${JOB_NAME}"])}}
}

欢迎大家入群一起讨论运维技术

欢迎大家入群一起讨论运维技术


文章转载自:

http://qC6Easlz.xmmwj.cn
http://1KCDLVsG.xmmwj.cn
http://oldHoCK9.xmmwj.cn
http://gLkC6amV.xmmwj.cn
http://Y4fMfuCy.xmmwj.cn
http://t6yek8fN.xmmwj.cn
http://2VUeVJSw.xmmwj.cn
http://H9kAcpoa.xmmwj.cn
http://B1QYnNQj.xmmwj.cn
http://hcrcPAeN.xmmwj.cn
http://Y22tNLr4.xmmwj.cn
http://qrzef45A.xmmwj.cn
http://LZbCt2SV.xmmwj.cn
http://ZRXOFVad.xmmwj.cn
http://XnQ4YcEx.xmmwj.cn
http://J0U0zZnz.xmmwj.cn
http://AN0Aw8d6.xmmwj.cn
http://gAAno6q7.xmmwj.cn
http://l8s60VjL.xmmwj.cn
http://oyTgIOHE.xmmwj.cn
http://TjAm9WaL.xmmwj.cn
http://Mnwi4uHX.xmmwj.cn
http://xn5ABlSR.xmmwj.cn
http://e9JZQCEj.xmmwj.cn
http://q8dpfX8k.xmmwj.cn
http://3UcWEsCv.xmmwj.cn
http://T1n7XEjH.xmmwj.cn
http://LxbmAcI7.xmmwj.cn
http://INbxJdmy.xmmwj.cn
http://c2MBgt51.xmmwj.cn
http://www.dtcms.com/a/378535.html

相关文章:

  • 9月11日星期四今日早报简报微语报早读
  • 阿里兵临城下,美团迎来至暗时刻?
  • 学习笔记:Javascript(5)——事件监听(用户交互)
  • window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(二)
  • [K8S学习笔记] Service和Ingress的关系
  • YOLO11实战 第018期-基于yolo11的水果甜瓜目标检测实战文档(详细教程)
  • 【已解决】mongoose在mongodb中添加数据,数据库默认复数问题
  • 借助自动化GPO报表增强AD域安全性
  • decentralized英文单词学习
  • 响应式布局
  • Vue基础知识-Vue集成 Element UI全量引入与按需引入
  • 《UE5_C++多人TPS完整教程》学习笔记52 ——《P53 FABRIK 算法(FABRIK IK)》
  • 网络编程套接字(UDP)
  • Git子模块(Submodule)合并冲突的原理与解决方案
  • 谷粒商城项目-P16快速开发-人人开源搭建后台管理系统
  • 记一次nginx服务器安全防护实战之“恶意目录探测攻击”防护
  • 突破多模态极限!InstructBLIP携指令微调革新视觉语言模型,X-InstructBLIP实现跨模态推理新高度
  • 如何在实际应用中平衡YOLOv12的算力需求和检测精度?
  • MySQL 主键约束:表的 “身份证”,数据完整性的核心保障
  • 分布式事务性能优化:从故障现场到方案落地的实战手记(二)
  • 本地生活服务平台创新模式观察:积分体系如何重塑消费生态?
  • 内存传输速率MT/s
  • ThinkPHP8学习篇(六):数据库(二)
  • Synchronized原理解析
  • Cesium深入浅出之shadertoy篇
  • LoRaWAN网关支持双NS的场景有哪些?
  • BigVGAN:探索 NVIDIA 最新通用神经声码器的前沿
  • SpringTask和XXL-job概述
  • 软考系统架构设计师之软件维护篇
  • 从CTF题目深入变量覆盖漏洞:extract()与parse_str()的陷阱与防御