1、项目架构


page_1 - 副本.png

  1. yygh-parent
  2. |---common //通用模块
  3. |---hospital-manage //医院后台 [9999]
  4. |---model //数据模型
  5. |---server-gateway //网关 [80]
  6. |---service //微服务层
  7. |-------service-cmn //公共服务 [8202]
  8. |-------service-hosp //医院数据服务 [8201]
  9. |-------service-order //预约下单服务 [8206]
  10. |-------service-oss //对象存储服务 [8205]
  11. |-------service-sms //短信服务 [8204]
  12. |-------service-statistics //统计服务 [8208]
  13. |-------service-task //定时服务 [8207]
  14. |-------service-user //会员服务 [8203]
  15. ====================================================================
  16. yygh-admin //医院管理后台 [9528]
  17. yygh-site //挂号平台 [3000]

2、中间件

中间件 集群内地址 外部访问地址
Nacos his-nacos.his:8848 http://139.198.165.238:30349/nacos
MySQL his-mysql.his:3306 139.198.165.238:31840
Redis his-redis.his:6379 139.198.165.238:31968
Sentinel his-sentinel.his:8080 http://139.198.165.238:31523/
MongoDB mongodb.his:27017 139.198.165.238:32693
RabbitMQ rabbitm-yp1tx4-rabbitmq.his:5672 139.198.165.238:30375
ElasticSearch his-es.his:9200 139.198.165.238:31300

3、流水线

1、项目地址

https://gitee.com/leifengyang/yygh-parent
https://gitee.com/leifengyang/yygh-admin
https://gitee.com/leifengyang/yygh-site

2、项目默认规则

  • 每个微服务项目,在生产环境时,会自动获取 微服务名-prod.yml 作为自己的核心配置文件
  • 每个微服务项目,在生产环境时,默认都是使用 8080 端口

3、生产与开发配置隔离

4、deploy.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app: service-cart
  6. name: service-cart
  7. namespace: his #一定要写名称空间
  8. spec:
  9. progressDeadlineSeconds: 600
  10. replicas: 1
  11. selector:
  12. matchLabels:
  13. app: service-cart
  14. strategy:
  15. rollingUpdate:
  16. maxSurge: 50%
  17. maxUnavailable: 50%
  18. type: RollingUpdate
  19. template:
  20. metadata:
  21. labels:
  22. app: service-cart
  23. spec:
  24. imagePullSecrets:
  25. - name: aliyun-docker-hub #提前在项目下配置访问阿里云的账号密码
  26. containers:
  27. - image: $REGISTRY/$ALIYUNHUB_NAMESPACE/service-cart
  28. readinessProbe:
  29. httpGet:
  30. path: /actuator/health
  31. port: 8080
  32. timeoutSeconds: 10
  33. failureThreshold: 30
  34. periodSeconds: 5
  35. imagePullPolicy: Always
  36. name: app
  37. ports:
  38. - containerPort: 8080
  39. protocol: TCP
  40. resources:
  41. limits:
  42. cpu: 300m
  43. memory: 600Mi
  44. terminationMessagePath: /dev/termination-log
  45. terminationMessagePolicy: File
  46. dnsPolicy: ClusterFirst
  47. restartPolicy: Always
  48. terminationGracePeriodSeconds: 30
  49. ---
  50. apiVersion: v1
  51. kind: Service
  52. metadata:
  53. labels:
  54. app: service-cart
  55. name: service-cart
  56. namespace: his
  57. spec:
  58. ports:
  59. - name: http
  60. port: 8080
  61. protocol: TCP
  62. targetPort: 8080
  63. selector:
  64. app: service-cart
  65. sessionAffinity: None
  66. type: ClusterIP

4、devops实战

1、修改maven让他从阿里云下载镜像

  • 使用admin登陆ks
  • 进入集群管理
  • 进入配置中心
  • 找到配置
    • ks-devops-agent
    • 修改这个配置。加入maven阿里云镜像加速地址

2、缓存机制

已经下载过的jar包,下一次流水线的启动,不会重复下载

3、部署到k8s集群

  • 给每一个微服务准备一个 deploy.yaml(k8s的部署配置文件)
  • 执行以下步骤

    • image.png
  • 传入 deploy.yaml 的位置就能部署

    • kubectl apply -f xxxx
  • 一定在项目里面(his,不是流水线项目),找到配置—密钥,配置一个阿里云的访问账号密码
    • image.png

4、前端项目

1、yygh-admin

  • npm run build 会生成dist目录,放到nginx的html下,即可运行

2、yygh-site

  • npm install --registry=https://registry.npm.taobao.org 安装项目依赖
  • npm run build 对项目打包,
  • 打包完成后把 .nuxt ,static, nuxt.config.js, package.json 这四个关键文件复制到 node环境。先npm install再使用npm run start 即可运行

3、思考

  • admin的镜像和site的镜像大小为何差距那么大?
    • 如何对镜像进行瘦身?

5、webhook

6.后端jenkinsfile文件

  1. pipeline {
  2. agent {
  3. node {
  4. label 'maven'
  5. }
  6. }
  7. stages {
  8. stage('拉取代码') {
  9. agent none
  10. steps {
  11. container('maven') {
  12. git(url: 'https://gitee.com/leifengyang/yygh-parent.git', credentialsId: 'gitee-id', branch: 'master', changelog: true, poll: false)
  13. sh 'ls -al'
  14. }
  15. }
  16. }
  17. stage('项目编译') {
  18. agent none
  19. steps {
  20. container('maven') {
  21. sh 'ls'
  22. sh 'mvn clean package -Dmaven.test.skip=true'
  23. sh 'ls hospital-manage/target'
  24. }
  25. }
  26. }
  27. stage('default-2') {
  28. parallel {
  29. stage('构建hospital-manage镜像') {
  30. agent none
  31. steps {
  32. container('maven') {
  33. sh 'ls hospital-manage/target'
  34. sh 'docker build -t hospital-manage:latest -f hospital-manage/Dockerfile ./hospital-manage/'
  35. }
  36. }
  37. }
  38. stage('构建server-gateway镜像') {
  39. agent none
  40. steps {
  41. container('maven') {
  42. sh 'ls server-gateway/target'
  43. sh 'docker build -t server-gateway:latest -f server-gateway/Dockerfile ./server-gateway/'
  44. }
  45. }
  46. }
  47. stage('构建service-cmn镜像') {
  48. agent none
  49. steps {
  50. container('maven') {
  51. sh 'ls service/service-cmn/target'
  52. sh 'docker build -t service-cmn:latest -f service/service-cmn/Dockerfile ./service/service-cmn/'
  53. }
  54. }
  55. }
  56. stage('构建service-hosp镜像') {
  57. agent none
  58. steps {
  59. container('maven') {
  60. sh 'ls service/service-hosp/target'
  61. sh 'docker build -t service-hosp:latest -f service/service-hosp/Dockerfile ./service/service-hosp/'
  62. }
  63. }
  64. }
  65. stage('构建service-order镜像') {
  66. agent none
  67. steps {
  68. container('maven') {
  69. sh 'ls service/service-order/target'
  70. sh 'docker build -t service-order:latest -f service/service-order/Dockerfile ./service/service-order/'
  71. }
  72. }
  73. }
  74. stage('构建service-oss镜像') {
  75. agent none
  76. steps {
  77. container('maven') {
  78. sh 'ls service/service-oss/target'
  79. sh 'docker build -t service-oss:latest -f service/service-oss/Dockerfile ./service/service-oss/'
  80. }
  81. }
  82. }
  83. stage('构建service-sms镜像') {
  84. agent none
  85. steps {
  86. container('maven') {
  87. sh 'ls service/service-sms/target'
  88. sh 'docker build -t service-sms:latest -f service/service-sms/Dockerfile ./service/service-sms/'
  89. }
  90. }
  91. }
  92. stage('构建service-statistics镜像') {
  93. agent none
  94. steps {
  95. container('maven') {
  96. sh 'ls service/service-statistics/target'
  97. sh 'docker build -t service-statistics:latest -f service/service-statistics/Dockerfile ./service/service-statistics/'
  98. }
  99. }
  100. }
  101. stage('构建service-task镜像') {
  102. agent none
  103. steps {
  104. container('maven') {
  105. sh 'ls service/service-task/target'
  106. sh 'docker build -t service-task:latest -f service/service-task/Dockerfile ./service/service-task/'
  107. }
  108. }
  109. }
  110. stage('构建service-user镜像') {
  111. agent none
  112. steps {
  113. container('maven') {
  114. sh 'ls service/service-user/target'
  115. sh 'docker build -t service-user:latest -f service/service-user/Dockerfile ./service/service-user/'
  116. }
  117. }
  118. }
  119. }
  120. }
  121. stage('default-3') {
  122. parallel {
  123. stage('推送hospital-manage镜像') {
  124. agent none
  125. steps {
  126. container('maven') {
  127. withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
  128. sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
  129. sh 'docker tag hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
  130. sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
  131. }
  132. }
  133. }
  134. }
  135. stage('推送server-gateway镜像') {
  136. agent none
  137. steps {
  138. container('maven') {
  139. withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
  140. sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
  141. sh 'docker tag server-gateway:latest $REGISTRY/$DOCKERHUB_NAMESPACE/server-gateway:SNAPSHOT-$BUILD_NUMBER'
  142. sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/server-gateway:SNAPSHOT-$BUILD_NUMBER'
  143. }
  144. }
  145. }
  146. }
  147. stage('推送service-cmn镜像') {
  148. agent none
  149. steps {
  150. container('maven') {
  151. withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
  152. sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
  153. sh 'docker tag service-cmn:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-cmn:SNAPSHOT-$BUILD_NUMBER'
  154. sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/service-cmn:SNAPSHOT-$BUILD_NUMBER'
  155. }
  156. }
  157. }
  158. }
  159. stage('推送service-hosp镜像') {
  160. agent none
  161. steps {
  162. container('maven') {
  163. withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
  164. sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
  165. sh 'docker tag service-hosp:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-hosp:SNAPSHOT-$BUILD_NUMBER'
  166. sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/service-hosp:SNAPSHOT-$BUILD_NUMBER'
  167. }
  168. }
  169. }
  170. }
  171. stage('推送service-order镜像') {
  172. agent none
  173. steps {
  174. container('maven') {
  175. withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
  176. sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
  177. sh 'docker tag service-order:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-order:SNAPSHOT-$BUILD_NUMBER'
  178. sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/service-order:SNAPSHOT-$BUILD_NUMBER'
  179. }
  180. }
  181. }
  182. }
  183. stage('推送service-oss镜像') {
  184. agent none
  185. steps {
  186. container('maven') {
  187. withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
  188. sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
  189. sh 'docker tag service-oss:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-oss:SNAPSHOT-$BUILD_NUMBER'
  190. sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/service-oss:SNAPSHOT-$BUILD_NUMBER'
  191. }
  192. }
  193. }
  194. }
  195. stage('推送service-sms镜像') {
  196. agent none
  197. steps {
  198. container('maven') {
  199. withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
  200. sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
  201. sh 'docker tag service-sms:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-sms:SNAPSHOT-$BUILD_NUMBER'
  202. sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/service-sms:SNAPSHOT-$BUILD_NUMBER'
  203. }
  204. }
  205. }
  206. }
  207. stage('推送service-statistics镜像') {
  208. agent none
  209. steps {
  210. container('maven') {
  211. withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
  212. sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
  213. sh 'docker tag service-statistics:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-statistics:SNAPSHOT-$BUILD_NUMBER'
  214. sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/service-statistics:SNAPSHOT-$BUILD_NUMBER'
  215. }
  216. }
  217. }
  218. }
  219. stage('推送service-task镜像') {
  220. agent none
  221. steps {
  222. container('maven') {
  223. withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
  224. sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
  225. sh 'docker tag service-task:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-task:SNAPSHOT-$BUILD_NUMBER'
  226. sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/service-task:SNAPSHOT-$BUILD_NUMBER'
  227. }
  228. }
  229. }
  230. }
  231. stage('推送service-user镜像') {
  232. agent none
  233. steps {
  234. container('maven') {
  235. withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
  236. sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
  237. sh 'docker tag service-user:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-user:SNAPSHOT-$BUILD_NUMBER'
  238. sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/service-user:SNAPSHOT-$BUILD_NUMBER'
  239. }
  240. }
  241. }
  242. }
  243. }
  244. }
  245. stage('default-4') {
  246. parallel {
  247. stage('hospital-manage - 部署到dev环境') {
  248. agent none
  249. steps {
  250. kubernetesDeploy(configs: 'hospital-manage/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
  251. }
  252. }
  253. stage('server-gateway - 部署到dev环境') {
  254. agent none
  255. steps {
  256. kubernetesDeploy(configs: 'server-gateway/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
  257. }
  258. }
  259. stage('service-cmn - 部署到dev环境') {
  260. agent none
  261. steps {
  262. kubernetesDeploy(configs: 'service/service-cmn/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
  263. }
  264. }
  265. stage('service-hosp - 部署到dev环境') {
  266. agent none
  267. steps {
  268. kubernetesDeploy(configs: 'service/service-hosp/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
  269. }
  270. }
  271. stage('service-order - 部署到dev环境') {
  272. agent none
  273. steps {
  274. kubernetesDeploy(configs: 'service/service-order/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
  275. }
  276. }
  277. stage('service-oss - 部署到dev环境') {
  278. agent none
  279. steps {
  280. kubernetesDeploy(configs: 'service/service-oss/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
  281. }
  282. }
  283. stage('service-sms - 部署到dev环境') {
  284. agent none
  285. steps {
  286. kubernetesDeploy(configs: 'service/service-sms/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
  287. }
  288. }
  289. stage('service-statistics - 部署到dev环境') {
  290. agent none
  291. steps {
  292. kubernetesDeploy(configs: 'service/service-statistics/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
  293. }
  294. }
  295. stage('service-task - 部署到dev环境') {
  296. agent none
  297. steps {
  298. kubernetesDeploy(configs: 'service/service-task/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
  299. }
  300. }
  301. stage('service-user - 部署到dev环境') {
  302. agent none
  303. steps {
  304. kubernetesDeploy(configs: 'service/service-user/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
  305. }
  306. }
  307. }
  308. }
  309. //1、配置全系统的邮件: 全系统的监控
  310. //2、修改ks-jenkins的配置,里面的邮件; 流水线发邮件
  311. stage('发送确认邮件') {
  312. agent none
  313. steps {
  314. mail(to: '17512080612@163.com', subject: '构建结果', body: "构建成功了 $BUILD_NUMBER")
  315. }
  316. }
  317. }
  318. environment {
  319. DOCKER_CREDENTIAL_ID = 'dockerhub-id'
  320. GITHUB_CREDENTIAL_ID = 'github-id'
  321. KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
  322. REGISTRY = 'registry.cn-hangzhou.aliyuncs.com'
  323. DOCKERHUB_NAMESPACE = 'lfy_hello'
  324. GITHUB_ACCOUNT = 'kubesphere'
  325. APP_NAME = 'devops-java-sample'
  326. ALIYUNHUB_NAMESPACE = 'lfy_hello'
  327. }
  328. parameters {
  329. string(name: 'TAG_NAME', defaultValue: '', description: '')
  330. }
  331. }

dockerfile文件

FROM openjdk:8-jdk
LABEL maintainer=leifengyang


#启动自行加载   服务名-prod.yml配置
ENV PARAMS="--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.file-extension=yml"
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

COPY target/*.jar /app.jar
EXPOSE 8080

#
ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8  -Djava.security.egd=file:/dev/./urandom -jar /app.jar ${PARAMS}"]

前端jenkinsfile文件(vue+elementui)

pipeline {
    agent {
        node {
            label 'nodejs'
        }

    }
    stages {
        stage('拉取代码') {
            agent none
            steps {
                container('nodejs') {
                    git(url: 'https://gitee.com/leifengyang/yygh-admin.git', credentialsId: 'gitee-id', branch: 'master', changelog: true, poll: false)
                    sh 'ls -al'
                }

            }
        }

        stage('项目编译') {
            agent none
            steps {
                container('nodejs') {
                    sh 'npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/'
                    sh 'npm install --registry=https://registry.npm.taobao.org'
                    sh 'npm run build'
                    sh 'ls'
                }

            }
        }

        stage('构建镜像') {
            agent none
            steps {
                container('nodejs') {
                    sh 'ls'
                    sh 'docker build -t yygh-admin:latest -f Dockerfile  .'
                }

            }
        }

        stage('推送镜像') {
            agent none
            steps {
                container('nodejs') {
                    withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                        sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                        sh 'docker tag yygh-admin:latest $REGISTRY/$DOCKERHUB_NAMESPACE/yygh-admin:SNAPSHOT-$BUILD_NUMBER'
                        sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/yygh-admin:SNAPSHOT-$BUILD_NUMBER'
                    }

                }

            }
        }

        stage('部署到dev环境') {
            agent none
            steps {
                kubernetesDeploy(configs: 'deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
            }
        }

        //1、配置全系统的邮件:                   全系统的监控
        //2、修改ks-jenkins的配置,里面的邮件;   流水线发邮件
        stage('发送确认邮件') {
            agent none
            steps {
                mail(to: '17512080612@163.com', subject: 'yygh-admin构建结果', body: "构建成功了  $BUILD_NUMBER")
            }
        }

    }
    environment {
        DOCKER_CREDENTIAL_ID = 'dockerhub-id'
        GITHUB_CREDENTIAL_ID = 'github-id'
        KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
        REGISTRY = 'registry.cn-hangzhou.aliyuncs.com'
        DOCKERHUB_NAMESPACE = 'lfy_hello'
        GITHUB_ACCOUNT = 'kubesphere'
        APP_NAME = 'devops-java-sample'
        ALIYUNHUB_NAMESPACE = 'lfy_hello'
    }
}

前端dockerfile文件
需要nginx作为基础镜像

FROM nginx

#将dist目录内容复制到nginx容器html内部
COPY dist /usr/share/nginx/html/

EXPOSE 80

nuxt的jenkinsfile文件

pipeline {
    agent {
        node {
            label 'nodejs'
        }

    }
    stages {
        stage('拉取代码') {
            agent none
            steps {
                container('nodejs') {
                    git(url: 'https://gitee.com/leifengyang/yygh-site.git', credentialsId: 'gitee-id', branch: 'master', changelog: true, poll: false)
                    sh 'ls -al'
                }

            }
        }

        stage('项目编译') {
            agent none
            steps {
                container('nodejs') {
                    sh 'ls'
                    sh 'npm install --registry=https://registry.npm.taobao.org'
                    sh 'npm run build'
                }

            }
        }

        stage('构建镜像') {
            agent none
            steps {
                container('nodejs') {
                    sh 'ls '
                    sh 'docker build -t yygh-site:latest -f Dockerfile  .'
                }

            }
        }

        stage('推送镜像') {
            agent none
            steps {
                container('nodejs') {
                    withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                        sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                        sh 'docker tag yygh-site:latest $REGISTRY/$DOCKERHUB_NAMESPACE/yygh-site:SNAPSHOT-$BUILD_NUMBER'
                        sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/yygh-site:SNAPSHOT-$BUILD_NUMBER'
                    }

                }

            }
        }

        stage('部署到dev环境') {
            agent none
            steps {
                kubernetesDeploy(configs: 'deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
            }
        }

        //1、配置全系统的邮件:                   全系统的监控
        //2、修改ks-jenkins的配置,里面的邮件;   流水线发邮件
        stage('发送确认邮件') {
            agent none
            steps {
                mail(to: '17512080612@163.com', subject: 'yygh-site构建结果', body: "构建成功了  $BUILD_NUMBER")
            }
        }

    }
    environment {
        DOCKER_CREDENTIAL_ID = 'dockerhub-id'
        GITHUB_CREDENTIAL_ID = 'github-id'
        KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
        REGISTRY = 'registry.cn-hangzhou.aliyuncs.com'
        DOCKERHUB_NAMESPACE = 'lfy_hello'
        GITHUB_ACCOUNT = 'kubesphere'
        APP_NAME = 'devops-java-sample'
        ALIYUNHUB_NAMESPACE = 'lfy_hello'
    }
}

nuxt的dockerfile文件
因为nuxt是一个服务器,所以基础镜像不依赖于nginx

FROM node:14.17.6

WORKDIR /app
#把.nuxt目录下的所有内容复制到/app/.nuxt/
COPY .  /app/

#安装核心依赖  npm cache clean -f
RUN ["npm","install","--registry=https://registry.npm.taobao.org"]
RUN ["npm","run","build"]
EXPOSE 3000
CMD ["npm", "run", "start"]