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 通知
上面模板已经带了通知了,但是那个是我自定义了的通知,下面给两个默认的通知
- 配置邮件报警
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
- 配置钉钉报警
steps:......
- name: dingtalkimage: lddsb/drone-dingtalk-messagesettings:token: your-dingtalk-robot-access-tokentype: markdownmessage_color: truemessage_pic: truesha_link: true
- 钉钉自定义模板
### <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