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是基于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 通知
上面模板已经带了通知了,但是那个是我自定义了的通知,下面给两个默认的通知
- 配置邮件报警
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
- 配置钉钉报警
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
- 钉钉自定义模板
上文设置了通知模板的挂载路径因此需要新建对应的文件夹/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 | 分支名,例如 master、feature/login |
DRONE_TAG | Git 标签(如是 tag 构建时),否则为空 |
DRONE_COMMIT_SHA | Git 提交的完整 SHA 值(40位) |
DRONE_COMMIT_BEFORE | 上一次提交的 SHA 值 |
DRONE_COMMIT_AFTER | 当前提交的 SHA 值(同 DRONE_COMMIT_SHA) |
DRONE_COMMIT_REF | Git 引用,例如 refs/heads/main 或 refs/tags/v1.0 |
DRONE_COMMIT_BRANCH | 提交所在分支名,通常和 DRONE_BRANCH 一致 |
DRONE_COMMIT_AUTHOR | 提交人用户名 |
DRONE_COMMIT_AUTHOR_EMAIL | 提交人邮箱 |
DRONE_COMMIT_MESSAGE | 提交信息 |
DRONE_REMOTE_URL | Git 仓库地址 |
🚀 构建信息
| 变量名 | 说明 |
|---|---|
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 | 是否为私有仓库:true 或 false |
🧑💻 PR(Pull Request)信息(仅 PR 构建时)
| 变量名 | 说明 |
|---|---|
DRONE_PULL_REQUEST | PR 编号 |
DRONE_SOURCE_BRANCH | PR 的源分支 |
DRONE_TARGET_BRANCH | PR 的目标分支 |
🛠️ 系统与执行器信息
| 变量名 | 说明 |
|---|---|
DRONE_SYSTEM_HOST | Drone 服务器地址,例如 drone.example.com |
DRONE_SYSTEM_PROTO | 协议,http 或 https |
DRONE_RUNNER_NAME | 当前 Runner 名称 |
DRONE_RUNNER_OS | Runner 所在系统,例如 linux, windows |
DRONE_RUNNER_ARCH | Runner 架构,例如 amd64, arm64 |
DRONE_STAGE_NAME | 阶段名称(流水线 stage 名) |
DRONE_STAGE_KIND | 类型,例如 pipeline |
DRONE_STAGE_MACHINE | 构建所在主机名 |
DRONE_STEP_NAME | 步骤名称(step 名) |
🔐 Secret 示例变量(你手动配置的)
| 变量名 | 说明 |
|---|---|
DOCKER_USERNAME | Docker Hub/Harbor 用户名 |
DOCKER_PASSWORD | 登录密码 |
SSH_PASSWORD | SSH 远程部署密码 |
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”
本文来自博客园,作者:虞泽,转载请注明原文链接:https://www.cnblogs.com/yuze-blog/p/19285726

浙公网安备 33010602011771号