Jenkins运维之路(Jenkins流水线改造Day01)
公司之前所有项目的Pipeline都是在Jenkins里面,每次都需要到不同项目里面去修改和调试,项目少还好,一多起来真的让人头大,所以这次选择直接使用Jenkinsfile SCM的方式来将流水线集成到Git代码库当中,这样能够统一管理,也为后面使用sharelib做准备
这次我使用的是Gitee代码库来存放,后期准备在转移到内部的Gitlab上,操作上大同小异。
1. 目前公司流水线状态
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
使用Vscode clone代码库,来进行编写,同时Vscode要安装 JenkinsFile Support 插件(可以高亮显示语法)
image-20250909154025654
3.创建Dockerfile文件
创建Dockerfile的时候要和你的项目同名,这样能够方便后面的一些操作
image-20250909154409339
将Pipeline script的内容转移到Jenkinsfile中
image-20250909154617727
推送Jenkinsfile文件到代码库
image-20250909154755350
image-20250909154814216
image-20250909154843841
4.将Jenkins项目连接使用代码库中的jenkinsfile
image-20250909155715452
尝试构建
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}"])}}
}
欢迎大家入群一起讨论运维技术