网站首页 > 技术文章 正文
Devops是一套公司技术治理的理念,想了解Devops概念,自行搜索相关知识学习,K8S在Devops理念中占有一定的地位,因为开发完成的系统需要进行部署,尤其以中台为思想,微服务为主体的系统,采用K8S是最理想的部署环境,以POD为单位的容器,无需关心所在主机的位置,K8S可以进行水平扩展,把加入到环境中的主机看成一个整体,根据POD所需的资源要求,进行分配,部署人员只需提供需求,一切分配由K8S统一安排。
本文章介绍Jenkins部署前端采用Vue和后端采用Php环境的系统。
了解系统开发环境
开发环境涉及源码管理、自动化构建、镜像生成、镜像管理、容器部署。
源码管理采用gitlab开源系统,开发人员通过git工具提交和获取源码;自动化构建采用Jenkins开源系统进行构建,每个项目源码根目录中存放Jenkinsfile文件,在该文件中进行构建脚本编写;镜像生成采用Docker技术,每个项目源码根目录中存放Dockerfile文件,在该文件中进行镜像生成的脚本编写;镜像管理采用Harbor开源系统,Harbor可以管理镜像,也可以管理Helm包;容器部署采用K8S框架,通过Helm工具进行部署。
由于目前做的系统都是以项目形式,不是以平台方式,客户的环境都不相同,以完成项目为目标,不追求部署的完美性,所以部署到客户环境,就通过FTP上传到正式环境,待以后再做优化。
开发及部署关系如下图所示。
开发及部署关系图
开发人员获取和上传代码
开发人员使用分布式的git源码管理工具进行代码的获取和上传,为了源码目录的规范性,在源码的根目录创建有back、front、char、Dockerfile和Jenkinsfile三个目录和两个文件。back目录存放后端源码,本章中采用Php做为后端语言;front为前端语言,目前涉及的项目都前后端分离,统一使用Vue做为前端开发语言;char目录存放helm部署的char包;Dockerfile为生成docker镜像的脚本文件;Jenkinsfile为自动化部署的脚本文件。
如何进行自动化构建
自动化构建需要搭建Jenkins环境,并为每个项目创建流水线任务,手动在Jenkinsfile文件中编写脚本,本章中脚本分为Vue代码编译打包、镜像生成、上传到镜像库中、使用Helm工具K8S部署、发送构建结果邮件和FTP上传打包文件。
Vue代码编译打包使用npm命令进行环境安装和打包,片段脚本如下。由于Vue源码在frong目录下,所以要加上dir('front/')语句。
stage('NPM Build') { steps { script { echo "代码编译打包" dir('front/') { sh 'npm install --unsafe-perm=true --allow-root' sh 'npm run build' } } } } |
镜像生成需要有docker环境,docker生成镜像时,会自动查找Dockerfile文件,根据该文件中的内容打包生成docker镜像,Jenkins脚本片段如下。使用docker build进行镜像生成,docker命令相关知识自行学习。
stage('Docker Build') { steps { script { echo "生成镜像" def pName = "${projectName}" def list = pName.split('_') dockerName = list[0] taget_image="${dockerName}:${tag}" sh "docker build --build-arg app=${appName} -t ${taget_image} ." sh "docker tag ${taget_image} ${harbor_server}/${harbor_project}/${dockerName}" sh "docker tag ${taget_image} ${harbor_server}/${harbor_project}/${dockerName}:${commitHash}" } } } |
Dockerfile脚本如下。
FROM php:5.6-apache MAINTAINER winyeahs RUN apt-get update RUN apt-get install -y libwebp-dev libfreetype6-dev libmcrypt-dev libjpeg-dev libpng-dev zlib1g-dev RUN docker-php-ext-configure gd --with-webp-dir=/usr/include/webp --with-jpeg-dir=/usr/include --with-png-dir=/usr/include --with-freetype-dir=/usr/include/freetype2 RUN docker-php-ext-install gd RUN docker-php-ext-install mysql COPY ./back /var/www/html/ COPY ./front/dist /var/www/html/ RUN chmod -R 777 /var/www/html/gthmmc/template_c/ RUN chmod -R 777 /var/www/html/gthmmc/cache/ RUN service apache2 restart |
上传到镜像库Harbor中,Harbor环境的搭建参阅相关知识,Jenkins脚本片段如下。使用docker login命令登录到Harhor,再通过docker push命令上传镜像到Harbor库中。
stage('Horbor Upload') { steps { script { docker_path="${WORKSPACE}" echo "登录Harbor" sh "cd ${docker_path}" sh "docker login ${harbor_server} -u ${harbor_account} -p ${harbor_password}" echo "生成镜像并推送到Harbor" def pName = "${projectName}" def list = pName.split('_') dockerName = list[0] sh "docker push ${harbor_server}/${harbor_project}/${dockerName}:latest" sh "docker push ${harbor_server}/${harbor_project}/${dockerName}:${commitHash}" echo "删除本地镜像" sh "docker rmi -f \$(docker images|grep ${dockerName}|grep ${tag}|awk '{print \$3}'|head -n 1)" } } } |
使用Helm工具K8S部署,Helm通过chart配置包进行容器的部署,镜像相当于类,容器相当于对象,Jenkins脚本片段如下。通过helm upgrade进行K8S的POD升级,在upgrade之前需要进行helm install myapp chart/操作,由于部署时每次都install会出错,需要使用upgrade命令进行升级操作,所以install需要手动执行一次。
stage('Helm Deploy') { steps { echo "部署到K8s" script { //根据不同环境将服务部署到不同的namespace下,这里使用分支名称 def pName = "${projectName}" def list = pName.split('_') dockerName = list[0] sh "/usr/local/bin/helm repo update" sh "/usr/local/bin/helm package chart" sh "/usr/local/bin/helm push *.tgz mychart -u ${harbor_account} -p ${harbor_password}" sh "/usr/local/bin/helm upgrade ${dockerName} chart/ --set commitHash=${commitHash}" } } } |
发送构建结果邮件,Jenkins脚本片段如下。
post { success { emailext ( subject: "项目构建成功: 任务 '${env.JOB_NAME} [${env.BUILD_NUMBER}]'", body: """ 任务构建成功: 任务 '${env.JOB_NAME} [${env.BUILD_NUMBER}]': Check console output at "${env.JOB_NAME} [${env.BUILD_NUMBER}]" """, to: "xxxxxx@qq.com", from: " xxxxxx @qq.com" ) } failure { emailext ( subject: "项目构建失败: 任务 '${env.JOB_NAME} [${env.BUILD_NUMBER}]'", body: """ 项目构建失败: 任务 '${env.JOB_NAME} [${env.BUILD_NUMBER}]': Check console output at "${env.JOB_NAME} [${env.BUILD_NUMBER}]" """, to: " xxxxxx @qq.com", from: " xxxxxx @qq.com" ) } } |
FTP上传打包文件,Jenkins脚本片段如下。
post { success { ftpPublisher alwaysPublishFromMaster: false, continueOnError: true, failOnError: false, masterNodeName: '', paramPublish: null, publishers: [[ configName: 'amobiletour_c', transfers: [[ asciiMode: false, cleanRemote: false, excludes: '', flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'back', sourceFiles: 'back/**' ]], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false ]] ftpPublisher alwaysPublishFromMaster: false, continueOnError: true, failOnError: false, masterNodeName: '', paramPublish: null, publishers: [[ configName: 'amobiletour_c', transfers: [[ asciiMode: false, cleanRemote: false, excludes: '', flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'front/dist', sourceFiles: 'front/dist/**' ]], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false ]] } } |
- 上一篇: 「按键精灵」脚本崩溃闪退重新启动
- 下一篇: 触摸屏如何用宏脚本和PLC时间同步
猜你喜欢
- 2024-12-28 3步教你,百度网盘下载不限速,比SVIP速度还要快
- 2024-12-28 魔兽怀旧服,重复交任务宏,冲声望必备
- 2024-12-28 「安卓按键」怎么让脚本可以领取免费测试卡
- 2024-12-28 写作4年挣50万,推荐6个新手容易过稿的投稿平台
- 2024-12-28 黑客大神用什么杀毒?Windows自带的就够,只是加了亿点微小强化
- 2024-12-28 微软阻止第三方下载 Windows 镜像?
- 2024-12-28 B站视频下载详细教程 b站咋样下载视频
- 2024-12-28 从0开始学习Jmeter脚本编写 jmeter打开脚本报错
- 2024-12-28 网站渗透总结之Getshell用法大全 网站渗透技术
- 2024-12-28 如何通过C脚本在WinCC画面中的“文本”不再那么单调?
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)