当前位置: 首页 > news >正文

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文件

version: "3.7"
# 创建自定义网络
networks:drone:# external: falsedriver: bridge
services:# 数据库服务db:image: postgres:9.6container_name: drone_dbrestart: alwaysnetworks:- 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:latestcontainer_name: drone_serverrestart: alwaysnetworks:- 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.sockdepends_on:- db# Drone Docker Runnerrunner:image: drone/drone-runner-docker:latest # 目前drone-runner-docker最新版container_name: drone_runnerrestart: alwaysnetworks:- 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=dronevolumes:- "/var/run/docker.sock:/var/run/docker.sock"depends_on:- server
3.1.2 drone+gogs版(已经有了数据库)
version: "3.7"# 创建自定义网络
networks:drone:# external: falsedriver: bridgeservices:# Drone Server 服务server:image: drone/drone:latestcontainer_name: drone_serverrestart: alwaysnetworks:- 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 Runnerrunner:image: drone/drone-runner-docker:latest # 目前 drone-runner-docker 最新版本为 1.8.0container_name: drone_runnerrestart: alwaysnetworks:- 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: defaultsteps: - name: build # maven:3.9.9-amazoncorretto-17-alpine maven:3.8.6-jdk-8-slimimage: maven:3.8.6-openjdk-18-slimpull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载volumes:- name: mvn-reppath: /root/.m2- name: mvn-confpath: /usr/share/maven/confenvironments:TARGET: devcommands:- |if [ "$DRONE_BRANCH" = "dev" ] || [ "$DRONE_BRANCH" = "test" ] || [ "$DRONE_BRANCH" = "prod" ]; thenecho "配置target=$DRONE_BRANCH"export TARGET=$DRONE_BRANCHfiecho 发布目标:$TARGET ${TARGET}echo 构建分支:${DRONE_BRANCH}echo 构建编号:${DRONE_REPO_NAME}:${DRONE_BUILD_NUMBER}export LOCAL_REP=$TARGETmvn clean package -DskipTests=true -U -P $TARGETecho "=================================================================================================="echo "构建完成后,列出 target 目录内容:"ls -al target/echo "=================================================================================================="when: branch:- prod- test- dev
#把打包好的jar远程复制到其他机器上- name: scp to ${DRONE_BRANCH}image: appleboy/drone-scppull: if-not-existssettings:host: 192.168.12.53username: rootpassword:from_secret: dev_passport: 22strip_components: 1target: /home/jar/${DRONE_BRANCH}source: target/${DRONE_REPO_NAME}.jarwhen: branch:- dev- name: image to devimage: plugins/dockerpull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载volumes:- name: dockerSockpath: /var/run/docker.socksettings:compress: trueinsecure: falseno_cache: trueregistry: 192.168.12.53:8089repo: 192.168.12.53:8089/dev/${DRONE_REPO_NAME}dockerfile: ./Dockerfilebuild_args: - JAR_FILE=./target/${DRONE_REPO_NAME}.jar- SERVICE_NAME=${DRONE_REPO_NAME}- DRONE_BUILD_NUMBER=${DRONE_BUILD_NUMBER}username:from_secret: registry_nexus_usernamepassword:from_secret: registry_nexus_passwordtags:- ${DRONE_BUILD_NUMBER}when:branch:- dev#部署到docker- name: deploy-to-dockerpull: if-not-existsimage: plugins/dockervolumes: # 将容器内目录挂载到宿主机上,仓库需要开启trusted设置- name: dockerSockpath: /var/run/docker.sock # 挂载宿主机的dockercommands: # 定义在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: noticeimage: lddsb/drone-dingtalk-messagepull: if-not-existsvolumes:- name: dingtalk-message-tplspath: /app/drone/dingtalk/message/tplssettings:token:from_secret: dingding_tokentype: markdownmessage_color: truetemplate: notify.tplsuccess_color: '#008000'failure_color: '#FF0000'tips_title: '构建通知'tpl: /app/drone/dingtalk/message/tpls/notify.tpltpl_repo_full_name: ${DRONE_BUILD_NUMBER}when:branch:- devstatus:- success- changed- failure
#目录映射
volumes:- name: dingtalk-message-tplshost:path: /home/apps/drone/tpl- name: mvn-rephost:path: /var/lib/docker/volumes/mvn-rep/_data- name: mvn-confhost:path: /var/lib/docker/volumes/mvn-conf/_data- name: dockerSockhost:path: /var/run/docker.sock	  
#触发
trigger:event:- push- custombranch:- 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-slimimage: 192.168.12.53:8089/maven:3.9.9-amazoncorretto-17-alpinepull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载volumes:- name: mavenReppath: /root/.m2- name: scriptPathpath: /scriptenvironments:TARGET: devcommands:- |if [ "$DRONE_BRANCH" = "dev" ] || [ "$DRONE_BRANCH" = "test" ] || [ "$DRONE_BRANCH" = "prod" ]; thenecho "配置target=$DRONE_BRANCH"export TARGET=$DRONE_BRANCHfiecho 发布目标:$TARGET ${TARGET}echo 构建分支:${DRONE_BRANCH}echo 构建编号:${DRONE_REPO_NAME}:${DRONE_BUILD_NUMBER}export LOCAL_REP=$TARGETmvn clean package -DskipTests=true -U -P $TARGETecho "=================================================================================================="echo "构建完成后,列出 target 目录内容:"ls -al target/echo "=================================================================================================="when: branch:- prod- test- dev- name: scp to ${DRONE_BRANCH}image: 192.168.12.53:8089/appleboy/drone-scppull: if-not-existssettings:host: 192.168.12.53username: rootpassword:from_secret: dev_pass #凭证请在drone的项目的setting中配置port: 22strip_components: 1target: /home/jar/${DRONE_BRANCH}source: target/${DRONE_REPO_NAME}-cloud.jarwhen: branch:- prod- test- dev- name: image to devimage: 192.168.12.53:8089/plugins/dockerpull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载1volumes:- name: dockerSockpath: /var/run/docker.sock- name: dockerfilepath: /drone/src/${DRONE_REPO_NAME}-${DRONE_BRANCH}/Dockerfilesettings:compress: trueinsecure: trueno_cache: trueregistry: 192.168.12.53:8089mirror: https://dk123we1ow.mirror.aliyuncs.comstorage_path: /docker/${DRONE_REPO_NAME}-${DRONE_BRANCH}dockerfile: ./${DRONE_REPO_NAME}-${DRONE_BRANCH}/Dockerfilebuild_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_usernamepassword:from_secret: registry_nexus_passwordrepo: 192.168.12.53:8089/dev/${DRONE_REPO_NAME}tags:- ${DRONE_BUILD_NUMBER}when:branch:- dev- name: deploy-to-k8spull: if-not-existsimage: 192.168.12.53:8089/sanchar/kubectl:v1.20.1extra_hosts:- lb.kubesphere.local:192.168.12.53volumes:- name: kubepath: /root/.kubecommands:- 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 testimage: 192.168.12.53:8089/plugins/dockerpull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载volumes:- name: dockerSockpath: /var/run/docker.sock- name: dockerfilepath: /drone/src/${DRONE_REPO_NAME}-${DRONE_BRANCH}/Dockerfilesettings:compress: trueinsecure: falseregistry: registry.cn-chengdu.aliyuncs.commirror: https://d22caj1w.mirror.aliyuncs.comstorage_path: /docker/${DRONE_REPO_NAME}-${DRONE_BRANCH}dockerfile: ./${DRONE_REPO_NAME}-${DRONE_BRANCH}/Dockerfilebuild_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_usernamepassword:from_secret: registry_aliyun_passwordrepo: registry.cn-chengdu.aliyuncs.com/test/${DRONE_REPO_NAME}tags:- ${DRONE_BUILD_NUMBER}when:branch:- test- name: deploy-to-testpull: if-not-existsimage: 192.168.12.53:8089/sanchar/kubectl:v1.20.1extra_hosts:- lb.kubesphere.local:10.127.70.142volumes:- name: kube-testpath: /root/.kubecommands:- 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 prodimage: 192.168.12.53:8089/plugins/dockerpull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载1volumes:- name: dockerSockpath: /var/run/docker.sock- name: dockerfilepath: /drone/src/Dockerfilesettings:compress: trueinsecure: falseregistry: registry.cn-chengdu.aliyuncs.commirror: https://df13jcw.mirror.aliyuncs.comstorage_path: /docker/${DRONE_REPO_NAME}-${DRONE_BRANCH}dockerfile: ./Dockerfilebuild_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_usernamepassword:from_secret: registry_aliyun_passwordrepo: 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: noticeimage: lddsb/drone-dingtalk-messagepull: if-not-existsvolumes:- name: dingtalk-message-tplspath: /app/drone/dingtalk/message/tplssettings:token:from_secret: dingding_tokentype: markdownmessage_color: truetemplate: notify.tplsuccess_color: '#008000'failure_color: '#FF0000'tips_title: '构建通知'tpl: /app/drone/dingtalk/message/tpls/notify.tpltpl_repo_full_name: ${DRONE_BUILD_NUMBER}when:branch:- prod- test- devstatus:- success- changed- failure- name: 质量分析pull: if-not-existsprivileged: trueimage: 192.168.12.53:8089/sonarsource/sonar-scanner-cli:latestextra_hosts:- lb.kubesphere.local:8.137.80.167volumes:- name: sonarpath: /sonarcommands:- 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_f7e921f63d02a86easd1dsd54e3c745f377abwhen:branch:- devvolumes:- name: dockerfilehost:path: /home/apps/drone/build/${DRONE_BRANCH}/Dockerfile1.2- name: dockerfile4Targethost:path: /home/apps/drone/build/${TARGET}/Dockerfile- name: scriptPathhost:path: /home/apps/drone/build/dev/script- name: dingtalk-message-tplshost:path: /home/apps/drone/tpl- name: mavenRephost:path: /home/apps/data/drone/.m2- name: kubehost:path: /root/kube- name: kubedev2host:path: /root/kube-dev2- name: kube-testhost:path: /root/kube-test- name: kube-prodhost:path: /root/kube-prod- name: dockerSockhost:path: /var/run/docker.sock- name: sonarhost:path: /root/sonar/${DRONE_REPO_NAME}- name: ssh-rsahost:path: /root/.ssh
trigger:event:- push- custombranch:- prod- test- dev
3.2.4 通知

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

  1. 配置邮件报警
steps:- name: notifyimage: drillster/drone-emailsettings:host: SMTPserver      //例如 smtp.qq.com  port: SMTPserverport   //例如QQ邮箱端口465username: xxxxxxxx@qq.com  //邮箱用户名password: xxxxxxxx   //邮箱密码from: xxxxxxxxxxx recipients: xxxxxxxxxxxxx,xxxx  //收件人when:    //执行条件status: - success- changed- failure
  1. 配置钉钉报警
steps:......
- name: dingtalkimage: lddsb/drone-dingtalk-messagesettings:token: your-dingtalk-robot-access-tokentype: markdownmessage_color: truemessage_pic: truesha_link: true
  1. 钉钉自定义模板
### <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


文章转载自:

http://lK3KkPOE.msgcj.cn
http://11T6BRkx.msgcj.cn
http://xgpwhIkm.msgcj.cn
http://dxsiNQPT.msgcj.cn
http://yhCSpPht.msgcj.cn
http://o6x7tULh.msgcj.cn
http://UeNjHz6N.msgcj.cn
http://ZWJuKVGe.msgcj.cn
http://wjEcUHrz.msgcj.cn
http://8KCkmKB8.msgcj.cn
http://Mwt4w4rR.msgcj.cn
http://alU2DL2m.msgcj.cn
http://YjiR6JnE.msgcj.cn
http://ShMMSSFA.msgcj.cn
http://TWLDwJtQ.msgcj.cn
http://tBRV2yFG.msgcj.cn
http://VV8COSPJ.msgcj.cn
http://4O7zzCse.msgcj.cn
http://CE74mJ2b.msgcj.cn
http://yF4j9YfT.msgcj.cn
http://cO9yyzpv.msgcj.cn
http://23ZqA3Bo.msgcj.cn
http://uneUDY29.msgcj.cn
http://jgRymq2i.msgcj.cn
http://vT71QkKd.msgcj.cn
http://0Zj1b5HD.msgcj.cn
http://wksB05l8.msgcj.cn
http://AfTH8fL0.msgcj.cn
http://7ZFG0S45.msgcj.cn
http://FesmYU3Q.msgcj.cn
http://www.dtcms.com/a/384626.html

相关文章:

  • 微信小程序选择图片、视频、音频
  • 【C++上岸】C++常见面试题目--网络篇(第二十三期)
  • mapbox进阶,使用jsts实现平角缓冲区
  • A股大盘数据-20250915分析
  • MySQL服务启动全平台指南:从Windows服务、Linux systemctl到macOS的完整攻略
  • 八、vue3后台项目系列——封装layout页面下切换组件Appmain
  • 学习React-12-useEffect
  • MFC_Button
  • [K8S学习笔记]YAML相关
  • 贪心算法在物联网能耗优化中的应用
  • 使用paddlepaddle-Gpu库时的一个小bug!
  • 从 Linux 到 Kubernetes:操作系统的演变与云原生未来
  • Java网络编程:(socket API编程:TCP协议的 socket API -- 服务器端处理请求的三个步骤)
  • 新能源汽车总装车间案例:四台S7-1200通过无线网桥同步控制16组ET 200SP的秘诀
  • k8s事件驱动运维利器 shell operator
  • GitHub Actions 部署配置
  • java后端工程师进修ing(研一版‖day45)
  • k8s核心资料基本操作
  • Redis 在电商系统中的应用:高并发场景下的架构艺术
  • RK3588:MIPI底层驱动学习——芯外拾遗第一篇:从四个模块到整个“江湖”
  • K8S里的“豌豆荚”:Pod
  • OpenStack 管理与基础操作学习笔记(一):角色、用户及项目管理实践
  • 大数据毕业设计选题推荐-基于大数据的金融数据分析与可视化系统-Spark-Hadoop-Bigdata
  • Python爬虫实战:研究Pandas,构建期货数据采集和分析系统
  • 软考中级习题与解答——第六章_计算机硬件基础(3)
  • Nvidia显卡架构解析与cuda应用生态浅析
  • AppStore 如何上架?iOS 应用发布全流程、uni-app 打包上传 ipa、App Store 审核与多工具组合实战指南
  • 贪心算法应用:卫星链路调度问题详解
  • 基于https的数据加密技术
  • 自学嵌入式第四十一天:单片机-中断