未完待续!
目的是为了实现hexo博客的自动部署, 每次push完之后, 触发drone ci自动进行部署。
选用drone的原因还是因为轻量, 且功能够用,如果用其他的CI工具,比如jenkins,我这小小的VPS部署服务一多,就扛不住了。
本文中drone是和gitea进行集成的, 如果要和其他仓库集成, 参考官方文档即可:https://docs.drone.io/
部署服务还是通过docker来进行。
准备工作
登录gitea, 进入设置->应用, 新建一个给drone用的OAuth2授权

注意, 重定向URI(Redirect URI)是你的drone服务的域名加上login。
生成授权之后, 会得到一个客户端ID和客户端秘钥, 记下来, 后面会用到。
drone搭建
本文在部署的时候, 是将drone和gitea进行集成, 
drone的服务分为两部分:
- drone-server
- drone-runner-docker
本人将这两个服务都部署在同一个docker-compose.yml中,同时数据库还是连接的一个单独的mysql容器服务,所以需要先创建数据库, 命令如下:
| 1
 | create database drone default character set utf8mb4 collate utf8mb4_unicode_ci;
 | 
下面是docker-compose.yml文件, 其中db-net就是一个包含mariadb容器的docker网络, 具体创建过程见另外一篇博客:个人博客工具搭建。各个参数见说明。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 
 | version: "3"networks:
 db-net:
 external: true
 services:
 drone-server:
 image: drone/drone:2.12.1
 container_name: drone-server
 restart: always
 networks:
 db-net:
 aliases:
 - drone
 ports:
 - "6340:80"
 volumes:
 - ${PWD}/data:/data
 - /var/run/docker.sock:/var/run/docker.sock
 environment:
 - TZ=Asia/Shanghai
 - DRONE_SERVER_HOST=drone服务的域名
 - DRONE_SERVER_PROTO=https
 - DRONE_RPC_SECRET=自已生成的一个随机字符串即可
 - DRONE_GITEA_CLIENT_ID=之前在gitea上生成的客户端ID
 - DRONE_GITEA_CLIENT_SECRET=之前在gitea上生成的客户端密钥
 - DRONE_GITEA_SERVER=gite的地址
 - DRONE_DATABASE_DATASOURCE=数据库连接地址,格式 username:password@tcp(host:port)/drone
 - DRONE_DATABASE_DRIVER=mysql
 - DRONE_USER_CREATE=username:sobriver,admin:true
 
 drone-runner-docker:
 image: drone/drone-runner-docker:1.8.2
 container_name: drone-runner-docker
 restart: always
 depends_on:
 - drone-server
 volumes:
 - /var/run/docker.sock:/var/run/docker.sock
 environment:
 - TZ=Asia/Shanghai
 - DRONE_RPC_HOST=drone服务的域名
 - DRONE_RPC_PROTO=https
 - DRONE_RPC_SECRET=自已生成的一个随机字符串即可,和server的要一样
 - DRONE_RUNNER_CAPACITY=2
 - DRONE_RUNNER_NAME=docker-runner
 
 | 
nginx配置
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | server {listen 443 ssl;
 server_name 你的域名
 charset utf-8;
 ssl_certificate   域名pem文件;
 ssl_certificate_key 域名key文件;
 ssl_session_timeout 5m;
 ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers on;
 location / {
 proxy_pass http://localhost:6340;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto $scheme;
 }
 }
 
 | 
服务启动之后,打开登录页面, 会自动跳转到gitea的登录, 登录成功之后, 对应于相应的仓库, 激活即可。
.drone.yml文件编写
此处实现当我们写完一篇文章,push到远程之后,自动触发hexo的构建,并将构建完成之后的文件移动到博客文件目录。
在项目的根目录下创建.drone.yml文件, 内容如下:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 
 | kind: pipelinetype: docker
 name: blog-job
 steps:
 - name: Hexo Build
 image: node:12-alpine
 commands:
 - npm install hexo-cli -g
 - npm install hexo-generator-sitemap --save
 - npm install hexo-generator-baidu-sitemap --save
 - npm install
 - hexo clean
 - hexo g
 - name: Origin File Clean
 image: appleboy/drone-ssh
 settings:
 host:
 from_secret: SSH_HOST
 port:
 from_secret: SSH_PORT
 username:
 from_secret: SSH_USERNAME
 password:
 from_secret: SSH_PASSWORD
 script:
 - rm -rf /blog/public/*
 - name: SCP File Transfer
 image: appleboy/drone-scp
 settings:
 target: /blog
 source: ./public
 host:
 from_secret: SSH_HOST
 port:
 from_secret: SSH_PORT
 username:
 from_secret: SSH_USERNAME
 password:
 from_secret: SSH_PASSWORD
 rm: true
 
 trigger:
 event:
 - push
 
 | 
说一下几个步骤含义:
- Hexo Build  使用hexo构建文件
- Origin File Clean  清除原先文件, 此处设置的构建文件的存储路径为/blog/public/
- SCP File Transfer 将构建完的文件移动到指定目录
其中from_secret的值是利用drone的secret来新建的,如下图所示:

几个值含义如下:
- SSH_HOST  远程登录主机的IP
- SSH_PORT 远程登录端口
- SSH_USERNAME  远程登录用户名
- SSH_PASSWORD 远程登录密码
参考资料:
- https://docs.drone.io/server/provider/gitea/
- https://www.qikqiak.com/post/drone-with-k8s-2/