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 ]] } } |
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~