更新CI/CD文件

This commit is contained in:
2026-09-10 22:09:24 +08:00
parent 717116a605
commit 24cc349188
6 changed files with 2 additions and 713 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
masterProfiles: ['','uat','prod']
Profiles: ['','dev']
jobConfigFile: "xiaomayiConfig.yml"
jobConfigFile: "djangoadminConfig.yml"
npmCompileCMD: |
set -e \
&& yarn config set registry https://registry.npmmirror.com \
-155
View File
@@ -1,155 +0,0 @@
pipeline {
agent any
options {
buildDiscarder(logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '2', numToKeepStr: '2'))
}
stages {
stage('Setup Parameters & ENV') {
steps {
configFileProvider([configFile(fileId: 'xiaomayi-web', variable: 'settingsFile')]) {
script {
def config = readJSON file:"$settingsFile"
def jobNameStr = JOB_NAME.tokenize('/') as String[]
def jobName = jobNameStr[0]
def branchConfig = config."branchConfig"."${env.BRANCH_NAME}"
def serviceConfig = config."serviceConfig"."${jobName}"
MAVEN_SET = branchConfig.MAVEN_SET
registry = branchConfig.registry
registryCredential = branchConfig.registryCredential
namespace = branchConfig.namespace
jenkinsAgent = branchConfig.jenkinsAgent
serverPort = branchConfig.serverPort
echo "jobName: ${jobName}"
echo "The Maven Set XML for the ${env.BRANCH_NAME} branch is: ${MAVEN_SET}"
projectName = serviceConfig.containerName
servicePath = serviceConfig.servicePath
jarPackageName = serviceConfig.jarPackageName
baseImage = "${registry}/xiaomayi-base/jdk:17.0.16-rocky8-dos"
port = serviceConfig."port"
jarFile = "${jarPackageName}"
jarFilePath = "${servicePath}/target"
serverHost01= serviceConfig.serverHost01
echo "jarFile: ${jarFile}"
echo "jarFilePath: ${jarFilePath}"
echo "serverHost01: ${serverHost01}"
echo "serverPort:${serverPort}"
if ("${env.BRANCH_NAME}" == "dev") {
serverIP01 = branchConfig."${serverHost01}"
echo "serverIP01: ${serverIP01}"
properties([
parameters([
string(
defaultValue: 'dev',
description: '编译参数',
name: 'PROFILES',
trim: true
)
])
])
} else if ("${env.BRANCH_NAME}" == "test"){
serverIP01 = branchConfig."${serverHost01}"
echo "serverIP01: ${serverIP01}"
properties([
parameters([
string(
defaultValue: 'test',
description: '编译参数',
name: 'PROFILES',
trim: true
)
])
])
} else if ("${env.BRANCH_NAME}" == "master") {
properties([
parameters([
string(
defaultValue: 'prod',
description: '编译参数',
name: 'PROFILES',
trim: true
)
])
])
serverIP01 = branchConfig."${serverHost01}"
echo "serverIP01: ${serverIP01}"
} else {
error("Build failed because failed to fetch settings for branch")
}
echo "The serverIP for the branch: ${env.BRANCH_NAME}, profile: ${PROFILES} is: ${serverIP01}"
}
}
}
}
stage('Build') {
agent {
// docker {
// image "maven:3.8.6-openjdk-8"
// args '-v /etc/hosts:/etc/hosts:ro'
// label jenkinsAgent
// }
label {
label jenkinsAgent
}
}
steps {
configFileProvider([configFile(fileId: MAVEN_SET, variable: 'MAVEN_SETTINGS_XML')]) {
sh "/usr/local/maven/bin/mvn --settings ${MAVEN_SETTINGS_XML} dependency:purge-local-repository -Dinclude=com.xiaomayi -fpom.xml clean package -P${PROFILES} -Dmaven.test.skip=true"
sh "ls -lsh ${jarFilePath}/${jarFile}"
sh "md5sum ${jarFilePath}/${jarFile}"
// echo "MD5 ${jarFile}: `md5sum ${jarFilePath}/${jarFile}`"
}
}
}
stage('Container Build') {
options {
skipDefaultCheckout()
}
agent {
label {
label jenkinsAgent
}
}
steps {
script {
echo "VAR_BASE_IMAGE: ${baseImage}"
echo "VAR_PORT: ${port}"
echo "VAR_JARFILE: ${jarFile}"
echo "VAR_JARFILE_PATH: ${jarFilePath}"
docker.withRegistry("https://"+registry, registryCredential) {
dockerImage = docker.build("${namespace}/${projectName}:${PROFILES}-${env.BUILD_ID}", "--build-arg VAR_PROFILES=${PROFILES} --build-arg VAR_BASE_IMAGE=${baseImage} --build-arg VAR_PORT=${port} --build-arg VAR_JARFILE=${jarFile} --build-arg VAR_JARFILE_PATH=${jarFilePath} -f .jenkinsfile/Dockerfile ./")
dockerImage.push()
// dockerImage.push('latest')
}
sh "docker rmi -f ${namespace}/${projectName}:${PROFILES}-${env.BUILD_ID}"
sh "docker rmi -f ${registry}/${namespace}/${projectName}:${PROFILES}-${env.BUILD_ID}"
}
// cleanWs()
}
}
stage("Deploy") {
options {
skipDefaultCheckout()
}
agent {
label {
label jenkinsAgent
}
}
steps {
script {
sh "ssh -o StrictHostKeyChecking=no esxi@${serverIP01} -p ${serverPort} 'cd /usr/local/docker/xiaomayi-web/; ./deploy.sh deploy ${projectName} ${PROFILES}-${env.BUILD_ID}'"
}
}
}
}
}
-237
View File
@@ -1,237 +0,0 @@
pipeline {
agent any
options {
buildDiscarder(logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '2', numToKeepStr: '2'))
}
stages {
stage('Setup Parameters & ENV') {
options {
skipDefaultCheckout()
}
agent {
label "${env.BRANCH_NAME}"
}
steps {
checkout scmGit([
branches: [[name: '*/master']],
userRemoteConfigs: [[
credentialsId: 'c9b5eae2-5df5-485f-bebd-9cd5393b03e1',
url: 'http://192.168.10.202:3000/cicd/pipeline-files.git'
]],
extensions: [[
$class: 'RelativeTargetDirectory',
relativeTargetDir: '.pipeline-files'
]],
])
script {
def settingsJson = readJSON file: ".pipeline-files/jenkins-file/xiaomayi.k8s.JsonConfig.json"
// def config = readJSON file:"$settingsFile"
def jobNameStr = JOB_NAME.tokenize('/') as String[]
def projName = jobNameStr[0]
def branchConfig = settingsJson."branchConfig"."${env.BRANCH_NAME}"
def serviceConfig = settingsJson."serviceConfig"."${projName}"
MAVEN_SET = branchConfig.MAVEN_SET
registry = branchConfig.registry
registryCredential = branchConfig.registryCredential
registry_project = branchConfig.registry_project
jenkinsAgent = branchConfig.jenkinsAgent
echo "projName: ${projName}"
echo "The Maven Set XML for the ${env.BRANCH_NAME} branch is: ${MAVEN_SET}"
containerName = serviceConfig.containerName
servicePath = serviceConfig.servicePath
baseImage = "${registry}/xiaomayi-base/jdk:17.0.11-centos8"
servicePort = serviceConfig."port"
jarFile = "${containerName}.jar"
jarFilePath = "${servicePath}/target"
serverHost01 = serviceConfig.serverHost01
echo "jarFile: ${jarFile}"
echo "jarFilePath: ${jarFilePath}"
if ("${env.BRANCH_NAME}" == "master" && "${params.PROFILES}" != "null") {
k8s_namespace = branchConfig."${params.PROFILES}".k8s_namespace
k8s_cluster = branchConfig."${params.PROFILES}".k8s_cluster
serverIP01 = branchConfig."${params.PROFILES}"."${serverHost01}"
} else {
k8s_namespace = branchConfig.k8s_namespace
k8s_cluster = branchConfig.k8s_cluster
serverIP01 = branchConfig."${serverHost01}"
}
echo "k8s_cluster: ${k8s_cluster}"
echo "k8s_namespace: ${k8s_namespace}"
echo "serverIP01: ${serverIP01}"
if ("${serviceConfig."nodePort"}" != 'null') {
nodePort = serviceConfig."nodePort"."${env.BRANCH_NAME}"
echo "nodePort: ${nodePort}"
} else {
nodePort = "null"
echo "nodePort: ${nodePort}"
}
if ("${serviceConfig."pvcName"}" != 'null') {
pvcName = serviceConfig."pvcName"
echo "PVC Name: ${pvcName}"
} else {
pvcName = "null"
echo "PVC Name: ${pvcName}"
}
if ("${env.BRANCH_NAME}" != "master") {
properties([
parameters([
string(
defaultValue: "${env.BRANCH_NAME}",
description: '编译参数',
name: 'PROFILES',
trim: true
),
choice (
choices: ['service','api','all'],
description: '编译参数: api:附带deploy api, all: 包含子路径pom',
name: 'APICHOICE'
)
])
])
} else if ("${env.BRANCH_NAME}" == "master") {
properties([
parameters([
choice (
choices: ['','uat', 'prod'],
description: '编译参数: uat-uat环境,prod-生产环境',
name: 'PROFILES'
),
choice (
choices: ['service','api','all'],
description: '编译参数: api:附带deploy api, all: 包含子路径pom',
name: 'APICHOICE'
)
])
])
} else {
error("Build failed because failed to fetch settings for branch")
}
}
}
}
stage('Build') {
agent {
// docker {
// image "maven:3.8.6-openjdk-8"
// args '-v /etc/hosts:/etc/hosts:ro'
// label jenkinsAgent
// }
label {
label jenkinsAgent
}
}
steps {
configFileProvider([configFile(fileId: MAVEN_SET, variable: 'MAVEN_SETTINGS_XML')]) {
sh "/usr/local/maven/bin/mvn --settings ${MAVEN_SETTINGS_XML} dependency:purge-local-repository -Dinclude=com.xiaomayi -fpom.xml clean package -P${PROFILES} -Dmaven.test.skip=true"
sh "ls -lsh ${jarFilePath}/${jarFile}"
sh "md5sum ${jarFilePath}/${jarFile}"
}
}
}
stage('Container Build') {
when {
expression { params.APICHOICE == "service" || params.APICHOICE == "all" }
}
options {
skipDefaultCheckout()
}
agent {
label {
label jenkinsAgent
}
}
steps {
script {
echo "VAR_BASE_IMAGE: ${baseImage}"
echo "VAR_PORT: ${servicePort}"
echo "VAR_JARFILE: ${jarFile}"
echo "VAR_JARFILE_PATH: ${jarFilePath}"
def dockerImage = docker.image("${registry_project}/${containerName}:${PROFILES}-${env.BUILD_ID}")
sh """
docker build -t ${dockerImage.imageName()} \
-f Dockerfile \
--build-arg VAR_BASE_IMAGE=${baseImage} \
--build-arg VAR_PROFILES=${PROFILES} \
--build-arg VAR_PORT=${servicePort} \
--build-arg VAR_JARFILE_PATH=${jarFilePath} \
--build-arg VAR_JARFILE=${jarFile} .
"""
docker.withRegistry("https://"+registry, registryCredential) {
dockerImage.push()
}
sh """
docker rmi -f ${registry_project}/${containerName}:${PROFILES}-${env.BUILD_ID}
docker rmi -f ${registry}/${registry_project}/${containerName}:${PROFILES}-${env.BUILD_ID}
"""
}
cleanWs()
}
}
stage("Deploy") {
options {
skipDefaultCheckout()
}
when {
allOf {
expression { params.PROFILES != "uat" }
anyOf {
expression { params.APICHOICE == "service" || params.APICHOICE == "all" }
}
}
}
agent {
label {
label jenkinsAgent
}
}
steps {
checkout scmGit([
branches: [[name: '*/master']],
userRemoteConfigs: [[
credentialsId: 'c9b5eae2-5df5-485f-bebd-9cd5393b03e1',
url: 'http://192.168.10.202:3000/cicd/pipeline-files.git'
]],
extensions: [[
$class: 'RelativeTargetDirectory',
relativeTargetDir: '.pipeline-files'
]],
])
script {
sh """
sed -i 's#REGISTRY_URL#${registry}#g' .pipeline-files/k8s-file/${containerName}.yaml
sed -i 's#NAMESPACE#${k8s_namespace}#g' .pipeline-files/k8s-file/${containerName}.yaml
sed -i 's#VERSION#${PROFILES}-${env.BUILD_ID}#g' .pipeline-files/k8s-file/${containerName}.yaml
sed -i 's#SERVICE_PORT#${servicePort}#g' .pipeline-files/k8s-file/${containerName}.yaml
"""
if ("${nodePort}" != "null") {
sh """
sed -i 's#NODE_PORT#${nodePort}#g' .pipeline-files/k8s-file/${containerName}.yaml
"""
}
if ("${pvcName}" != "null") {
sh """
sed -i 's#PVC_NAME#${pvcName}#g' .pipeline-files/k8s-file/${containerName}.yaml
"""
}
sshagent(['jenkins-ssh-207']) {
sh """
ssh ${k8s_cluster} 'mkdir -p /home/esxi/k8s-yaml'
scp .pipeline-files/k8s-file/${containerName}.yaml ${k8s_cluster}:/home/esxi/k8s-yaml
ssh ${k8s_cluster} 'cd /home/esxi/k8s-yaml && kubectl apply -f ${containerName}.yaml'
"""
}
}
}
}
}
}
-316
View File
@@ -1,316 +0,0 @@
pipeline {
agent any
options {
// 构建记录保留策略
buildDiscarder(logRotator(
artifactDaysToKeepStr: '',
artifactNumToKeepStr: '',
daysToKeepStr: '2',
numToKeepStr: '2'
))
// 防止并发构建冲突
disableConcurrentBuilds()
// 设置构建超时时间(30分钟)
timeout(time: 30, unit: 'MINUTES')
}
// 定义构建参数
parameters {
string(
name: 'PROFILES',
defaultValue: getDefaultProfile(), // 根据分支自动设置默认值
description: '编译环境参数(dev/test/prod)',
trim: true
)
}
stages {
// 阶段1:环境配置和参数设置
stage('Setup Parameters & ENV') {
steps {
// 从Jenkins配置管理获取配置文件
configFileProvider([configFile(fileId: 'xiaomayi-web', variable: 'settingsFile')]) {
script {
setupEnvironment() // 调用环境设置函数
}
}
}
}
// 阶段2:代码编译构建
stage('Build') {
agent {
label {
label "${env.JENKINS_AGENT}" // 使用动态指定的Jenkins agent
}
}
steps {
// 使用指定的Maven配置进行构建
configFileProvider([configFile(fileId: "${env.MAVEN_SET}", variable: 'MAVEN_SETTINGS_XML')]) {
sh """
# 使用Maven进行依赖清理和项目构建
/usr/local/maven/bin/mvn --settings ${MAVEN_SETTINGS_XML} \
dependency:purge-local-repository -Dinclude=com.xiaomayi \
-f pom.xml clean package -P${params.PROFILES} \
-Dmaven.test.skip=true
"""
// 验证构建产物
sh "ls -lsh ${env.JAR_FILE_PATH}/${env.JAR_FILE}"
sh "md5sum ${env.JAR_FILE_PATH}/${env.JAR_FILE}"
}
}
post {
always {
// 归档构建产物以便后续使用和审计
archiveArtifacts artifacts: "${env.JAR_FILE_PATH}/${env.JAR_FILE}", fingerprint: true
}
}
}
// 阶段3:Docker镜像构建和推送
stage('Container Build') {
agent {
label {
label "${env.JENKINS_AGENT}"
}
}
steps {
script {
buildAndPushDockerImage() // 调用镜像构建函数
}
}
post {
always {
cleanDockerImages() // 清理本地Docker镜像节省空间
}
}
}
// 阶段4:部署到目标服务器
stage('Deploy') {
agent {
label {
label "${env.JENKINS_AGENT}"
}
}
steps {
script {
deployToServer() // 调用部署函数
}
}
}
}
// 构建后处理
post {
success {
echo "✅ Pipeline执行成功 - 分支: ${env.BRANCH_NAME} - 构建ID: ${env.BUILD_ID} - 环境: ${params.PROFILES}"
}
failure {
echo "❌ Pipeline执行失败 - 分支: ${env.BRANCH_NAME} - 构建ID: ${env.BUILD_ID}"
// 此处可以添加邮件通知、钉钉通知等
}
aborted {
echo "⚠️ Pipeline被中止 - 分支: ${env.BRANCH_NAME} - 构建ID: ${env.BUILD_ID}"
}
cleanup {
cleanWs() // 清理工作空间,释放磁盘空间
}
}
}
/**
* 根据当前分支获取默认的Profile参数
* @return 对应的环境参数(dev/test/prod)
*/
def getDefaultProfile() {
def branch = env.BRANCH_NAME ?: 'dev'
switch(branch) {
case 'dev':
return 'dev'
case 'test':
return 'test'
case 'master':
return 'prod'
default:
return 'dev' // 默认使用dev环境
}
}
/**
* 设置构建环境变量和配置参数
* 从配置文件中读取分支和服务的具体配置
*/
def setupEnvironment() {
// 读取JSON配置文件
def config = readJSON file: "${settingsFile}"
// 解析任务名称(处理多级目录结构)
def jobNameStr = env.JOB_NAME.tokenize('/')
def jobName = jobNameStr[0]
// 获取分支配置和服务配置
def branchConfig = config.branchConfig."${env.BRANCH_NAME}"
def serviceConfig = config.serviceConfig."${jobName}"
// 验证配置是否存在
if (!branchConfig || !serviceConfig) {
error("❌ 无法获取分支 ${env.BRANCH_NAME} 或服务 ${jobName} 的配置")
}
// 设置分支相关环境变量
env.MAVEN_SET = branchConfig.MAVEN_SET
env.REGISTRY = branchConfig.registry
env.REGISTRY_CREDENTIAL = branchConfig.registryCredential
env.NAMESPACE = branchConfig.namespace
env.JENKINS_AGENT = branchConfig.jenkinsAgent
env.SERVER_PORT = branchConfig.serverPort
// 设置服务相关环境变量
env.PROJECT_NAME = serviceConfig.containerName
env.SERVICE_PATH = serviceConfig.servicePath
env.JAR_PACKAGE_NAME = serviceConfig.jarPackageName
env.BASE_IMAGE = "${env.REGISTRY}/xiaomayi-base/jdk:17.0.16-rocky8-dos"
env.PORT = serviceConfig.port
env.JAR_FILE = "${env.JAR_PACKAGE_NAME}"
env.JAR_FILE_PATH = "${env.SERVICE_PATH}/target"
env.SERVER_HOST_01 = serviceConfig.serverHost01
// 根据分支设置服务器IP地址
if (['dev', 'test', 'master'].contains(env.BRANCH_NAME)) {
env.SERVER_IP_01 = branchConfig."${env.SERVER_HOST_01}"
if (!env.SERVER_IP_01) {
error("❌ 无法获取服务器IP地址配置: ${env.SERVER_HOST_01}")
}
} else {
error("❌ 不支持的分支: ${env.BRANCH_NAME}")
}
// 打印环境配置信息用于调试和验证
echo """
📋 ============ 环境配置信息 ============
🔹 分支: ${env.BRANCH_NAME}
🔹 项目: ${jobName}
🔹 环境参数: ${params.PROFILES}
🔹 Maven配置: ${env.MAVEN_SET}
🔹 镜像仓库: ${env.REGISTRY}
🔹 命名空间: ${env.NAMESPACE}
🔹 项目名称: ${env.PROJECT_NAME}
🔹 JAR文件: ${env.JAR_FILE}
🔹 目标服务器: ${env.SERVER_IP_01}:${env.SERVER_PORT}
🔹 Jenkins Agent: ${env.JENKINS_AGENT}
====================================
"""
}
/**
* 构建并推送Docker镜像到镜像仓库
*/
def buildAndPushDockerImage() {
// 打印镜像构建参数
echo """
🐳 ============ 镜像构建参数 ============
🔹 基础镜像: ${env.BASE_IMAGE}
🔹 暴露端口: ${env.PORT}
🔹 JAR文件: ${env.JAR_FILE}
🔹 JAR文件路径: ${env.JAR_FILE_PATH}
🔹 镜像标签: ${env.NAMESPACE}/${env.PROJECT_NAME}:${params.PROFILES}-${env.BUILD_ID}
====================================
"""
// 使用Docker凭证连接到镜像仓库
docker.withRegistry("https://${env.REGISTRY}", env.REGISTRY_CREDENTIAL) {
def dockerImage = docker.build(
"${env.NAMESPACE}/${env.PROJECT_NAME}:${params.PROFILES}-${env.BUILD_ID}",
// 构建参数传递
"--build-arg VAR_PROFILES=${params.PROFILES} " +
"--build-arg VAR_BASE_IMAGE=${env.BASE_IMAGE} " +
"--build-arg VAR_PORT=${env.PORT} " +
"--build-arg VAR_JARFILE=${env.JAR_FILE} " +
"--build-arg VAR_JARFILE_PATH=${env.JAR_FILE_PATH} " +
"-f .jenkinsfile/Dockerfile ./" // 指定Dockerfile路径
)
// 推送镜像到仓库
dockerImage.push()
echo "✅ Docker镜像推送成功: ${env.NAMESPACE}/${env.PROJECT_NAME}:${params.PROFILES}-${env.BUILD_ID}"
}
}
/**
* 清理本地Docker镜像,释放磁盘空间
*/
def cleanDockerImages() {
echo "🧹 开始清理本地Docker镜像..."
try {
// 删除本地构建的镜像
sh """
docker rmi -f ${env.NAMESPACE}/${env.PROJECT_NAME}:${params.PROFILES}-${env.BUILD_ID} || true
docker rmi -f ${env.REGISTRY}/${env.NAMESPACE}/${env.PROJECT_NAME}:${params.PROFILES}-${env.BUILD_ID} || true
"""
// 清理悬空镜像(不再被任何容器引用的镜像)
sh "docker image prune -f || true"
echo "✅ Docker镜像清理完成"
} catch (Exception e) {
echo "⚠️ 镜像清理过程中出现警告: ${e.message}"
// 镜像清理失败不影响主要流程,继续执行
}
}
/**
* 部署应用到目标服务器
* 通过SSH连接到服务器执行部署脚本
*/
def deployToServer() {
// 构建部署命令
def deployCmd = """
ssh -o StrictHostKeyChecking=no \
-o ConnectTimeout=30 \
-o ServerAliveInterval=60 \
esxi@${env.SERVER_IP_01} -p ${env.SERVER_PORT} \
'cd /usr/local/docker/xiaomayi-web/; ./deploy.sh deploy ${env.PROJECT_NAME} ${params.PROFILES}-${env.BUILD_ID}'
"""
echo """
🚀 ============ 开始部署 ============
🔹 目标服务器: ${env.SERVER_IP_01}:${env.SERVER_PORT}
🔹 服务名称: ${env.PROJECT_NAME}
🔹 镜像版本: ${params.PROFILES}-${env.BUILD_ID}
====================================
"""
echo "执行部署命令: ${deployCmd}"
// 部署过程添加重试机制和超时控制
try {
retry(3) { // 最多重试3次
timeout(time: 10, unit: 'MINUTES') { // 部署超时时间10分钟
sh deployCmd
}
}
echo "✅ 部署成功完成"
} catch (Exception e) {
error("❌ 部署失败: ${e.message}")
}
}
/**
* 验证必要环境变量是否设置(可选,可用于前置检查)
*/
def validateEnvironment() {
def requiredEnvVars = [
'BRANCH_NAME', 'MAVEN_SET', 'REGISTRY', 'REGISTRY_CREDENTIAL',
'NAMESPACE', 'JENKINS_AGENT', 'PROJECT_NAME', 'SERVER_IP_01'
]
def missingVars = []
requiredEnvVars.each { var ->
if (!env."${var}") {
missingVars.add(var)
}
}
if (missingVars) {
error("❌ 缺少必要环境变量: ${missingVars.join(', ')}")
}
}
+1 -1
View File
@@ -1,3 +1,3 @@
@Library('share-library@master')_
orgName = 'xiaomayi'
orgName = 'djangoadmin'
pipelineJDKService(orgName)
-3
View File
@@ -1,3 +0,0 @@
@Library('share-library@master')_
orgName = 'xiaomayi'
pipelineNodeService(orgName)