# Drone CI - 自动化部署 Drone CI 是一款流行的开源持续集成工具,它能够帮助团队自动化构建、测试和部署软件项目。本文将介绍 Drone CI 的安装、基础用法以及常用插件。 ![](https://oss.aqzscn.cn//resource/blog/img/2023/09c8a0857087561a890c8650db9670f3.png) :::caution **Drone CI 需要配合版本控制工具使用**,Github 或 Gitee 都可以,如果是自部署的,推荐使用 `Gitea`,相比 `gogs` 拥有更多功能,如镜像仓库。 ::: ## 安装 Drone CI Drone CI 可以通过 Docker 镜像进行安装。不过首先我们需要做一点准备工作,这里以 Gitea 为例,需要在 **设置 - 应用** 中为 Drone CI 创建一个客户端,并把重定向 URI 指向 Drone CI 的登录地址,假设 Drone CI 的首页是 `https://droneci.aqzscn.cn/` 的话,它的登录地址应该是这样的:`https://droneci.aqzscn.cn/login`。 :::info 重定向地址一定要确保正确配置,否则将登录失败。 ::: ![](https://oss.aqzscn.cn//resource/blog/img/2023/2f2f7fcb484d89d3c81429c454bf68e9.png) 接下来,以 docker-compose 为例,对以下配置的高亮部分按自己的需求调整即可。 ```yaml title="docker-compose.yaml" version: '3' services: drone-server: image: drone/drone:latest container_name: drone-server ports: # 端口映射,左侧是宿主机端口,右侧是容器端口 # highlight-next-line - 8080:80 volumes: # 注意,此处需要在 docker-compose.yaml 同目录下创建名为 data 的目录,用于保存 drone 的数据 - ./data:/var/lib/drone/ - /var/run/docker.sock:/var/run/docker.sock restart: always environment: - DRONE_OPEN=true - DRONE_LOGS_TRACE=true - DRONE_LOGS_DEBUG=true # highlight-start - DRONE_SERVER_HOST=droneci.aqzscn.cn - DRONE_SERVER_PROTO=https - DRONE_GITEA_CLIENT_ID=inputyourclientid - DRONE_GITEA_CLIENT_SECRET=inputyourclientsecret # 注意,此处的密钥可通过 openssl rand -hex 16 命令随机生成一个,需要与下方 Runner 的配置相同 - DRONE_RPC_SECRET=generateyourrpcsecret - DRONE_GITEA_SERVER=http://192.168.121.49:6060/ # highlight-end drone-runner: image: drone/drone-runner-docker:latest container_name: drone-runner restart: always environment: # highlight-start - DRONE_RPC_HOST=droneci.aqzscn.cn - DRONE_RPC_PROTO=https - DRONE_RPC_SECRET=generateyourrpcsecret # highlight-end - DRONE_RUNNER_NAME=my-runner - DRONE_RUNNER_CAPACITY=2 ports: - 8081:3000 volumes: - /var/run/docker.sock:/var/run/docker.sock ``` 接着执行命令 `docker-compose up -d` 即可启动配置的两个容器。 :::caution 如果你使用的版本控制工具不是 Gitea,可从[官方文档](https://docs.drone.io/)或其他人的教程中找到对应的安装方法。 ::: ## 基础使用 安装完成后,我们可以访问 Drone CI 的 Web 界面,并通过 Gitea 账号登录。 ![](https://oss.aqzscn.cn//resource/blog/img/2023/3fb9205df41e348597ef1941648a719d.png) 默认的存储库都是没有开启自动构建流程的,需要先选中存储库,点击激活按钮。 ![](https://oss.aqzscn.cn//resource/blog/img/2023/4d78ad407897b25a8a80a4806d3e74f5.png) 这个操作的目的是在 Gitea 对应的存储库创建了一个 WebHook 钩子,一旦存储库有了变更,就会发送一个 POST 请求通知 Drone CI,这样 Drone CI 就可以根据配置执行后续的自动化流程了。 ![](https://oss.aqzscn.cn//resource/blog/img/2023/87172b757ea8928c9a0919e65ef25b76.png) Drone CI 的配置文件需要放在存储库的根目录,并以 `.drone.yml` 命名。 下面以我制作的某个 Webpack 项目为例,介绍一下较为基础的配置: ```yaml title=".drone.yml" kind: pipeline type: docker name: default # 每次执行自动化构建,都会重新拉取一遍代码,指定 depth=1 在仓库提交次数特别多时会非常有用,能大大减少拉取代码的时间 clone: depth: 1 # 具体构建流程,每个步骤要以一个容器为载体,Drone CI 的插件本质上也是一个容器 steps: # 步骤名称,可以自定义,需要注意的是,每个步骤虽然容器不同,但所处的工作目录是同一个 - name: build # 拉取镜像的时机,选择不存在时拉取能减少构建时间 pull: if-not-exists # 镜像名称 image: node:latest commands: # 待执行的脚本命令列表 - export NODE_OPTIONS="--max-old-space-size=4096" - npm config set registry https://registry.npmmirror.com - npm install - npm run build - cp -r build/ live-release/ - ls -al live-release - name: upload pull: if-not-exists image: appleboy/drone-scp settings: host: # highlight-next-line from_secret: host username: # highlight-next-line from_secret: username password: # highlight-next-line from_secret: password port: 22 target: /usr/share/nginx/html source: live-release/* - name: deploy pull: if-not-exists image: appleboy/drone-ssh settings: host: # highlight-next-line from_secret: host username: # highlight-next-line from_secret: username password: # highlight-next-line from_secret: password port: 22 script: - cd /usr/share/nginx/html/ - rm -rf live - echo "delete success" - mv live-release live - echo "deploy success" ``` 在上述配置文件中,我们定义了一个 pipeline,包含三个步骤:build、upload 和 deploy。每个步骤都可以指定要使用的镜像和运行的命令。 因为是 webpack 项目,所以打包的镜像选择了 node,后面两步上传和发布则是专为 Drone CI 构建的镜像,用于文件上传和连接 SSH。 > 另外还有很多 Drone CI 的插件,可以在 [https://plugins.drone.io/](https://plugins.drone.io/) 查找。 其中有个参数 `from_secret` 有点特殊,填的值是在 Drone CI Web 页面配置的密钥名,作用是让配置文件脱敏。 ![](https://oss.aqzscn.cn//resource/blog/img/2023/4c39e4faba2999ae2c02add0ea61a5c2.png) 配置 Secret 的时候建议直接配置在**组织**下面,这样不同项目可以使用同一套配置,不用再额外配置。 以上步骤做好之后,提交并推送代码,Drone CI 就会收到代码库变动的通知,从而根据项目根目录下的 `.drone.yml` 进行一次构建。 刚开始写的流水线配置文件或多或少都会有些问题,耐心查看运行日志并修改,最后总能成功的。 ![](https://oss.aqzscn.cn//resource/blog/img/2023/46f3eaa7939e795ebbd8b1aba0454d83.png) ## 结语 Drone CI 是一款功能强大的持续集成工具,支持多种语言和框架,以及许多高级用法和插件。类似的持续集成工具其实还有很多选择,如 Gitlab 和 Jerkins。 Gitlab 基本上涵盖了代码开发所需的一切功能,但缺点就是占用内存过高,个人的服务器不适合使用这个,而且如果要使用全部功能,还需要花钱购买。 :::note 自己在群晖上尝试部署过 Gitlab,几乎吃了我快 4 个 G 的内存,这样我就没有富裕的内存去应对一些突发的计算任务了。 ::: Jenkins 则是一个历史比较久的工具,积累了种类繁多的插件可供开发者使用,但还是那个问题,它是用 Java 编写的,内存占用较多。 而 Drone CI 是用 GO 语言编写的,空闲时基本不占用内存,很适合个人部署使用,而且网页 UI 也很现代化,看着就很舒服。所以这就是我最后选择 Drone CI 搭配 Gitea 进行持续集成的原因,希望对你也有所帮助。