公司之前所有项目的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 build
cleanWs()
}
}
stage('Checkout') {
steps {
script {
//这里就不在用之前的Git方式了,改为checkout方式
//git (credentialsId: "GF-Git", url: "${GIT_REPO_URL}", branch: "${BRANCH_TAG}")
//这里引用的环境变量 GIT_REPO_URL
checkout([$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}"]
)
}
}
}
欢迎大家入群一起讨论运维技术