Devops实践之K8S部署:Jenkins部署Vue和Php环境

2022-10-11 20:46:42 108 0
魁首哥

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

]]

}

}

收藏
分享
海报
0 条评论
108
上一篇:六星教育:为什么PHP架构师都喜欢Laravel框架?如何能熟练运用? 下一篇:PHP会话控制总结

相关文章

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码