Drone CI:搭建自己CI/CD(一)

Drone CI 持续集成:多阶段流水线实践 流水线(Pipeline)是持续集成中的一个核心概念,它将软件构建、测试、部署等过程自动化,形成一条生产线。多阶段流水线则是将整个生产过程分为多个阶段,每个阶段完成特定的任务,从而提高整个过程的灵活性和可控性。Drone CI 是一个开源的持续集成工具,它使用 Go 语言编写,轻量级且易于扩展。Drone CI 支持多阶段流水线,使得开发者可以根据项目需求自定义构建、测试、部署等过程。本文详细阐述了 Drone CI 持续集成的多阶段流水线实践,从构建、测试和部署等方面进行了阐述。 阅读详情

CI篇:安装与配置

CI/CD简介

CI全称为Continuous Integration,意为持续集成,是在源代码变更后自动检测、拉取、构建和进行自动化测试的过程,属于开发人员的自动化流程。该解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题。其基本思路是,自动化监测代码仓库的变化并拉取最新代码、编译构建和自动化测试。CI的触发方式可分为以下三种:

  • 轮询:按一定的时间间隔反复询问代码仓库是否发生了变更,若发生了变更则开启CI流程
  • 定时:定期从代码仓库拉去最新代码并进行构建与测试,不必关心是否有变更发生
  • 推送:当代码仓库发生变更时,通过推送的方式(如webhook)通知CI进行任务,这需要CI环境被代码仓库访问到,因此需要一个外网可达地址

CD指的是持续交付(Continuous Delivery)或持续部署(Continuous Deployment)。持续交付通常是指开发人员对应用的更改会自动进行错误测试并上传到存储库(如 GitHub 或容器注册表),然后由运维团队将其部署到实时生产环境中。持续部署指的是自动将开发人员的更改从存储库发布到生产环境,它以持续交付为基础,实现了管道后续阶段的自动化。

CI/CD 既可能仅指持续集成和持续交付构成的关联环节,也可以指持续集成、持续交付和持续部署这三项构成的关联环节。

请参考:redhat:什么是CI/CD

Drone CI简介

Drone CI官网说:

Drone is a self-service Continuous Delivery platform for busy development teams.

相对于常见的Jenkins,选中 Drone的原因在于它非常简洁,不像Jenkins那样复杂,同时它拥有可以满足基本需求的能力,并且提供了许多实用的插件,如GitHub,Email,helm,微信,钉钉等

需要注意的是,drone 0.8版本和0.1版本差别较大,本文使用1.0版本

安装Drone CI - GitHub

drone文档给出了相对于不同git仓库和部署方式的方案,支持的git仓库有:

在这里插入图片描述

拿github来说,drone提供了以下部署方式:

在这里插入图片描述

本节给出对于GitHub的单机部署方案,对官方部署方案做了docker-compose方案的补充

设置GitHub OAuth Application

  • 登陆你的github账户,在右上角点击个人头像,选择Setting,选择Developer settings,选择OAuth Application,选择新建一个application,如下图:

在这里插入图片描述

  • HomePage是DroneCI的访问地址,若是Drone由本地部署,那就可以设置为http://127.0.0.1
  • Authorization callback URL是DoneCI的登陆地址,格式必须是{{HomePage}}/login,如http://127.0.0.1/login
  • 创建成功以后,拿到Client ID和Client Secret
    在这里插入图片描述

下载安装docker和docker-compose

Docker安装文档

下载drone docker

docker pull drone/drone:1.0.0-rc.6

启动drone server

  • docker 启动:

    docker run \
      --volume=/var/run/docker.sock:/var/run/docker.sock \
      --volume=/var/lib/drone:/data \
      --env=DRONE_GITHUB_SERVER=https://github.com \
      --env=DRONE_GITHUB_CLIENT_ID={% your-github-client-id %} \
      --env=DRONE_GITHUB_CLIENT_SECRET={% your-github-client-secret %} \
      --env=DRONE_RUNNER_CAPACITY=2 \
      --env=DRONE_SERVER_HOST={% your-drone-server-host %} \
      --env=DRONE_SERVER_PROTO={% your-drone-server-protocol %} \
      --env=DRONE_TLS_AUTOCERT=true \
      --publish=80:80 \
      --publish=443:443 \
      --restart=always \
      --detach=true \
      --name=drone \
      drone/drone:1.0.0-rc.6
    
  • docker-compse 启动
    上面的启动命令是drone官方文档的方案,下面给出我使用的docker compose的方法

    1. 创建.env文件,这是docker-compose启动时默认读取的文件,用来设置环境变量
    
    DRONE_SERVER_HOST=127.0.0.1
    DRONE_GITHUB_CLIENT_ID=XXXXXXXXXXXXXX
    DRONE_GITHUB_CLIENT_SECRET=XXXXXXXXXX
    DRONE_SERVER_PROTO=http
    DRONE_SECRET_SECRET=ci-drone
    
    
    1. 创建docker-compose.yml文件
    # drone server 部署
    version: "2"
    
    services:
      drone-server:
        image: drone/drone:1.0.0-rc.6
        ports:
          - 80:80
          - 443:443
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /var/lib/drone:/data
        restart: always
        environment:
          - DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}
          - DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}
          - DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO}
          - DRONE_SERVER_HOST=${DRONE_SERVER_HOST}
          - DRONE_TLS_AUTOCERT=false
          - DRONE_RUNNER_CAPACITY=8
          - DRONE_DEBUG=false
          - DRONE_LOGS_DEBUG=false
          - DRONE_GIT_ALWAYS_AUTH=false
          - DRONE_SECRET_SECRET=${DRONE_SECRET_SECRET}
    
    
    1. drone配置项说明
    • DRONE_GITHUB_CLIENT_ID: 在Github中创建OAuth Application时生成的Client ID
    • DRONE_GITHUB_CLIENT_SECRET: 在Github中创建OAuth Application时生成的Client Secret
    • DRONE_SERVER_PROTO: Drone提供服务的prototype,可选为http或https
    • DRONE_SERVER_HOST: Drone的server地址,设置为127.0.0.1作为本地地址,也可以设置为外部可访问的域名或IP地址
    • DRONE_TLS_AUTOCERT: 设置是否自动开启安全传输层协议,若设置为true,那么drone server proto会设置为使用https,DRONE_SERVER_PROTO设置为http也是无效
    • DRONE_RUNNER_CAPACITY: drone提供服务的最大并行度
    • DRONE_SECRET_SECRET: 可自由设置
    • Drone用到的端口号有:80和443
    1. 启动服务
      docker-compose up
    

    或者通过后台的方式运行:

      docker-compose up -d
    

配置CI仓库

  • 通过浏览器访问:http://127.0.0.1 ,浏览器会重定向到github登陆认证页面
    在这里插入图片描述

使用github账户登陆之后,浏览器被重定向回drone,并被授权访问你的github仓库
在这里插入图片描述

  • 选中你要配置的仓库,点击ACTIVATE按钮,进入SETTINGS卡片,点击ACTIVATE按钮开启这个仓库.开启之后可以设置CI任务的基本配置。用过jenkins的人会发现,这个页面显然简洁一点。
    此时,github仓库中会添加一条webhook地址,当github仓库发生改变时会通过webhook通知drone server。
    不过,问题是这个webhook地址是DRONE_SERVER_HOST,如果配置为127.0.0.1或外网不可达时,这个webhook地址github是访问不到的。不过这不影响Cron Job的触发。

  • 配置里面有四个主要选项

    • Main: 主要配置

      • Project settings:设置是否开启仓库保护,若开启,那么每次触发CI自动编译都需要仓库管理员手动确认
      • Project visibilty:设置仓库可见性,因为你设置的host地址所有人都可以访问到,并通过自己的github账户登陆,可见性可以保护你的仓库
      • Configuration:设置CI任务的yaml配置文件,这里面制定了CI的所有流程,一般放在仓库根目录下,名为.drone.yaml,稍后会详细说明
        在这里插入图片描述
    • Secrets:
      如Drone Secret文档中所说,不方便明文存储到代码仓库里的密码值,可以通过Repository Secrets,Encrypted Secrets和External Secrets来存储
      这里的Secrets设置可以指定Repository Secrets,在Secret Name中指定密码名称,Secret Value中设置该值。Allow Pull Requests是指,当是pull_request请求时这个密钥是否可被使用,因为其他人可能会通过pull request来触发CI,造成安全隐患。
      在这里插入图片描述
      在.drone.yaml中可以通过from_secret引用,如下面的username和password

      kind: pipeline
      name: default
      
      steps:
      - name: build
        image: alpine
        environment:
          USERNAME:
            from_secret: username
          PASSWORD:
            from_secret: password
      
    • Cron Jobs:定时任务
      这里可以通过任务名称,分支名称和时间指定定期的CI任务。前文提到,CI触发有三种规则轮询,定期和推送。
      注:但这里的定期任务稍微有点怪,cron job的执行逻辑是定期触发一次检查,事件是指定分支的最后一次事件,执行的pipline会验证trigger规则,不像是通常说的定期任务,也不能说是轮询,因为轮询是监测是否有新事件。

    • Badges:编译状态图标
      这里提供了CI运行的状态图标,可以放到Git仓库里作为编译状态。不过Drone server的地址就不能简单的设置为127.0.0.1了,因为Github访问不到,需要一个外网IP或域名

.drone.yaml文件声明CI过程

Drone通过Pipline的方式来声明CI的执行过程,如文档所示。

kind: pipeline
name: api
steps:
  # api unit test
  - name: api-test
    image: node:11
    depends_on: [clone]
    commands:
      - cd ./api/
      - npm install --registry https://registry.npm.taobao.org
      - cd ./dgc_sdk && npm install --production
      - cd .. && npm run test

  # web lint
  - name: web-lint
    image: node:10.15.1
    depends_on: [clone]
    commands:
      - cd ./web
      - npm install --registry https://registry.npm.taobao.org
      - npm run lint

trigger:
  branch:
    - master
  event:
    - pull_request
    - push

---
# stream test
kind: pipeline
name: stream
steps:
  - name: stream test
    image: ccr.ccs.tencentyun.com/star/stream-test-base
    commands:
      - echo 'Hello!'

trigger:
  branch:
    - stream
  event:
    - pull_request

  • steps指定CI执行的步骤,默认pipline或创建一个叫做clone的步骤,它是从git仓库克隆代码大步骤

  • 多个step之间可以通过depends_on来指定执行顺序,比如先clone,后build,然后deploy

  • 同一个pipline下的多steps之间默认是串行的,实现方式应该是下面的stepdepends_on紧邻的上一个step

  • 多pipline之间是并行的,同一个yaml文件里使用---分割多个pipline的定义

  • triggers是指在什么情况下才会执行ICI任务,比如只对master分支的pull request和push事件触发

  • 在每一个step中,可以通过Conditions来指定在CI过程中是否执行该step,通过when关键字指定。trriger是指定pipline何时被执行,condition指定pipline中的step是否被执行,如:

    kind: pipeline
    name: default
    
    steps:
    - name: build
      image: golang
      commands:
      - go build
      - go test
      when:
        branch:
        - master
        - feature/*
    

配置完成

  • 若是配置了Cron Job,那到到该时间点时,会触发CI的任务,此时pipline中的trigger规则会失效
  • 配置Drone CI之后,Github的check功能也会被启用,对每一次event都会监控CI的状态

注:

  • 使用Drone 1.0,与0.8版本差异较大
  • 当刚绑定仓库之后,Drone无法手动触发CI
  • 当trigger中指定event为pull_request时,使用的分支为target branch;当trigger中指定event为tag时,指定的branch规则是无效的
  • Project settings设置为Protected后,每次CI任务都要手动确定
  • 关于gitlab、私有 docker 镜像、dns设置,在下一篇继续说

参考链接:

基于Drone实现CI/CD【0到1架构系列】 CI/CD是持续性集成和持续性部署,简单来讲就是自动化构建和自动化部署。目前有很多集成方案,也有很多组装方案,只要能实现自动化构建出制品,再自动部署到生产环境就行。目前很多源代码都集成了CI/CD功能,drone也是目前比较流行的一个方案,简单易用,高性能。 阅读详情

相关推荐

Docker 配置 Gitea + Drone 搭建 CI/CD 平台

首先使用 docker 搭建 Gitea 服务器,用于管理代码版本,数据库选择mysqlGitea 服务器的运行前先去数据库服务器中新建一个名为 gitea 的数据库编写完成后在当前目录下运行即可运行 docker 容器。

Gettler的博客 2899

基于码云Gitee + Drone CI搭建轻量级CI/CD自动构建平台(Jenkins替代方案)

基于码云Gitee + Drone CI搭建轻量级CI/CD自动构建平台,可以是Jenkins替代方案,相较于Jenkins更轻量

kramer_1711的博客 5938

在CentOS7上安装Drone搭建CI持续集成环境

文章目录在CentOS7上安装Drone从GitHub拉取代码自动构建前言安装前规划安装过程配置域名解析安装Docker拉取Drone Server镜像添加GitHub OAuth Application生产Drone RPC secret启动Drone Server配置Nginx反向代理到Drone Server为Drone站点配置HTTPS测试Drone Server安装和运行Drone Runner激活项目测试Drone Pipeline测试Drone Pipeline for Java在生产上安装D

锐意工作室 2709

探索前沿技术:Drone CI/CD 平台

在软件开发中,持续集成和持续部署(CI/CD)是加速交付高质量代码的关键流程。今天,我们要推荐一个强大的开源工具——Drone,它是一个云原生的持续集成和持续部署平台,旨在简化自动化构建、测试和发布的过程。 ## 项目简介 Drone 是由 Cesar Ferreira 创建的一个用 Go 语言编写的 CI/CD 系统。它的设计目标是提供一个轻量级、高度可配置且易于使用的解决方案。通过与 Gi

gitblog_00066的博客 1135

Gogs+Drone搭建CI/CD平台过程

Gogs 是由 Go 语言编写的 Git 服务器,由中国人主导开发的一款开源项目,搭建方便并且拥有完善的中文文档,配合 Drone 可以实现持续集成/持续部署。本文介绍如何通过 Docker 搭建 Gogs+Drone 环境。 环境 MacOS Docker && docker-compose 部署 创建目录(不是必须的,可以放在任何目录里面) mkdir cicd cd cicd mkdir gogs drone # 存放相关数据 编写 docker-compose.yaml

qq_15273019的博客 1458

Gogs+Drone持续集成(CI/CD)入坑详细指南

背景 近期在公司内部部署CI/CD平台, 经过比较Jenkins和Drone, 基于Drone的优点最终选择了Drone. 一开始也尝试使用docker部署Jenkins, 部署过程中下载插件失败(估计是伟大的墙的原因), 最后直接放弃并尝试部署Drone. 没想到搜遍全网, 相关资料甚少, 能用的drone版本也很老旧. 随后只能一步步看官方文档进行部署, 但是部署过程中发现官方文档也写得不明不白, 遇到了一堆坑. 最后解决问题, 特此记录下来, 供大家参考. 官方文档是使用docker的方式安装, 网上

魂影魔宅 8061

基于drone构建CI-CD系统

基于drone构建CI-CD系统

github_35614077的博客 2747

Gitea 与 Drone 集成实践:完全基于 Docker 搭建的轻量级 CI/CD 系统

Drone 是一个使用 Go 语言编写的自助式的持续集成平台,和 Gitea 一样可以完全基于容器部署,轻松扩展流水线规模。开发者只需要将持续集成过程通过简单的 YAML 语法写入 Gitea 仓库目录下的描述文件.drone.yml就可以完成 CI/CD 配置。下面,我们以gitea.com服务器为例,搭建一套使用 Gitea 与 Drone 的 CI/CD 系统。

Gitea的博客 1749

嘿,我用Drone做CI

基于Drone来做CI/CD,个人感觉真的很棒,相对于业界老大哥jekins,我更喜欢drone,相比较而言,我觉得它主要有以下优势 插件不需要额外管理 基于yaml文件,易编写,配置可以进行版本管理 可以根据不同的条件进行构建 更人性化的UI界面 对于我们后端的java项目而言,我们CI要做什么呢? 一般提交代码流程如下 Clone 项目到本地,创建一个分支来完成新功能的开发, git...

zy353003874的博客 1428

CI/CD 工具深度评测:Jenkins、GitLab CI、Buildbot、Drone 和 Concourse 的实战对比

本文深度评测了五大主流CI/CD工具(Jenkins、GitLab CI、Buildbot、Drone和Concourse)的实战表现,从技术栈匹配度、学习曲线、扩展性等核心维度进行对比分析。针对不同团队规模和技术需求,提供了详细的选型建议和配置示例,帮助开发者选择最适合的持续集成与交付解决方案。

weixin_29310631的博客 614

手把手带你搭建CI/CD工作流

持续集成(ContinousIntergration,CI)是在源代码变更后自动检测、拉取、构建和进行自动化测试的过程,属于开发人员的自动化流程。该解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题。其基本思路是,自动化监测代码仓库的变化并拉取最新代码、编译构建和自动化测试。轮询:按一定的时间间隔反复询问代码仓库是否发生了变更,若发生了变更则开启CI流程定时:定期从代码仓库拉去最新代码并进行构建与测试,不必关心是否有变更发生。

技术与业务融合思维 1659

Drone CI/CD系列(一)——docker安装与配置

Drone作为新一代的CICD的平台,不仅高颜值,可与docker和k8s无缝衔接,且可配置目前主流git平台进行联动,实现git push打包部署,和界面一键部署各种语言的功能,下面本文就来介绍一下,如何使用docker来安装和部署Drone!

Juinjonn的博客 5709

基于Drone+Gogs流水线-全面认识轻量级云原生CI引擎Drone

1. 介绍 Drone by Harness™ 是一个基于Docker容器技术的可扩展的持续集成引擎,用于自动化测试、构建、发布。每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构建环境并保证隔离。开发者只需在项目中包含 .drone.yml文件,将代码推送到 git 仓库,Drone就能够自动化的进行编译、测试、发布。可以与Docker完美集成。 docs.drone.io/ 特点 Drone引入了Pipelnes的概念,管道可帮助我们自动化软件交付过程中的步骤,例如启动代码构建

DevOps在路上|专注于团队研发效能,欢迎来到我的博客,这里有来自一线DevOps实践者的知识分享 2318

从零开始:Drone CI/CD 的实战指南

本文是一份从零开始的Drone CI/CD实战指南,详细介绍了如何安装、配置和使用这一轻量级自动化工具。文章深入解析了Drone的核心组件与工作原理,并通过一个完整的Node.js项目示例,手把手教你编写.drone.yml流水线,实现从代码测试、Docker镜像构建到自动化部署的全流程,帮助开发者显著提升部署效率与可靠性。

blue的专栏 1002

Golang + Drone CI 实战:打造轻量级自动化部署系统

在当今软件开发领域,自动化部署已经成为提高开发效率、保证软件质量的关键环节。本项目的目的是利用 Golang 强大的并发性能和高效的编译速度,结合 Drone CI 灵活的持续集成和持续部署(CI/CD)能力,打造一个轻量级的自动化部署系统。该系统将涵盖从代码提交、构建、测试到部署的整个流程,适用于各类基于 Golang 的项目,无论是小型的个人项目还是大型的企业级应用。本文将按照以下结构进行组织:首先介绍核心概念和它们之间的联系,让读者对 Golang 和 Drone CI 有一个清晰的认识;

AI Agent Harness Engineering 1377

告别测序污染:手把手教你用Decontam+SCRUB+FEAST完成微生物组数据清洗全流程

本文详细解析了使用Decontam、SCRUB和FEAST三大工具完成微生物组数据清洗的全流程。从环境准备、数据导入到污染物识别、样本间污染校正及溯源分析,提供了一套可复用的污染校正工作流,帮助研究者提升数据质量,确保后续分析的可靠性。

weixin_33462927的博客 316

轻量快速的CI工具Drone快速入门

前言 公司之前一直在使用 Jenkins 作为 CI/CD 工具, Jenkins 非常强大,它完成了几乎所有 CI/CD 的工作,并且应用于整个团队有好长一段时间了。但是随着公司推荐数字化、智慧化,以及服务容器化的推进, Jenkins 的一些弊端也凸显了出来: 重量级: Jenkins ...

chihujiang3132的博客 3659

从DeepMimic到虚拟偶像:用动作捕捉数据训练AI跳舞的完整流程(附Blender插件配置)

本文详细介绍了如何利用DeepMimic的深度强化学习框架,将动作捕捉数据转化为虚拟偶像或游戏角色的舞蹈动作。从核心的模仿学习理念、PyBullet环境搭建、策略网络与奖励函数设计,到数据处理、训练技巧(如参考状态初始化),最后讲解了如何将训练好的AI模型集成到Blender和Unity等工具中,实现从数据到实时驱动角色的完整流程。

weixin_29054399的博客 501

Python基于Drone的CI-CD(代码检查、测试、构建、部署)实践

Python基于Drone的CI-CD(代码检查、测试、构建、部署)实践 一、CI/CD 服务器环境配置 1. CI/CD 工具列表 容器服务:安装 docker、docker-compose Drone服务器: 安装配置 drone 代码检查服务器:安装配置 SonarQube 2. 基于Docker的Drone和SonarQube安装...

那些年踩过的坑丶 6349

自监督学习与上下文赌博机融合:视觉决策中的协同优化与实战指南

在机器学习领域,自监督学习(Self-Supervised Learning)通过设计前置任务从无标注数据中学习通用表征,已成为解决标注数据稀缺问题的关键技术。其核心原理是利用数据自身的结构生成监督信号,训练编码器提取鲁棒特征。上下文赌博机(Contextual Bandits)作为强化学习的简化分支,专注于在给定上下文信息下做出单步最优决策,平衡探索与利用,广泛应用于推荐系统、广告投放等场景。将两者结合,构建端到端的协同训练框架,能让视觉表征的优化直接服务于最终的决策目标,同时利用自监督任务作为正则化项提

weixin_33721344的博客 516

RK3568 开发实战:手动构建 Linux 4.19 内核镜像与设备树优化

本文详细介绍了为RK3568开发板手动编译Linux 4.19内核的完整实战流程。从环境搭建、源码获取、内核配置,到设备树深度定制与优化,再到镜像打包与烧写,旨在帮助开发者脱离官方SDK依赖,实现对嵌入式Linux系统的完全掌控,提升硬件适配与性能优化能力。

weixin_29175469的博客 269

可替代 Jenkins:Drone 进一步简化 CI/CD

创建一家成功的软件公司需要什么?交付有价值的软件并快速交付的能力。我们如何保证这种高速服务?持续交付 (CD) 流程,由完善的持续集成 (CI) 机制支持,以提供完美交付,尤其是当平台组件的数量和依赖性增加时。这张图片完美地总结了良性 CI/CD 循环,任何都应该将其贴在办公桌上:在本文中,我们将关注循环的左侧,即产品从代码到测试的过程。使用源代码时,git 是唯一的选择。事实上,在 BOOM,我们使用来管理代码生命周期(但 git 选项还包括 Gitea 或 Bitbucket)。

2301_77645750的博客 1234

纳米尺度仿真软件:GROMACS_(3).分子动力学模拟原理

分子动力学(MD)模拟是一种强大的计算方法,通过数值积分牛顿运动方程,追踪粒子在时间上的位置和速度变化,提供关于体系动力学行为的详细信息。选择合适的力场、设置初始条件、应用边界条件、控制温度和压力、选择合适的时间步长、计算能量和力,是 MD 模拟的关键步骤。通过这些步骤,可以对各种化学、生物和材料体系进行模拟和分析,揭示其结构、动力学和热力学性质。高级应用如反应路径模拟和蛋白质折叠研究,进一步扩展了 MD 模拟的应用范围。

kkchenjj的博客 1100
上一篇: ASP.NET MVC 5 (八) Visual Studio单元测试
下一篇: 个人在用并且强烈推荐的 mac OS 工具软件们
DoongBo
博客等级 码龄10年 25粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值