From 775dd4bda7f1c011ac6d08f6e9d5af3b8af6b3c3 Mon Sep 17 00:00:00 2001 From: marsal wang <707783088@qq.com> Date: Tue, 15 Aug 2023 14:04:34 +0800 Subject: [PATCH] docker --- jenkins/swarm/Dockerfile | 8 ++ jenkins/swarm/Jenkinsfile | 129 +++++++++++++++++++++++++++++++ jenkins/swarm/nginx/default.conf | 12 +++ vue.config.js | 2 +- 4 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 jenkins/swarm/Dockerfile create mode 100644 jenkins/swarm/Jenkinsfile create mode 100644 jenkins/swarm/nginx/default.conf diff --git a/jenkins/swarm/Dockerfile b/jenkins/swarm/Dockerfile new file mode 100644 index 00000000..ad979594 --- /dev/null +++ b/jenkins/swarm/Dockerfile @@ -0,0 +1,8 @@ +# 设置基础镜像 +FROM docker.io/bitnami/nginx:1.24 +# 定义作者 +MAINTAINER marsal +# 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面 +COPY dist/ /app/ +#用本地的 default.conf 配置来替换nginx镜像里的默认配置 +COPY jenkins/swarm/nginx/default.conf /opt/bitnami/nginx/conf/server_blocks/default.conf diff --git a/jenkins/swarm/Jenkinsfile b/jenkins/swarm/Jenkinsfile new file mode 100644 index 00000000..aa314b70 --- /dev/null +++ b/jenkins/swarm/Jenkinsfile @@ -0,0 +1,129 @@ +#!/usr/bin/env groovy + +def projectProperties = [ + [$class: 'BuildDiscarderProperty', strategy: [$class: 'LogRotator', numToKeepStr: '5']], + parameters([ + string(name: 'REGISTRY_URL', defaultValue: 'harbor.sino-assist.com', description: 'docker harbor register url'), + string(name: 'NAMESPACE', defaultValue: 'crm1', description: 'NAMESPACE'), + string(name: 'deploy_server', description: '机器ip'), + string(name: 'profile', defaultValue: 'dev', description: 'profile'), + booleanParam(name: 'yarnInstall', description: '是否更新node_modules'), + string(name: 'backUrl', defaultValue: 'https://api1.sino-assist.com', description: 'backend server url') + ]) +] + +node { + def workspace = pwd() + def DOCKER_CREDENTIAL_ID = 'harbor' + + stage('Initialize') { + echo 'Initializing...' + def node = tool name: 'nodejs-v12', type: 'jenkins.plugins.nodejs.tools.NodeJSInstallation' + env.PATH = "${node}/bin:${env.PATH}" + } + + stage('checkout') { + checkout scm + } + + stage('build') { + if(params.yarnInstall == true){ + sh "yarn config set registry https://mirrors.huaweicloud.com/repository/npm/" + sh "yarn config set disturl https://mirrors.huaweicloud.com/nodejs/" + sh "yarn config set electron_mirror https://mirrors.huaweicloud.com/electron/" + sh "yarn config set registry https://registry.npm.taobao.org" + sh "yarn config set disturl https://npm.taobao.org/dist" + sh "yarn config set electron_mirror https://npm.taobao.org/mirrors/electron/" + sh "yarn" + } + String backUrl = params.backUrl + if(params.activeProfile == 'prod'){ + sh "sed -i 's|VUE_APP_BACK_REST_URL_PLACE_HOLDER|${backUrl}|' ${workspace}/.env.prod" + sh "yarn build-prod" + }else{ + sh "sed -i 's|VUE_APP_BACK_REST_URL_PLACE_HOLDER|${backUrl}|' ${workspace}/.env.alpha" + sh "yarn build" + } + } + + stage('docker-login') { + withCredentials([usernamePassword(passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME', credentialsId: "${DOCKER_CREDENTIAL_ID}",)]) { + sh "echo '$DOCKER_PASSWORD' | docker login ${params.REGISTRY_URL} -u '$DOCKER_USERNAME' --password-stdin" + } + } + + stage('docker-build') { + sh " docker build -f jenkins/swarm/Dockerfile -t ${params.REGISTRY_URL}/new-sino/supplier-dispatch-h5:${params.NAMESPACE} ." + } + + stage('docker-push') { + sh "docker push ${params.REGISTRY_URL}/new-sino/supplier-dispatch-h5:${params.NAMESPACE}" + } + + stage('deploy') { + String yml = docker_service_param(params) + String serverName = "${params.NAMESPACE}_ns_supplier-dispatch-h5" + String ymlFile = "/data/swarm/${serverName}.yml" + String deploy = "ssh root@${params.deploy_server} \"touch ${ymlFile} && echo '''${yml}''' > ${ymlFile} && docker stack deploy -c ${ymlFile} ${serverName} --with-registry-auth\"" + echo deploy + sh deploy + } +} + + +def makeYML(params){ + def ymlTemp = ''' +version: \\"3.8\\" +services: + svc: + image: ${IMAGE} + environment: + - TZ=Asia/Shanghai + ports: + - '8031:8080' + deploy: + mode: replicated + replicas: ${replicas} + restart_policy: + condition: on-failure + delay: 5s + max_attempts: 3 + update_config: + order: start-first + + resources: + limits: + cpus: \\"${limitCpu}\\" + memory: ${limitMemory} + reservations: + cpus: \\"${reservationsCpu}\\" + memory: ${reservationsMemory} + placement: + constraints: + - "node.labels.${namespace}_${projectName}==1" +networks: + default: + name: ${namespace} + external: true +''' + def dockerComposeTemplate = new groovy.text.SimpleTemplateEngine().createTemplate(ymlTemp) + return dockerComposeTemplate.make(params) +} + + +def docker_service_param(_params){ + def params = [ + namespace: _params.NAMESPACE, + projectName: "supplier-dispatch-h5", + IMAGE: "${_params.REGISTRY_URL}/new-sino/supplier-dispatch-h5:${_params.NAMESPACE}", + profile: _params.profile, + replicas: 1, // 副本数量 + reservationsCpu: 0.1, // 保留cpu + limitCpu: 1, // 最大cpu + reservationsMemory: "300M", // 保留内存 + limitMemory: "500M" // 最大内存 + ] + echo "params ${params}" + + return makeYML(params) +} diff --git a/jenkins/swarm/nginx/default.conf b/jenkins/swarm/nginx/default.conf new file mode 100644 index 00000000..8c7eb6a2 --- /dev/null +++ b/jenkins/swarm/nginx/default.conf @@ -0,0 +1,12 @@ +server { + listen 0.0.0.0:8031; + location /h5/supplier/dispatch { + alias /app/; + try_files $uri $uri/ /h5/supplier/dispatch/index.html; + index index.html; + if ($request_filename ~ .*\.(htm|html)$) + { + add_header Cache-Control no-cache; + } + } +} \ No newline at end of file diff --git a/vue.config.js b/vue.config.js index b9cb9685..33b85107 100644 --- a/vue.config.js +++ b/vue.config.js @@ -9,7 +9,7 @@ module.exports = defineConfig({ transpileDependencies: true, // 基本路径 // publicPath: "./",s - // publicPath: process.env.NODE_ENV === 'production' ? '/h5/rescue': '/dev/h5/rescue', + publicPath: '/h5/supplier/dispatch', // publicPath: process.env.NODE_ENV === 'production' , // lintOnSave: process.env.NODE_ENV === 'development', devServer: {