服务后台通过GitlabCI完成FlaskwebService服务代码风格检查、单元测试、打包、发布到k8s环境,我们也将在.gitlab-ci.yml文件配置根据branch和tag的匹配执行相应的操作任务。FlaskwebService是一个带有web登录界面的测试代码服务。服务运行在5000端口,下面是DockerfileFROMpython:3.4COPY./skeletonWORKDIR/skeletonRUNpipinstall-rrequirements.txt-ihttp://pypi。douban.com/simple/--trusted-hostpypi.douban.com#配置pip源,加快下载EXPOSE5000ENTRYPOINT["sh","scripts/dev.sh"]definition.gitlab-ci.yml并准备project.gitlab-ci.yml文件,这个文件有点长,可以通过远程调用模板库优化配置。这里就不说了:stages:#这个分为五个阶段,对应的环节依次执行-style-test-release-review-deploypep8:#pep8是自定义命名的jobsimage:python:2.7#在imagerunningstage指定运行以下脚本块指令的容器环境:style#declarewhichpep8job属于Runscriptinthestagestage:#这个stage执行的操作其实就像在终端执行命令.-pipinstall-ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.comtox-tox-epep8#使用tox命令查看pep8代码格式和规范,配置文件为tox下当前的项目。iniunittest-py2.7:image:python:2.7stage:testscript:-pipinstall-ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.comtox-tox-epy27#指定使用py27虚拟环境unittest-py3.4:image:python:3.4stage:testscript:-pipinstall-ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.comtox-tox-epy34#指定使用py34虚拟环境buildimage:image:docker:latest#这个链接需要构建镜像,需要dockerbinary命令,所以指定一个docker镜像变量:#传递给buildimagejob的变量DOCKER_DRIVER:overlayDOCKER_HOST:tcp://localhost:2375#与服务通信指定容器服务:-name:docker:17.03-dindcommand:-"--registry-mirror=https://*****.mirror.aliyuncs.com"#配置镜像加速。登录私有镜像仓库时,如果仓库的证书不受信任,可以添加`--insecure-registry=*****`选项stage:releasescript:-dockerlogin-u"${CI_REGISTRY_USER}"-p"${CI_REGISTRY_PASSWORD}"${CI_REGISTRY_REPO_URL}#登录私有或共享镜像仓库-dockerbuild-t"${CI_REGISTRY_IMAGE}:latest"-f./Dockerfile.#构建镜像-dockertag"${CI_REGISTRY_IMAGE}:latest""${CI_REGISTRY_REPO_URL}/${CI_REGISTRY_NAMESPACE}/${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}"#按镜像到镜像仓库的地址-test!-z"${CI_COMMIT_TAG}"&&dockerpush"${CI_REGISTRY_REPO_URL}/${CI_REGISTRY_NAMESPACE}/${CI_REGISTRY_IMAGE}:latest"#判断CI_COMMIT_TAG是否存在-dockerpush"${CI_REGISTRY_REPO_URL}/${CI_REGISTRY_NAMESPACE}/${CI_CI_CI_IMAGE}${CI_CI_CI_IMAGE}{CI_COMMIT_REF_NAME}"#推送到镜像仓库deploy_review:image:bitnami/kubectl#这个环节需要创建k8s资源,需要kubectl二进制命令stage:reviewonly:-branches#这个stage只对branchesexcept:-tags有效#Createtagsstageisnotexecutedenvironment:#定义将部署作业的环境,如果不指定,keyword(name,url,kubernetes...)name:devurl:https://dev-gitlab-k8s-demo。*****.cn-beijing.alicontainer.comon_stop:stop_review#定义停止时执行的jobsscript:-kubectlversion-cdmanifests/-sed-i"s/__CI_ENVIRONMENT_SLUG__/${CI_ENVIRONMENT_SLUG}/"deployment.yamlingress.yamlservice.yaml-sed-i"s/__VERSION__/${CI_COMMIT_REF_NAME}/"deployment.yamlingress.yamlservice.yaml-|ifkubectlapply-fdeployment.yaml|grep-qunchanged;thenecho"=>Patchingdeploymenttoforceimageupdate."kubectlpatch-fdeployment.yaml-p"{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"ci-last-updated\":\"$(date+'%s')\"}}}}}"elseecho"=>Deploymentapplyhaschangedtheobject,noneedtoforceimageupdate。jobNomorecodecheckoutwhen:manual#手动触发是否继续执行only:-branchesexcept:-master#master分支和tags发生变化除外-tagsenvironment:name:devaction:stopscript:-kubectlversion-kubectldeleteing-lref=${CI_ENVIRONMENT_SLUG}-kubectldeleteall-lref=${CI_ENVIRONMENT_SLUG}deploy:image:bitnami/kubectlstage:deployenvironment:name:liveurl:https://${$CI_ENVIRONMENT_SLUG}.****.cn-beijing.alicontainer.com#服务访问域名只:-tagswhen:manualscript:-kubectlversion-cdmanifests/-sed-i"s/__CI_ENVIRONMENT_SLUG__/${CI_ENVIRONMENT_SLUG}/"deployment.yamlingress.yamlservice.yaml-sed-i"s/__VERSION__/${CI_COMMIT_REF_NAME}/"deployment.yamlingress.yamlservice.yaml-kubectlapply-fdeployment.yamlservice.yamlingress.yaml-kubectlrolloutstatus-fdeployment。yaml-kubectlgetall,ing-lref=${CI_ENVIRONMENT_SLUG}以上是持续部署Gitlab运行Flaskweb服务的配置文件。配置文件主要包含.gitlab-ci.yaml[1]的语法,很多配置环境需要仔细阅读和掌握变量[2]才能玩好CI.K8s资源对象声明如上所见,资源定义文件k8s的在project.gitlab-ci.yml同级目录manifests🐳👉lsREADME.mddeployment.yamlingress.yamlservice.yaml服务部署配置文件deployment.yaml---apiVersion:apps/v1kind:Deploymentmetadata:name:gitlab-k8s-demo-__CI_ENVIRONMENT_SLUG__namespace:devopslabels:app:gitlab-k8s-demoref:__CI_ENVIRONMENT_SLUG__track:stablespec:replicas:2selector:matchLabels:app:gitlab-k8s-demoref:__CI_ENVIRONMENT_SLUG__template:metadata:labels:app:gitlab-k8s-demoref:__CI_ENVIRONMENT_SLUG__track:stablespec:imagePullSecrets:-name:myregistrycontainers:-name:appimage:registry.cn-beijing.aliyuncs.com/*****/gitlab-ci-flaskapp-test:__VERSION__#前面是镜像的地址PullPolicy:Alwaysports:-name:webprotocol:TCPcontainerPort:5000#flaskwebservice暴露端口livenessProbe:httpGet:path:/port:5000initialDelaySeconds:3timeoutSeconds:2readinessProbe:httpGet:path:/port:5000initialDelaySeconds:3timeoutSeconds:2Flaskwebserviceexposedsvcresourceobjectdeclaration:apiVersion:v1kind:Servicemetadata:name:gitlab-k8s-demo-__CI_ENVIRONMENT_SLUG__namespace:devopslabels:app:gitlab-k8s-demoref:__CI_ENVIRONMENT_SLUG__anpenotations:iotrue普罗米修斯。/port:"5000"prometheus.io/scheme:"http"prometheus.io/path:"/"spec:type:ClusterIPports:-name:http-metricsport:5000protocol:TCPselector:app:gitlab-k8s-demoref:__CI_ENVIRONMENT_SLUG__FlaskWeb服务暴露在外网工作权限资源对象入口声明:---apiVersion:extensions/v1beta1kind:Ingressmetadata:name:gitlab-k8s-demo-__CI_ENVIRONMENT_SLUG__namespace:devopslabels:app:gitlab-k8s-demoref:__CI_ENVIRONMENT_SLUG__annotations:nginx.ingress.kubernetes.io/service-weight:''spec:rules:-host:__CI_ENVIRONMENT_SLUG__-gitlab-k8s-demo.****.cn-beijing.alicontainer.comhttp:paths:-path:/backend:serviceName:gitlab-k8s-demo-__CI_ENVIRONMENT_SLUG__servicePort:5000配置Runner环境变量上方的.gitlab-ci.yml中引用的变量是从这里配置的。变量分为项目变量和gitlab组级别。具体在Gitlab平台上根据需要配置Runner环境变量。配置完成后,可以在master分支中查看修改的效果Push代码到master分支,gitlab会自动创建一个pipeline交给gitlabrunner。当master分支发生变化时,CI效果图如下:master分支发生变化时GitlabCIPipeline切换到新的分支去feature-01看CI会执行哪些作业,如下图,可以是通过only/except在.gitlab-ci.yaml中按需定义。当其他分支发生变化时,需要在Review链接中手动触发GitlabCIPipeline的其他分支。当结果没有问题时,可以手动触发stop_review删除部署测试服务。当其他分支发生变化时,deploy_review和stop_reviewdeploy_reviewdeploy_review任务执行日志stop_review然后我们手动触发stop_review删除刚刚部署的没用的测试环境stop_review执行日志创建标签gittagv2.0🐳👉gitpushorigin--tagsTotal0(delta0),reused0(delta0),pack-reused0到http://code.*******.cn-beijing.alicontainer.com/root/flask-ci-demo.git*[newtag]v2.0->v2.0时新tag被push到gitlab,会触发一个pipeline去匹配那个tag的jobs在创建Tags后触发的GitlabCIPipeline,说明是一个比较稳定的版本,可以上线。稳定版Tags上线后,查看创建服务的日志,查看服务的运行状态。然后我们访问服务看看是否ok使用Flaskweb服务正常登录后,界面可以正常登录,出现如下显示说明服务运行成功。考到这里,基本上是通过实际操作把.gitlab-ci.yml中配置的各种指令的含义解释清楚,并通过GitlabCIpipeline实践持续集成、持续部署、持续交付。有什么不明白的可以留言,我们可以一起交流学习。参考[1]gitlab-ci参考:https://docs.gitlab.com/ee/ci/yaml/README.html[2]runner变量:https://docs.gitlab.com/ee/ci/variables/自述文件
