DevOps历程--Drone安装使用详细教程

1、DevOps

在这里插入图片描述

Dev:开发

Ops:运维

开发和运维配合自动化完成整个部署生命周期

以前部署:

  • 所有模块都打包. goods-service.jar
  • 上传到生产环境服务器
  • java [参数 -Xmx100m -Xms100m] -jar xxx.jar [启动参数]
  • 持续监控生产环境服务的运行情况

问题:

  • 生产环境30台服务器。goods-service、order-service、user-service、xxxx,
    • 每个微服务在集群部分节点进行部署;【高可用部署
    • 线上服务器宕机,部署的应用可以自动转移到其他服务器部署。【故障转移
    • 某个服务器上应用OOM等完蛋了。线上服务器拥有自愈能力【自愈
      • docker --restart=always run service-order: docker自动重启应用
    • 线上拥有一个服务的多个版本并存。最终自动替换成最新版本;【灰度发布
    • 希望:
      • 自动化的部署流程
      • 自动化的平台管理
      • 自动化的监控运维
  • DevOps:开发和运维配合完成一个自动化的部署链路; 自动检出 (Checkout) 代码、测试、分析、构建、部署并发布

在这里插入图片描述

项目开发-部署的完整生命周期

任务:项目管理软件。Jira、禅道; 开发每天领开发任务;

开发:项目开发工具。VSCode、Idea、Eclipse; 进行代码开发;

提交:代码仓库。Github、Gitee、Gitlab、SVN; 把开发完成的代码提交推送到公司的代码仓库

构建:项目构建工具。 maven、npm; 利用构建工具对项目进行编译、构建。

质量分析:代码分析工具。sonarqube; 把所有代码进行扫描,分析出不符合规范的代码、以及常见bug。 “1”.equals(param)

单元测试:测试工具。junit; 把单元测试跑一遍; 测试覆盖率(90%);

制品:制作产品。nexus、maven中央仓库; 把项目产生的jar包、静态文件、exe等 上传到制品仓库service-order-v1.0.jar

制作镜像:把产品做成镜像;docker、harbor;把制作好的docker镜像推送到镜像仓库。

部署:把产品镜像集群化的部署到线上平台; kubernetes

监控运维:把每个应用各种指标监控起来; Prometheus+Grafana; 把各种预警信息发送给运维、开发;

整个生命周期涉及到众多工具链。如果从头到尾都是手动自己做,就会非常慢。

Jenkins: 帮我们打通devops整个链路。

  • 以前我们手动运行一堆命令,最终实现项目部署
  • Jenkins整合各种软件帮我们自动运行部署期间的所有命令;
  • deploy.sh 部署 shell 脚本。

2、CI&CD

1、CI(Continuous Integration)

持续集成: 开发好的模块,集成整个系统中进行联动测试; 把开发好的功能自动化部署到测试环境

开发-构建-测试:

持续:源源不断。 开发人员无需自己进行集成测试,全部都是自动化的

代码开发完成后提交到git。jenkins拉取到git代码,运行自动化过程,把模块部署到测试环境。 测试人员通过测试环境进行测试

在这里插入图片描述

2、CD(Continuous Delivery 和 Continuous Deployment)

持续交付、持续部署;

持续交付与持续部署的区别:持续交付是一种能力,持续部署是一种方式。

持续部署:把产品自动化的部署到生产环境。 先CI再CD;

交付: 把开发好的产品交给客户

  • 电商网站部署到生产环境服务器。
  • 客户端应用:打成产品生成下载连接;
  • 王者荣耀游戏: 手机推送最新增量更新包。
  • 移动: 更新整个收费系统。
  • 电影票线下交付
  • 虚拟服务…

部署只是交付的一种方式。

在这里插入图片描述

3、Drone

Drone文档

Drone是基于GO语言开发的持续集成(Continuous integration,CI)引擎,它可以借助Docker容器技术,用于自动化测试与构建,满足持续交付的基本需求,适合小团队开发。Drone具有简洁、轻量级、启动快、资源占用等特点。 Jenkins也是CI引擎,它的特点是文档丰富、功能丰富、插件丰富、配置功能强大等特点,但资源占用较高。Drone比Jenkins轻量级,对云原生支持较好。

在这里插入图片描述

3.1、安装与配置

3.1.1 drone+gitlab版(还没有数据库)

新建一个docker-compose.yml文件,随便放一个位置例如/opt/docekr-compose-script,没有目录自己新建一个

version: "3.7"
# 创建自定义网络
networks:
  drone:
    # external: false
    driver: bridge
services:
  # 数据库服务
  db:
    image: postgres:9.6
    container_name: drone_db
    restart: always
    networks:
      - drone # 加入到drone网络
    ports:
      - "5432:5432" # 8081为容器暴露到服务器的端口,5432为容器内改应用的端口
    environment:
      - POSTGRES_USER=username # PGSQL默认用户名
      - POSTGRES_PASSWORD=password # PGSQL默认密码
      - POSTGRES_DB=db_name # PGSQL默认数据库的名字
    volumes:
      - ./drone/db:/var/lib/postgresql/data # 数据卷,前者为服务器真实位置,后者为改应用在容器内的位置
  # Drone Server 服务
  server:
    image: drone/drone:latest
    container_name: drone_server
    restart: always
    networks:
      - drone # 加入到drone网络
    ports:
      - "18091:80"
    environment:
      - DRONE_SERVER_PROTO=http # 访问协议,创建webHooks和重定向
      - DRONE_SERVER_HOST=192.168.12.53:18091 # 主机名称,创建webHooks和重定向
      - DRONE_RPC_SECRET=123456 # 与 drone runner 通讯的密钥
      - DRONE_USER_CREATE=username:root,admin:true # 管理员账户
      - DRONE_DATABASE_DRIVER=postgres # 数据库类型
      - DRONE_DATABASE_DATASOURCE=postgres://username:password@db/db_name?sslmode=disable # 数据库连接
      - DRONE_GIT_ALWAYS_AUTH=true # 使用 oauth 身份验证信息拉取代码
      - DRONE_GIT_USERNAME=root
      - DRONE_GIT_PASSWORD=5XlT5hFipp
      - DRONE_GITLAB_SERVER=http://192.168.12.53:8087/
      - DRONE_GITLAB_CLIENT_ID=04671ff5fcedb9d6f129168ce900eedc92e1f86b4bd519d06250c9803fdf222c # GITLAB客户端  id
      - DRONE_GITLAB_CLIENT_SECRET=3782568b9f71d5567a7db84cc4ecf10ba5538978b6c79654acc5d56070c38eb7 # GITLAB客户端 密钥
      - DRONE_GITLAB_SKIP_VERIFY=true # 禁用 GITEE 链接时 tls 验证
    volumes:
      - ./drone/server:/data
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - db
  # Drone Docker Runner
  runner:
    image: drone/drone-runner-docker:latest # 目前drone-runner-docker最新版
    container_name: drone_runner
    restart: always
    networks:
      - drone # 加入到drone网络
    ports:
      - "7930:3000"
    environment:
      - DRONE_RUNNER_NAME=docker-runner
      - DRONE_RUNNER_CAPACITY=10 # 限制runner可执行的并发管道数量
      - DRONE_RPC_PROTO=http # 访问drone server 协议
      - DRONE_RPC_HOST=drone_server # 访问drone server 服务器地址
      - DRONE_RPC_SECRET=123456 # 与 drone server 通讯的密钥
      #- DRONE_UI_USERNAME=username # Drone Runner 的 UI 用户账号
      #- DRONE_UI_PASSWORD=xxxxxx # Drone Runner 的 UI 用户密码
      # DRONE_RUNNER_NETWORKS=drone
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    depends_on:
      - server

3.1.2 drone+gogs版(已经有了数据库)
version: "3.7"

# 创建自定义网络
networks:
  drone:
    # external: false
    driver: bridge

services:
  # Drone Server 服务
  server:
    image: drone/drone:latest
    container_name: drone_server
    restart: always
    networks:
      - drone # 加入到drone网络
    ports:
      - "18091:80"
    environment:
      - DRONE_SERVER_PROTO=http # 访问协议,创建 webhooks 和重定向
      - DRONE_SERVER_HOST=192.168.12.53:18091 # 设置为宿主机 IP 和暴露端口
      - DRONE_RPC_SECRET=123456 # 与 drone runner 通讯的密钥
      - DRONE_USER_CREATE=username:root,admin:true # 创建初始管理员账户

      # 使用外部 MySQL 数据库
      - DRONE_DATABASE_DRIVER=mysql # 数据库类型
      - DRONE_DATABASE_DATASOURCE=root:123456@tcp(192.168.12.53:3306)/drone?parseTime=true # 数据库连接字符串

      # 配置 Gogs 作为 Git 提供商
      - DRONE_GOGS_SERVER=http://192.168.12.53:8078 # Gogs 服务地址(确保和 Gogs 服务实际端口一致)
      - DRONE_GIT_ALWAYS_AUTH=false # Gogs 通常不需要 OAuth
      - DRONE_GIT_USERNAME=root # 可选,如 Gogs 有身份验证
      - DRONE_GIT_PASSWORD=root # 可选

    volumes:
      - ./drone/server:/data
      - /var/run/docker.sock:/var/run/docker.sock
    # 不再依赖 db 服务,因为使用外部 MySQL

  # Drone Docker Runner
  runner:
    image: drone/drone-runner-docker:latest # 目前 drone-runner-docker 最新版本为 1.8.0
    container_name: drone_runner
    restart: always
    networks:
      - drone # 加入到 drone 网络
    ports:
      - "7930:3000"
    environment:
      - DRONE_RUNNER_NAME=docker-runner
      - DRONE_RUNNER_CAPACITY=10 # 限制 runner 可执行的并发管道数量
      - DRONE_RPC_PROTO=http # 访问 drone server 协议
      - DRONE_RPC_HOST=192.168.12.53:18091 # 宿主机 IP + Drone Server 暴露端口
      - DRONE_RPC_SECRET=123456 # 与 drone server 通讯的密钥
      - DRONE_UI_USERNAME=admin # Drone Runner 的 UI 用户账号(可选)
      - DRONE_UI_PASSWORD=admin # Drone Runner 的 UI 用户密码(可选)
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    depends_on:
      - server

3.1.3 执行安装
docker-compose -f docker-compose.yml up -d
3.1.4 访问和重置密码

输入http://ip:18091即可访问登录页面,drone的默认端口号是80端口我们在安装时把18091给映射给`80了

例如我的访问地址为192.168.12.53:18091/然后稍等一会,就会出现以下样式,然后输入进去我们的密码

这里的密码使用的是你的GitLab或者Gogs或者其他git服务的账号密码,第一次最好使用管理员密码

在这里插入图片描述

3.1.5初始化配置
  • 登录进去后,我们可以看到已经有了gogs中的项目,如果没有,可以点击右上角的 SYNC 按钮。

在这里插入图片描述

  • 配置仓库,使Drone创建的容器能够挂载到宿主机上
  • 选中仓库点击 ACTIVATE后, 设置仓库 -> 勾选 Trusted -> SAVE 保存。

在这里插入图片描述

  • 保存成功后我们进入 Gogs 管理面板,打开刚才操作的这个项目查看 WEB钩子是否配置成功

在这里插入图片描述

3.2、流水线-实战

流水线文档

流水线:

CICD:把源代码通过 打包-测试-发布 等一系列流程部署到线程。 这个过程就是一个流水线。

3.2.1 Drone.yml详解
  • 当我们向Git仓库Push代码时,会自动触发Web钩子,然后Drone就会从Git仓库Clone代码,再通过项目目录下的.drone.yml配置,执行相应的流水线,接下来我们来看看这个脚本是如何写的。

在仓库的根目录下创建.drone.yml配置文件,主要要放在项目根目录,和pom.xml等同级

3.2.2 流水模板示例一,普通docker部署

如果想要多分支,请按照步骤重写一份就可以了

请把里面对应的文件放在对应的目录,没有请新建文件和目录!!!

kind: pipeline
type: docker
name: default

steps: 
  - name: build # maven:3.9.9-amazoncorretto-17-alpine maven:3.8.6-jdk-8-slim
    image: maven:3.8.6-openjdk-18-slim
    pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
    volumes:
      - name: mvn-rep
        path: /root/.m2
      - name: mvn-conf
        path: /usr/share/maven/conf
    environments:
      TARGET: dev
    commands:
     - |
       if [ "$DRONE_BRANCH" = "dev" ] || [ "$DRONE_BRANCH" = "test" ] || [ "$DRONE_BRANCH" = "prod" ]; then
          echo "配置target=$DRONE_BRANCH"
          export TARGET=$DRONE_BRANCH
       fi
       echo 发布目标:$TARGET ${TARGET}
       echo 构建分支:${DRONE_BRANCH}
       echo 构建编号:${DRONE_REPO_NAME}:${DRONE_BUILD_NUMBER}
       export LOCAL_REP=$TARGET
       mvn clean package -DskipTests=true -U -P $TARGET
       echo "=================================================================================================="
       echo "构建完成后,列出 target 目录内容:"
       ls -al target/
       echo "=================================================================================================="
    when: 
      branch:
        - prod
        - test
        - dev
#把打包好的jar远程复制到其他机器上
  - name: scp to ${DRONE_BRANCH}
    image: appleboy/drone-scp
    pull: if-not-exists
    settings:
      host: 192.168.12.53
      username: root
      password:
        from_secret: dev_pass
      port: 22
      strip_components: 1
      target: /home/jar/${DRONE_BRANCH}
      source: target/${DRONE_REPO_NAME}.jar
    when: 
      branch:
        - dev
 
 
  - name: image to dev
    image: plugins/docker
    pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
    volumes:
      - name: dockerSock
        path: /var/run/docker.sock
    settings:
      compress: true
      insecure: false
      no_cache: true
      registry: 192.168.12.53:8089
      repo: 192.168.12.53:8089/dev/${DRONE_REPO_NAME}
      dockerfile: ./Dockerfile
      build_args: 
        - JAR_FILE=./target/${DRONE_REPO_NAME}.jar
        - SERVICE_NAME=${DRONE_REPO_NAME}
        - DRONE_BUILD_NUMBER=${DRONE_BUILD_NUMBER}
      username:
        from_secret: registry_nexus_username
      password:
        from_secret: registry_nexus_password
      tags:
        - ${DRONE_BUILD_NUMBER}
    when:
      branch:
        - dev

#部署到docker
  - name: deploy-to-docker
    pull: if-not-exists
    image: plugins/docker
    volumes: # 将容器内目录挂载到宿主机上,仓库需要开启trusted设置
      - name: dockerSock
        path: /var/run/docker.sock # 挂载宿主机的docker
    commands: # 定义在docker中执行的shell命令
      - echo "开始部署"
      - docker rm -f ${DRONE_REPO_NAME} || true
      - docker pull 192.168.12.53:8089/dev/${DRONE_REPO_NAME}:${DRONE_BUILD_NUMBER}
      - docker run -d -p 88:8080 --name ${DRONE_REPO_NAME} 192.168.12.53:8089/dev/${DRONE_REPO_NAME}:${DRONE_BUILD_NUMBER}
      - docker ps | grep ${DRONE_REPO_NAME}
    when:
      branch:
        - dev
#钉钉通知
  - name: notice
    image: lddsb/drone-dingtalk-message
    pull: if-not-exists
    volumes:
      - name: dingtalk-message-tpls
        path: /app/drone/dingtalk/message/tpls
    settings:
      token:
        from_secret: dingding_token
      type: markdown
      message_color: true
      template: notify.tpl
      success_color: '#008000'
      failure_color: '#FF0000'
      tips_title: '构建通知'
      tpl: /app/drone/dingtalk/message/tpls/notify.tpl
      tpl_repo_full_name: ${DRONE_BUILD_NUMBER}
    when:
      branch:
        - dev
      status:
        - success
        - changed
        - failure
#目录映射
volumes:
  - name: dingtalk-message-tpls
    host:
      path: /home/apps/drone/tpl
  - name: mvn-rep
    host:
      path: /var/lib/docker/volumes/mvn-rep/_data
  - name: mvn-conf
    host:
      path: /var/lib/docker/volumes/mvn-conf/_data
  - name: dockerSock
    host:
      path: /var/run/docker.sock	  
#触发
trigger:
  event:
    - push
    - custom
  branch:
    - prod
    - test
    - dev
3.2.3 流水模板示例二,最强k8s多分支部署
kind: pipeline
type: docker
name: default
clone:
  default:
    image: 192.168.12.53:8089/drone/git:latest #默认从harbor私有仓库拉取镜像

steps: 
  - name: build # maven:3.9.9-amazoncorretto-17-alpine maven:3.8.6-jdk-8-slim
    image: 192.168.12.53:8089/maven:3.9.9-amazoncorretto-17-alpine
    pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
    volumes:
      - name: mavenRep
        path: /root/.m2
      - name: scriptPath
        path: /script
    environments:
      TARGET: dev
    commands:
     - |
       if [ "$DRONE_BRANCH" = "dev" ] || [ "$DRONE_BRANCH" = "test" ] || [ "$DRONE_BRANCH" = "prod" ]; then
          echo "配置target=$DRONE_BRANCH"
          export TARGET=$DRONE_BRANCH
       fi
       echo 发布目标:$TARGET ${TARGET}
       echo 构建分支:${DRONE_BRANCH}
       echo 构建编号:${DRONE_REPO_NAME}:${DRONE_BUILD_NUMBER}
       export LOCAL_REP=$TARGET
       mvn clean package -DskipTests=true -U -P $TARGET
       echo "=================================================================================================="
       echo "构建完成后,列出 target 目录内容:"
       ls -al target/
       echo "=================================================================================================="
    when: 
      branch:
        - prod
        - test
        - dev
  
  - name: scp to ${DRONE_BRANCH}
    image: 192.168.12.53:8089/appleboy/drone-scp
    pull: if-not-exists
    settings:
      host: 192.168.12.53
      username: root
      password:
        from_secret: dev_pass #凭证请在drone的项目的setting中配置
      port: 22
      strip_components: 1
      target: /home/jar/${DRONE_BRANCH}
      source: target/${DRONE_REPO_NAME}-cloud.jar
    when: 
      branch:
        - prod
        - test
        - dev
 
 
  - name: image to dev
    image: 192.168.12.53:8089/plugins/docker
    pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载1
    volumes:
      - name: dockerSock
        path: /var/run/docker.sock
      - name: dockerfile
        path: /drone/src/${DRONE_REPO_NAME}-${DRONE_BRANCH}/Dockerfile
    settings:
      compress: true
      insecure: true
      no_cache: true
      registry: 192.168.12.53:8089
      mirror: https://dk123we1ow.mirror.aliyuncs.com
      storage_path: /docker/${DRONE_REPO_NAME}-${DRONE_BRANCH}
      dockerfile: ./${DRONE_REPO_NAME}-${DRONE_BRANCH}/Dockerfile
      build_args: 
        - JAR_FILE=./target/${DRONE_REPO_NAME}-cloud.jar
        - SERVICE_NAME=${DRONE_REPO_NAME}
        - DRONE_BUILD_NUMBER=${DRONE_BUILD_NUMBER}
      username:
        from_secret: registry_nexus_username
      password:
        from_secret: registry_nexus_password
      repo: 192.168.12.53:8089/dev/${DRONE_REPO_NAME}
      tags:
        - ${DRONE_BUILD_NUMBER}
    when:
      branch:
        - dev

  - name: deploy-to-k8s
    pull: if-not-exists
    image: 192.168.12.53:8089/sanchar/kubectl:v1.20.1
    extra_hosts:
      - lb.kubesphere.local:192.168.12.53
    volumes:
      - name: kube
        path: /root/.kube
    commands:
      - kubectl --kubeconfig /root/.kube/config set image deployment/${DRONE_REPO_NAME} *='192.168.12.53:8089/dev/${DRONE_REPO_NAME}:${DRONE_BUILD_NUMBER}' -n lx-${DRONE_BRANCH}
    when:
      branch:
        - dev

  - name: image to test
    image: 192.168.12.53:8089/plugins/docker
    pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
    volumes:
      - name: dockerSock
        path: /var/run/docker.sock
      - name: dockerfile
        path: /drone/src/${DRONE_REPO_NAME}-${DRONE_BRANCH}/Dockerfile
    settings:
      compress: true
      insecure: false
      registry: registry.cn-chengdu.aliyuncs.com
      mirror: https://d22caj1w.mirror.aliyuncs.com
      storage_path: /docker/${DRONE_REPO_NAME}-${DRONE_BRANCH}
      dockerfile: ./${DRONE_REPO_NAME}-${DRONE_BRANCH}/Dockerfile
      build_args: 
        - JAR_FILE=./target/${DRONE_REPO_NAME}-cloud.jar
        - SERVICE_NAME=${DRONE_REPO_NAME}
        - DRONE_BUILD_NUMBER=${DRONE_BUILD_NUMBER}
      username:
        from_secret: registry_aliyun_username
      password:
        from_secret: registry_aliyun_password
      repo: registry.cn-chengdu.aliyuncs.com/test/${DRONE_REPO_NAME}
      tags:
        - ${DRONE_BUILD_NUMBER}
    when:
      branch:
        - test


  - name: deploy-to-test
    pull: if-not-exists
    image: 192.168.12.53:8089/sanchar/kubectl:v1.20.1
    extra_hosts:
      - lb.kubesphere.local:10.127.70.142
    volumes:
      - name: kube-test
        path: /root/.kube
    commands:
      - kubectl --kubeconfig /root/.kube/config set image deployment/${DRONE_REPO_NAME} *='registry.cn-chengdu.aliyuncs.com/test/${DRONE_REPO_NAME}:${DRONE_BUILD_NUMBER}' -n lx-${DRONE_BRANCH}
    when:
      branch:
        - test
  
  - name: image to prod
    image: 192.168.12.53:8089/plugins/docker
    pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载1
    volumes:
      - name: dockerSock
        path: /var/run/docker.sock
      - name: dockerfile
        path: /drone/src/Dockerfile
    settings:
      compress: true
      insecure: false
      registry: registry.cn-chengdu.aliyuncs.com
      mirror: https://df13jcw.mirror.aliyuncs.com
      storage_path: /docker/${DRONE_REPO_NAME}-${DRONE_BRANCH}
      dockerfile: ./Dockerfile
      build_args: 
        - JAR_FILE=./target/${DRONE_REPO_NAME}-cloud.jar
        - SERVICE_NAME=${DRONE_REPO_NAME}
        - DRONE_BUILD_NUMBER=${DRONE_BUILD_NUMBER}
      username:
        from_secret: registry_aliyun_username
      password:
        from_secret: registry_aliyun_password
      repo: registry.cn-chengdu.aliyuncs.com/prod/${DRONE_REPO_NAME}
      tags:
        - ${DRONE_BUILD_NUMBER}
    when:
      branch:
        - prod
#  - name: deploy-to-prod
#    pull: if-not-exists
#    image: 192.168.12.53:8089/sanchar/kubectl:v1.20.1
#    volumes:
#      - name: kube-prod
#        path: /root/.kube
#    commands:
#      - |
#        if [ "${DRONE_BRANCH}" = "prod" ] && [ "${passwd}" = "asdk123a1" ]; then
#          kubectl --kubeconfig /root/.kube/config set image deployment/${DRONE_REPO_NAME} *='registry.cn-chengdu.aliyuncs.com/prod/${DRONE_REPO_NAME}:${DRONE_BUILD_NUMBER}' -n lx-${DRONE_BRANCH}
#        else
#          echo "Skipping deployment to prod due to incorrect password or not on 'prod' branch."
#        fi
#    when:
#      branch:
#        - prod 
  

  - name: notice
    image: lddsb/drone-dingtalk-message
    pull: if-not-exists
    volumes:
      - name: dingtalk-message-tpls
        path: /app/drone/dingtalk/message/tpls
    settings:
      token:
        from_secret: dingding_token
      type: markdown
      message_color: true
      template: notify.tpl
      success_color: '#008000'
      failure_color: '#FF0000'
      tips_title: '构建通知'
      tpl: /app/drone/dingtalk/message/tpls/notify.tpl
      tpl_repo_full_name: ${DRONE_BUILD_NUMBER}
    when:
      branch:
        - prod
        - test
        - dev
      status:
        - success
        - changed
        - failure

  - name: 质量分析
    pull: if-not-exists
    privileged: true
    image: 192.168.12.53:8089/sonarsource/sonar-scanner-cli:latest
    extra_hosts:
      - lb.kubesphere.local:8.137.80.167
    volumes:
      - name: sonar
        path: /sonar
    commands:
      - rm -rf /sonar/* && cd /sonar && cp -r /drone/src/* /sonar
      - sonar-scanner -Dsonar.projectKey=${DRONE_REPO_NAME} -Dsonar.sources=/sonar -Dsonar.java.binaries=/sonar/target/classes -Dsonar.host.url=http://192.168.12.53:9001 -Dsonar.login=sqa_f7e921f63d02a86easd1dsd54e3c745f377ab
    when:
      branch:
        - dev


volumes:
  - name: dockerfile
    host:
      path: /home/apps/drone/build/${DRONE_BRANCH}/Dockerfile1.2
  - name: dockerfile4Target
    host:
      path: /home/apps/drone/build/${TARGET}/Dockerfile
  - name: scriptPath
    host:
      path: /home/apps/drone/build/dev/script
  - name: dingtalk-message-tpls
    host:
      path: /home/apps/drone/tpl
  - name: mavenRep
    host:
      path: /home/apps/data/drone/.m2
  - name: kube
    host:
      path: /root/kube
  - name: kubedev2
    host:
      path: /root/kube-dev2
  - name: kube-test
    host:
      path: /root/kube-test
  - name: kube-prod
    host:
      path: /root/kube-prod
  - name: dockerSock
    host:
      path: /var/run/docker.sock
  - name: sonar
    host:
      path: /root/sonar/${DRONE_REPO_NAME}
  - name: ssh-rsa
    host:
        path: /root/.ssh
trigger:
  event:
    - push
    - custom
  branch:
    - prod
    - test
    - dev

3.2.4 通知

上面模板已经带了通知了,但是那个是我自定义了的通知,下面给两个默认的通知

  1. 配置邮件报警
steps:
  - name: notify
    image: drillster/drone-email
    settings:
      host: SMTPserver      //例如 smtp.qq.com  
      port: SMTPserverport   //例如QQ邮箱端口465
      username: xxxxxxxx@qq.com  //邮箱用户名
      password: xxxxxxxx   //邮箱密码
      from: xxxxxxxxxxx 
      recipients: xxxxxxxxxxxxx,xxxx  //收件人
    when:    //执行条件
      status: 
      - success
      - changed
      - failure
  1. 配置钉钉报警
steps:
  ......
- name: dingtalk
  image: lddsb/drone-dingtalk-message
  settings:
    token: your-dingtalk-robot-access-token
    type: markdown
    message_color: true
    message_pic: true
    sha_link: true
  1. 钉钉自定义模板
    上文设置了通知模板的挂载路径因此需要新建对应的文件夹/home/apps/drone/tpl,并新建一个文件notify.md
### <font color="[TPL_STATUS_COLOR]">[TPL_REPO_SHORT_NAME] 构建 [TPL_BUILD_STATUS] [耗时:[TPL_BUILD_CONSUMING]秒]</font>

**注释**: [TPL_COMMIT_MSG]
**代码**: [TPL_COMMIT_LINK]
**开发**: [[TPL_AUTHOR_EMAIL]]()
**环境**: <font color="[TPL_STATUS_COLOR]"> [TPL_COMMIT_BRANCH]</font>
**构建号**: <font color="#0000FF">  [TPL_REPO_FULL_NAME]</font>
[点击查看构建详情]([TPL_BUILD_LINK])[TPL_STATUS_EMOTICON]
3.2.5 凭据管理

项目–>Settings–>Secrets

在这里插入图片描述

3.2.6 统一维护流水线模板

项目–>Settings–>Templates

为了专业的人做专业事,同时方便流水线的统一管理,这里推荐把流水线放在drone,项目的.drone.yml配置文件只需要引用模板即可

例如:

在项目根目录放置.drone.yml

kind: template
load: drone_deploy_jdk17_jar.yaml
data:
  name: ${DRONE_REPO_NAME}

在这里插入图片描述

4、Drone 全局环境变量说明

https://drone.cool/pipeline/environment/reference/


🔁 Git 信息

变量名说明
DRONE_BRANCH分支名,例如 masterfeature/login
DRONE_TAGGit 标签(如是 tag 构建时),否则为空
DRONE_COMMIT_SHAGit 提交的完整 SHA 值(40位)
DRONE_COMMIT_BEFORE上一次提交的 SHA 值
DRONE_COMMIT_AFTER当前提交的 SHA 值(同 DRONE_COMMIT_SHA
DRONE_COMMIT_REFGit 引用,例如 refs/heads/mainrefs/tags/v1.0
DRONE_COMMIT_BRANCH提交所在分支名,通常和 DRONE_BRANCH 一致
DRONE_COMMIT_AUTHOR提交人用户名
DRONE_COMMIT_AUTHOR_EMAIL提交人邮箱
DRONE_COMMIT_MESSAGE提交信息
DRONE_REMOTE_URLGit 仓库地址

🚀 构建信息

变量名说明
DRONE_BUILD_NUMBER构建编号,例如 1, 2, 3
DRONE_BUILD_STATUS当前构建状态,可能是 success, failure, killed
DRONE_BUILD_EVENT触发事件,例如 push, pull_request, tag
DRONE_BUILD_LINK构建详情页面 URL
DRONE_DEPLOY_TO部署环境名,如 production,需要手动设置
DRONE_STARTED构建开始时间(Unix 时间戳)
DRONE_FINISHED构建结束时间(Unix 时间戳)
DRONE_JOB_STARTED当前 Job 启动时间戳
DRONE_JOB_FINISHED当前 Job 结束时间戳

🧑 仓库信息

变量名说明
DRONE_REPO仓库全名(包含组织名),例如 my-org/demo-app
DRONE_REPO_NAME仓库名称,例如 demo-app
DRONE_REPO_OWNER仓库所属用户或组织,例如 my-org
DRONE_REPO_LINK仓库地址
DRONE_REPO_BRANCH默认分支
DRONE_REPO_PRIVATE是否为私有仓库:truefalse

🧑‍💻 PR(Pull Request)信息(仅 PR 构建时)

变量名说明
DRONE_PULL_REQUESTPR 编号
DRONE_SOURCE_BRANCHPR 的源分支
DRONE_TARGET_BRANCHPR 的目标分支

🛠️ 系统与执行器信息

变量名说明
DRONE_SYSTEM_HOSTDrone 服务器地址,例如 drone.example.com
DRONE_SYSTEM_PROTO协议,http 或 https
DRONE_RUNNER_NAME当前 Runner 名称
DRONE_RUNNER_OSRunner 所在系统,例如 linux, windows
DRONE_RUNNER_ARCHRunner 架构,例如 amd64, arm64
DRONE_STAGE_NAME阶段名称(流水线 stage 名)
DRONE_STAGE_KIND类型,例如 pipeline
DRONE_STAGE_MACHINE构建所在主机名
DRONE_STEP_NAME步骤名称(step 名)

🔐 Secret 示例变量(你手动配置的)

变量名说明
DOCKER_USERNAMEDocker Hub/Harbor 用户名
DOCKER_PASSWORD登录密码
SSH_PASSWORDSSH 远程部署密码
TOKEN自定义 token,例如通知 webhook 使用

这些需在 Drone 仓库 → Secrets 页面中配置。

总结

总体使用下来还是很不错的,相比Jenkins来说我更喜欢Drone,Drone 更简单、更直观、更加轻量级,内存占用少且响应速度快。如果团队人员不是很大的话,还是很推荐大家使用的!

作者博客: www.lstar.icu
开源地址
Gitee 地址: https://gitee.com/lxwise
Github 地址: https://github.com/lxwise

var code = “92a4331b-59d6-4faa-9ea1-2a8da5965137”

posted @ 2025-09-15 16:10  虞泽  阅读(1)  评论(0)    收藏  举报  来源