灵龙 发表于 2021-8-18 16:00:39

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

Devops是一套公司技能治理的理念,想了解Devops概念,自行搜刮相干知识学习,K8S在Devops理念中占有一定的地位,因为开发完成的系统必要进行摆设,尤其以中台为头脑,微服务为主体的系统,采用K8S是最理想的摆设情况,以POD为单位的容器,无需关心所在主机的位置,K8S可以进行水平扩展,把加入到情况中的主机看成一个整体,根据POD所需的资源要求,进行分配,摆设人员只需提供需求,一切分配由K8S同一安排。
本文章先容Jenkins摆设前端采用Vue和后端采用Php情况的系统。
了解系统开发情况
开发情况涉及源码管理、自动化构建、镜像天生、镜像管理、容器摆设。
源码管理采用gitlab开源系统,开发人员通过git工具提交和获取源码;自动化构建采用Jenkins开源系统进行构建,每个项目源码根目次中存放Jenkinsfile文件,在该文件中进行构建脚本编写;镜像天生采用Docker技能,每个项目源码根目次中存放Dockerfile文件,在该文件中进行镜像天生的脚本编写;镜像管理采用Harbor开源系统,Harbor可以管理镜像,也可以管理Helm包;容器摆设采用K8S框架,通过Helm工具进行摆设。
由于目前做的系统都是以项目情势,不是以平台方式,客户的情况都不相同,以完成项目为目标,不寻求摆设的完善性,所以摆设到客户情况,就通过FTP上传到正式情况,待以后再做优化。
开发及摆设关系如下图所示。
https://p3.toutiaoimg.com/large/pgc-image/f4fc3539ab1b45f8a2915c0510b46f6e
开发及摆设关系图
开发人员获取和上传代码
开发人员使用分布式的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
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
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
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: "[email protected]",
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
]]
}
}
页: [1]
查看完整版本: Devops实践之K8S部署:Jenkins部署Vue和Php环境