• 自动镜像打包&&互联网企业规范化上线流程 —— k8s从入门到高并发系列教程 (六)


            前文介绍了镜像的制作以及把项目代码和根据环境需要的配置文件手动打包生成镜像。然而在实际企业当中,当分支即将被合并或已经被合并到特定环境后,是由 cicj 流程监听分支合并事件,根据情况决定对代码进行检查是否允许合并,当允许合并后,启动一个基于docker的镜像,把项目源代码克隆进来后,结合对应环境的配置信息,利用企业的基础镜像,打包成一个可以在线上部署的镜像,并推送到企业的私有镜像仓库中。

    微服务基础镜像 docker-phpfpm && docker-cli 项目

            微服务基础镜像的dockerfile文件参照这篇教程:nginx-php镜像安装常用软件 —— k8s从入门到高并发系列教程 (三)由运维管理,独立为 docker-phpfpm 项目。当dockerfile文件变更并合并到master分支时,由gitlab 的 cicj自动打包生成新的镜像并放到企业的私有镜像仓库。

            .gitlab-ci.yml 文件内容如下

    1. stages:
    2. - build
    3. build-docker:
    4. stage: build
    5. image: docker
    6. only:
    7. - main
    8. script:
    9. - docker login $docker_url -u $docker_user -p $docker_password
    10. - docker build -t docker/php-fpm:v7.2 .
    11. - docker tag docker/php-fpm:v7.2 $docker_url/mustafa_public/php-fpm:v7.2
    12. - docker push $docker_url/mustafa_public/php-fpm:v7.2

            当分支被合并到main分支时,gitlab 启动一个基于 docker 镜像的容器,把项目源代码拷贝到这个容器中,该容器具备操作宿主机docker的能力。在该容器中登陆企业的私有镜像仓库、打包镜像并推送到企业的私有镜像仓库。

            关于安装gitlab的docker runner,参照这篇文件 gitlab runner 之docker

            docker-cli项目同docker-phpfpm项目,只不过dockerfile的基础镜像从  php:7.2-fpm 换成 php:7.2-cli

            开发人员的业务项目中并不包含运维任何的代码,开发人员只关注实现业务需求、通过测试后,自动执行的上线检查,其中包括上文介绍过的语法检查和代码格式规范检查,检查通过后允许合并分支。

            上线检查过程,使用到docker-cli项目,安装依赖包以及执行php命令。对应的.gitlab-ci.yml 文件内容如下

    1. stages:
    2. - install
    3. - test
    4. cache:
    5. key: $CI_COMMIT_REF_SLUG:$CI_PIPELINE_ID
    6. paths:
    7. - vendor/
    8. 安装依赖包:
    9. stage: install
    10. image: dockerhub.qingcloud.com/mustafa_public/php-cli:v7.2
    11. script:
    12. - composer install
    13. 语法检测:
    14. stage: test
    15. image: dockerhub.qingcloud.com/mustafa_public/php-cli:v7.2
    16. script:
    17. - composer analyse
    18. 代码规范检查:
    19. stage: test
    20. image: dockerhub.qingcloud.com/mustafa_public/php-cli:v7.2
    21. script:
    22. - composer cs

            先安装依赖包,再执行语法检测和代码规范检查,整个过程中共享了php的vendor目录,基于上面说的php-cli项目。检查通过后,分支就可以合并了。

            当分支被合并后,需要拿着合并好的源代码,到运维管理的 test_cd 项目,找对应环境对应项目的配置信息,拿到它的Dockerfile文件,执行构建命令进行打包和镜像推送。

    线上部署项目 test_cd

             该项目分支包含 develop 开发环境 、test 测试环境 pre 预发布环境、product 线上环境。每个分支的一级目录为研发人员的微服务git名称,可以根据git push时附带的项目名称找到项目配置信息的路径。项目路径下包含一个Dockerfile文件,可以根据这个文件打包对应环境的镜像。docker文件里有该dockerfile文件所依赖的一些配置信息。www文件夹为对应微服务的源代码目录,这是个空目录。

            研发人员各自服务项目的cicj文件里,有类似如下的流程:

    1. stages:
    2. - build
    3. 代码发送到cd项目:
    4. stage: build
    5. image: dockerhub.qingcloud.com/mustafa_public/mydocker:v1
    6. only:
    7. - main
    8. variables:
    9. ENV: "product"
    10. CD_REPO: git@gitlab.com:jiangliuer3264_docker/test_cd.git
    11. script:
    12. - git clone $CD_REPO -b $ENV /tmp/cd
    13. - cp -r . /tmp/cd/$CI_PROJECT_NAME/www
    14. - cd /tmp/cd/$CI_PROJECT_NAME
    15. - docker login $docker_url -u $docker_user -p $docker_password
    16. - docker build -t $CI_PROJECT_NAME"_"$ENV:$CI_COMMIT_SHA --build-arg APP_ENV=$ENV .
    17. - docker tag $CI_PROJECT_NAME"_"$ENV:$CI_COMMIT_SHA $docker_url/mustafa_project/$CI_PROJECT_NAME"_"$ENV:$CI_COMMIT_SHA
    18. - docker push $docker_url/mustafa_project/$CI_PROJECT_NAME"_"$ENV:$CI_COMMIT_SHA

    当合并到主分支后,指定环境变量env 为 product。克隆负责部署的cd项目的product分支。把合并通过的源代码复制到cd部署项目对应目录下的www目录中。打包和推送镜像,打包传参为环境变量。

    cd项目的dockerfile文件内容如下

    1. FROM dockerhub.qingcloud.com/mustafa_public/php-fpm:v7.2
    2. # 获取环境变量,写入yaf的配置文件
    3. ARG APP_ENV
    4. RUN echo "yaf.environ=$APP_ENV" >> /usr/local/etc/php/conf.d/docker-php-ext-yaf.ini
    5. # 拷贝nginx配置文件
    6. ADD docker/conf/nginx /etc/nginx/conf.d
    7. # 拷贝项目源文件,打包镜像
    8. ADD www ./
    9. # 安装composer依赖包
    10. RUN composer install --no-dev -o

            就是拿php-fpm基础镜像,根据传进来的环境变量参数,写yaf配置文件,拷贝nginx配置文件,拷贝项目的源代码,下载依赖。

            这样我们就实现了push项目到main分支,自动打包生成可直接运行的镜像。

           

    有亮点需要注意以下:

    1. 每次打包生成镜像的版本号都不一样,通过 $CI_COMMIT_SHA 区分,是为了方便遇到问题及时回滚

    2. 由于需要在docker镜像中使用git 克隆企业内部另一个项目的源代码,docker镜像无该功能,需要基于docker镜像制作一个新的镜像。

    docker-mybasic项目

    用于生成满足企业内部使用的基于docker的、执行实际部署任务的镜像,dockerfile文件内容如下

    1. FROM docker
    2. RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.cloud.tencent.com/g' /etc/apk/repositories
    3. RUN apk add --no-cache git
    4. COPY ssh2/* /root/.ssh/
    5. RUN chmod 600 /root/.ssh/id_rsa
    6. RUN echo "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
    7. RUN git config --global user.email "testmydocker@mustafa.com" && git config --global user.name "testmydocker"

            

  • 相关阅读:
    代码+视频,R语言如何从可信区间推断P值
    C++完全背包
    Node学习五(1) —— 查询和读写文件(path模块,路径处理)
    【2022秋线上作业-第5次-第11-13周】选择题
    抓包工具fiddler的基础知识
    亚马逊红人买家秀关联视频是合规安全提升转化的有力工具
    LCMXO2-2000HC-4FTG256C FPGA MachXO2系列 256-FTBGA 现场可编程门阵列
    高频面试题
    vscode环境中配置git
    设计模式:桥接模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)
  • 原文地址:https://blog.csdn.net/fanghailiang2016/article/details/126574812