From 88e5a70d87acf0b22effb477a952fbbf8038fe01 Mon Sep 17 00:00:00 2001 From: Dev Date: Sat, 16 May 2026 11:31:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8E=88=E6=9D=83=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2+=E8=B7=AF=E7=94=B1=EF=BC=8CIM=E7=8A=B6?= =?UTF-8?q?=E6=80=8130s=E8=BD=AE=E8=AF=A2=EF=BC=8C=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E6=8E=A5=E5=85=A5=E6=96=87=E6=A1=A3=EF=BC=8Cops=E5=8E=BB?= =?UTF-8?q?=E9=99=A4appKey/=E5=B9=B3=E5=8F=B0=E5=88=97=EF=BC=8CJenkinsfile?= =?UTF-8?q?=E5=9B=BA=E5=AE=9Amain=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 44 ++++++----- Jenkinsfile.ops-web | 38 +++++---- Jenkinsfile.tenant-web | 38 +++++---- .../views/services/ServiceRequestsView.vue | 6 -- tenant-platform/src/router/index.ts | 4 + .../src/views/im/ImManagementView.vue | 33 +++++++- .../src/views/layout/MainLayout.vue | 6 +- .../views/license/LicenseManagementView.vue | 77 +++++++++++++++++-- 8 files changed, 183 insertions(+), 63 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b087834..8ddd681 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,28 +2,34 @@ pipeline { agent any parameters { - string(name: 'BRANCH', defaultValue: 'main', description: 'Git 分支名') choice(name: 'APP', choices: ['tenant-platform', 'ops-platform'], description: '要构建的 Web 应用') string(name: 'IMAGE_TAG', defaultValue: 'latest', description: '镜像 Tag') booleanParam(name: 'DEPLOY', defaultValue: true, description: '构建后是否自动部署') } environment { - ACR_REGISTRY = 'crpi-n44qjpuucgjt8e8c.cn-beijing.personal.cr.aliyuncs.com' - ACR_NAMESPACE = 'xuqmgroup' - ACR_USERNAME = 'xuqinmin12' - PROD_HOST = '106.54.23.149' - PROD_USER = 'ubuntu' - COMPOSE_FILE = '/opt/xuqm/deploy/compose.production.yaml' + ACR_REGISTRY = 'crpi-n44qjpuucgjt8e8c.cn-beijing.personal.cr.aliyuncs.com' + ACR_NAMESPACE = 'xuqmgroup' + ACR_USERNAME = 'xuqinmin12' + PROD_HOST = '106.54.23.149' + PROD_USER = 'ubuntu' + COMPOSE_FILE = '/opt/xuqm/deploy/compose.production.yaml' DOCKER_BUILDKIT = '1' } + options { + timeout(time: 20, unit: 'MINUTES') + buildDiscarder(logRotator(numToKeepStr: '20')) + disableConcurrentBuilds() + } + stages { stage('Checkout') { steps { - checkout([$class: 'GitSCM', - branches: [[name: "*/${params.BRANCH}"]], - extensions: [], + checkout([ + $class: 'GitSCM', + branches: [[name: 'main']], + extensions: [[$class: 'CleanBeforeCheckout']], userRemoteConfigs: scm.userRemoteConfigs ]) } @@ -34,16 +40,16 @@ pipeline { script { switch (params.APP) { case 'tenant-platform': - env.IMAGE_NAME = 'tenant-web' - env.DOCKERFILE = 'Dockerfile.tenant' + env.IMAGE_NAME = 'tenant-web' + env.DOCKERFILE = 'Dockerfile.tenant' env.DEPLOY_SERVICE = 'tenant-web' - env.BUILD_ARGS = '--build-arg TENANT_APP_BASE=/ --build-arg TENANT_API_BASE_URL=/api' + env.BUILD_ARGS = '--build-arg TENANT_APP_BASE=/ --build-arg TENANT_API_BASE_URL=/api' break case 'ops-platform': - env.IMAGE_NAME = 'ops-web' - env.DOCKERFILE = 'Dockerfile.ops' + env.IMAGE_NAME = 'ops-web' + env.DOCKERFILE = 'Dockerfile.ops' env.DEPLOY_SERVICE = 'ops-web' - env.BUILD_ARGS = '--build-arg OPS_APP_BASE=/ --build-arg OPS_API_BASE_URL=/api' + env.BUILD_ARGS = '--build-arg OPS_APP_BASE=/ --build-arg OPS_API_BASE_URL=/api' break default: error("Unsupported APP: ${params.APP}") @@ -59,8 +65,8 @@ pipeline { def fullImage = "${env.ACR_REGISTRY}/${env.ACR_NAMESPACE}/${env.IMAGE_NAME}:${params.IMAGE_TAG}" bat """ docker login ${env.ACR_REGISTRY} -u ${env.ACR_USERNAME} -p %ACR_PASS% - docker pull ${fullImage} || exit 0 - docker build -f ${env.DOCKERFILE} ${env.BUILD_ARGS} --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from ${fullImage} -t ${fullImage} . + docker pull --platform=linux/amd64 ${fullImage} || echo Pull failed, will build fresh + docker build --platform=linux/amd64 -f ${env.DOCKERFILE} ${env.BUILD_ARGS} --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from ${fullImage} -t ${fullImage} . docker push ${fullImage} docker rmi ${fullImage} || exit 0 """ @@ -76,7 +82,7 @@ pipeline { script { def fullImage = "${env.ACR_REGISTRY}/${env.ACR_NAMESPACE}/${env.IMAGE_NAME}:${params.IMAGE_TAG}" bat """ - ssh -i "%SSH_KEY%" -o StrictHostKeyChecking=no ${env.PROD_USER}@${env.PROD_HOST} "docker pull ${fullImage} && docker compose -f ${env.COMPOSE_FILE} up -d --no-deps ${env.DEPLOY_SERVICE} && docker image prune -f" + ssh -i "%SSH_KEY%" -o StrictHostKeyChecking=no ${env.PROD_USER}@${env.PROD_HOST} "docker pull ${fullImage} && docker compose -f ${env.COMPOSE_FILE} up -d --no-deps --force-recreate ${env.DEPLOY_SERVICE} && docker image prune -f" """ } } diff --git a/Jenkinsfile.ops-web b/Jenkinsfile.ops-web index bc7be6a..37178ba 100644 --- a/Jenkinsfile.ops-web +++ b/Jenkinsfile.ops-web @@ -2,28 +2,40 @@ pipeline { agent any parameters { - string(name: 'BRANCH', defaultValue: 'main', description: 'Git 分支名') string(name: 'IMAGE_TAG', defaultValue: 'latest', description: '镜像 Tag') booleanParam(name: 'DEPLOY', defaultValue: true, description: '构建后是否自动部署') } environment { - ACR_REGISTRY = 'crpi-n44qjpuucgjt8e8c.cn-beijing.personal.cr.aliyuncs.com' - ACR_NAMESPACE = 'xuqmgroup' - ACR_USERNAME = 'xuqinmin12' - PROD_HOST = '106.54.23.149' - PROD_USER = 'ubuntu' - COMPOSE_FILE = '/opt/xuqm/deploy/compose.production.yaml' + ACR_REGISTRY = 'crpi-n44qjpuucgjt8e8c.cn-beijing.personal.cr.aliyuncs.com' + ACR_NAMESPACE = 'xuqmgroup' + ACR_USERNAME = 'xuqinmin12' + PROD_HOST = '106.54.23.149' + PROD_USER = 'ubuntu' + COMPOSE_FILE = '/opt/xuqm/deploy/compose.production.yaml' DOCKER_BUILDKIT = '1' - IMAGE_NAME = 'ops-web' - DOCKERFILE = 'Dockerfile.ops' - DEPLOY_SERVICE = 'ops-web' - BUILD_ARGS = '--build-arg OPS_APP_BASE=/ --build-arg OPS_API_BASE_URL=/api' + IMAGE_NAME = 'ops-web' + DOCKERFILE = 'Dockerfile.ops' + DEPLOY_SERVICE = 'ops-web' + BUILD_ARGS = '--build-arg OPS_APP_BASE=/ --build-arg OPS_API_BASE_URL=/api' + } + + options { + timeout(time: 20, unit: 'MINUTES') + buildDiscarder(logRotator(numToKeepStr: '20')) + disableConcurrentBuilds() } stages { stage('Checkout') { - steps { checkout scm } + steps { + checkout([ + $class: 'GitSCM', + branches: [[name: 'main']], + extensions: [[$class: 'CleanBeforeCheckout']], + userRemoteConfigs: scm.userRemoteConfigs + ]) + } } stage('Docker Build & Push') { @@ -50,7 +62,7 @@ pipeline { script { def fullImage = "${env.ACR_REGISTRY}/${env.ACR_NAMESPACE}/${env.IMAGE_NAME}:${params.IMAGE_TAG}" bat """ - ssh -i "%SSH_KEY%" -o StrictHostKeyChecking=no ${env.PROD_USER}@${env.PROD_HOST} "docker pull ${fullImage} && docker compose -f ${env.COMPOSE_FILE} up -d --no-deps ${env.DEPLOY_SERVICE} && docker image prune -f" + ssh -i "%SSH_KEY%" -o StrictHostKeyChecking=no ${env.PROD_USER}@${env.PROD_HOST} "docker pull ${fullImage} && docker compose -f ${env.COMPOSE_FILE} up -d --no-deps --force-recreate ${env.DEPLOY_SERVICE} && docker image prune -f" """ } } diff --git a/Jenkinsfile.tenant-web b/Jenkinsfile.tenant-web index fa7b1b3..d627bd0 100644 --- a/Jenkinsfile.tenant-web +++ b/Jenkinsfile.tenant-web @@ -2,28 +2,40 @@ pipeline { agent any parameters { - string(name: 'BRANCH', defaultValue: 'main', description: 'Git 分支名') string(name: 'IMAGE_TAG', defaultValue: 'latest', description: '镜像 Tag') booleanParam(name: 'DEPLOY', defaultValue: true, description: '构建后是否自动部署') } environment { - ACR_REGISTRY = 'crpi-n44qjpuucgjt8e8c.cn-beijing.personal.cr.aliyuncs.com' - ACR_NAMESPACE = 'xuqmgroup' - ACR_USERNAME = 'xuqinmin12' - PROD_HOST = '106.54.23.149' - PROD_USER = 'ubuntu' - COMPOSE_FILE = '/opt/xuqm/deploy/compose.production.yaml' + ACR_REGISTRY = 'crpi-n44qjpuucgjt8e8c.cn-beijing.personal.cr.aliyuncs.com' + ACR_NAMESPACE = 'xuqmgroup' + ACR_USERNAME = 'xuqinmin12' + PROD_HOST = '106.54.23.149' + PROD_USER = 'ubuntu' + COMPOSE_FILE = '/opt/xuqm/deploy/compose.production.yaml' DOCKER_BUILDKIT = '1' - IMAGE_NAME = 'tenant-web' - DOCKERFILE = 'Dockerfile.tenant' - DEPLOY_SERVICE = 'tenant-web' - BUILD_ARGS = '--build-arg TENANT_APP_BASE=/ --build-arg TENANT_API_BASE_URL=/api' + IMAGE_NAME = 'tenant-web' + DOCKERFILE = 'Dockerfile.tenant' + DEPLOY_SERVICE = 'tenant-web' + BUILD_ARGS = '--build-arg TENANT_APP_BASE=/ --build-arg TENANT_API_BASE_URL=/api' + } + + options { + timeout(time: 20, unit: 'MINUTES') + buildDiscarder(logRotator(numToKeepStr: '20')) + disableConcurrentBuilds() } stages { stage('Checkout') { - steps { checkout scm } + steps { + checkout([ + $class: 'GitSCM', + branches: [[name: 'main']], + extensions: [[$class: 'CleanBeforeCheckout']], + userRemoteConfigs: scm.userRemoteConfigs + ]) + } } stage('Docker Build & Push') { @@ -50,7 +62,7 @@ pipeline { script { def fullImage = "${env.ACR_REGISTRY}/${env.ACR_NAMESPACE}/${env.IMAGE_NAME}:${params.IMAGE_TAG}" bat """ - ssh -i "%SSH_KEY%" -o StrictHostKeyChecking=no ${env.PROD_USER}@${env.PROD_HOST} "docker pull ${fullImage} && docker compose -f ${env.COMPOSE_FILE} up -d --no-deps ${env.DEPLOY_SERVICE} && docker image prune -f" + ssh -i "%SSH_KEY%" -o StrictHostKeyChecking=no ${env.PROD_USER}@${env.PROD_HOST} "docker pull ${fullImage} && docker compose -f ${env.COMPOSE_FILE} up -d --no-deps --force-recreate ${env.DEPLOY_SERVICE} && docker image prune -f" """ } } diff --git a/ops-platform/src/views/services/ServiceRequestsView.vue b/ops-platform/src/views/services/ServiceRequestsView.vue index 2050c3c..b2447b0 100644 --- a/ops-platform/src/views/services/ServiceRequestsView.vue +++ b/ops-platform/src/views/services/ServiceRequestsView.vue @@ -10,7 +10,6 @@ - - - -