Loading

Drone-使用缓存插件优化构建速度

Drone-使用缓存插件优化构建速度

之前,我发表了一篇博客,关于自动化构建工具Drone:Drone-比Jenkins更轻量化的持续集成部署工具。经过几个月的实际使用,确实为我们团队减少了不少的重复性工作。

原先如果需要将新版本部署到测试环境,要经过手动的本地编译打包、上传服务器、停止旧服务、发布新服务等一系列步骤,而且手动发布经常会因为各种原因导致莫名浪费很多时间。现在只需要将代码提交Git后,Drone自动会完成这些重复的工作,省了很多的时间。

但是在使用过程中还有一个点让我特别不满,就是Drone的自动构建和发布需要的时间比较久,有时候经常十几分钟甚至半个小时都没有完成发布,而且经常经过长时间的等待后还会发布失败,严重影响到测试同学的工作效率。

查看Drone的构建日志,发现是打包项目的时候,下载构建项目需要的包用时比较久,而且因为网络的原因,经常下载失败导致构建失败。

我们构建下载的那些包是可以存在本地磁盘的,所以不需要每次都去下载。所以我使用了Drone的缓存插件:drone-volume-cache,将下载的包缓存到磁盘中,下次再构建的时候就不需要下载了,从而提高构建速度。

这是优化后的脚本:

kind: pipeline # 默认为 pipeline
type: docker 
name: deployment # 构建文件名称

steps: # 数组结构,流水线化的构建步骤
- name: loading cache # 加载缓存
  pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
  image: drillster/drone-volume-cache
  volumes:
  - name: cache
    path: /cache
  settings:
    restore: true
    mount:
    - ./nugetpackages 
- name: build  # 构建项目
  pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
  image: mcr.microsoft.com/dotnet/sdk:6.0 #    本步骤运行在哪个docker镜像中,该镜像必须存在于 docker hub 中,可在 https://hub.docker.com/_/microsoft-dotnet-sdk 查看对应版本号
  commands:  # 构建过程中,将会依次执行的命令,如果命令退出码非0,将会终止构建本次构建
  - echo ========开始构建并发布项目======== # 输出
  - mkdir -p nugetpackages
  - dotnet restore --packages ./nugetpackages -s https://api.nuget.org/v3/index.json -s ./nugetpackages # 项目重建、
  - dotnet publish -c Release --no-restore --source ./nugetpackages -o ./app/publish --no-self-contained # 项目生成构建
  - mv drone-ci-demo/Dockerfile ./app/publish
  - echo ========项目发布成功======== 
- name: scp transmission file # 使用 scp 插件,将打包好的程序传送到需要部署的目标服务器
  pull: if-not-exists  
  image: appleboy/drone-scp
  settings:
    host:
      - 192.168.2.7
    username: root
    password:
      from_secret: ssh_pwd
    port: 22
    command_timeout: 2m
    target: /tmp/project-publish-ftp/drone-ci-demo # 目标服务器文件夹路径
    overwrite: true
    source:
      - ./app/publish    # 当前需要传输的文件夹
    rm: true
- name: deploy     # 步骤3 使用ssh访问主机
  pull: if-not-exists  
  image: appleboy/drone-ssh 
  settings:
   # 需要部署的主机地址
    host: 192.168.2.7
   # 主机ssh端口
    port: 22
    # 主机登陆用户名
    username: root
    password: 
    # 从drone仓库配置中秘密空间读取密码 ssh登录密码
      from_secret: ssh_pwd
    script: 
      - echo =========暂停并删除旧容器========
      - docker stop drone-ci-demo && docker rm drone-ci-demo  
      - echo =========删除旧镜像=============
      - docker rmi drone-ci-demo:latest 
      - echo =========打包镜像========
      - cd /tmp/project-publish-ftp/drone-ci-demo/app/publish
      - docker build -t drone-ci-demo:latest -t drone-ci-demo:${DRONE_COMMIT} .
      - echo ===============运行镜像==========
      - docker run --name drone-ci-demo --restart=always  -p 90:80 
        -d drone-ci-demo:latest 
      - echo ========部署成功========
- name: rebuild cache   # 构建缓存
  image: drillster/drone-volume-cache
  volumes:
  - name: cache
    path: /cache
  settings:
    rebuild: true
    mount:
    - ./nugetpackages
- name: notify      # 步骤4 部署完成,邮件通知
  pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
  image: drillster/drone-email  
  settings:
    recipients_only: true # 只发送给指定邮件收件人,不默认发送给流水线创建人
    host: smtp.qq.com      #SMTP服务器 例如 smtp.qq.com  
    port: 465   #SMTP服务端口  例如QQ邮箱端口465
    subject: "Drone Build Complete!"
    username:   #邮箱用户名
      from_secret: qqmail_username  
    password:   #邮箱密码 
      from_secret: qqmail_pwd
    from: 
      from_secret: qqmail_username
    recipients:  1111111111@qq.com           #收件人邮箱
  when:    #执行条件
    status: 
    - success
    - changed
    - failure 

# 挂载本地磁盘路径
volumes:
- name: cache
  host:
    path: /tmp/drone-cache

# 可限制哪些分支可以推送自动CICD
trigger:
  branch:  
    - develop

脚本中使用插件 drone-volume-cache 在构建项目前后分别加载和保存需要使用的资源包,并且还使用了drone-scp插件,将打包后的程序传送到需要部署的目标服务器,所以这个脚本比较适合单机部署。而之前博客的脚本使用了Harbor镜像仓库,比较适合多机器部署。

posted @ 2022-08-13 21:04  YoungQ  阅读(1566)  评论(0编辑  收藏  举报